diff --git a/.gitignore b/.gitignore
index 784627b616..f3fa30f3e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+*/bin/*
+
*.class
# Package Files #
diff --git a/.travis.yml b/.travis.yml
index 6063fbf3e5..bcff16f5f1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,6 +1,9 @@
language: java
-install: travis_wait 40 mvn -q clean install -Dgib.enabled=true
+install: travis_wait 60 mvn -q test
+
+before_script:
+ - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:-UseGCOverheadLimit'" > ~/.mavenrc
jdk:
- oraclejdk8
@@ -15,9 +18,4 @@ cache:
- .autoconf
- $HOME/.m2
- sudo: required
-
- env:
- global:
- JAVA_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"
- MAVEN_OPTS="-Xmx2048M -Xss128M -XX:MaxPermSize=2048M -XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC"
+
diff --git a/algorithms/pom.xml b/algorithms/pom.xml
index 46a2b9d897..529af19686 100644
--- a/algorithms/pom.xml
+++ b/algorithms/pom.xml
@@ -10,9 +10,15 @@
3.6.0
1.5.0
1.16.12
+ 3.6.1
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
junit
junit
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
new file mode 100644
index 0000000000..bd4708b661
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
@@ -0,0 +1,13 @@
+package com.baeldung.algorithms.primechecker;
+
+import java.math.BigInteger;
+
+public class BigIntegerPrimeChecker implements PrimeChecker{
+
+ @Override
+ public boolean isPrime(int number) {
+ BigInteger bigInt = BigInteger.valueOf(number);
+ return bigInt.isProbablePrime(100);
+ }
+
+}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
new file mode 100644
index 0000000000..0dfcfa1505
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
@@ -0,0 +1,13 @@
+package com.baeldung.algorithms.primechecker;
+
+import java.util.stream.IntStream;
+
+public class BruteForcePrimeChecker implements PrimeChecker{
+
+ @Override
+ public boolean isPrime(int number) {
+ return IntStream.range(2, number).noneMatch(n -> (number % n == 0));
+ }
+
+
+}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
new file mode 100644
index 0000000000..f7e3e09be0
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
@@ -0,0 +1,14 @@
+package com.baeldung.algorithms.primechecker;
+
+import java.util.stream.IntStream;
+
+public class OptimisedPrimeChecker implements PrimeChecker{
+
+ @Override
+ public boolean isPrime(int number) {
+ return IntStream.range(2, (int)Math.sqrt(number) + 1)
+ .noneMatch(n -> (number % n == 0));
+ }
+
+
+}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
new file mode 100644
index 0000000000..f31af1ca4f
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
@@ -0,0 +1,6 @@
+package com.baeldung.algorithms.primechecker;
+
+public interface PrimeChecker {
+
+ public boolean isPrime( int number );
+}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
new file mode 100644
index 0000000000..ee66d5d2ab
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
@@ -0,0 +1,12 @@
+package com.baeldung.algorithms.primechecker;
+
+import org.apache.commons.math3.primes.Primes;
+
+public class PrimesPrimeChecker implements PrimeChecker{
+
+ @Override
+ public boolean isPrime(int number) {
+ return Primes.isPrime(number);
+ }
+
+}
diff --git a/algorithms/src/main/java/com/baeldung/automata/RtState.java b/algorithms/src/main/java/com/baeldung/automata/RtState.java
index ba785eeff0..b4a5df7961 100644
--- a/algorithms/src/main/java/com/baeldung/automata/RtState.java
+++ b/algorithms/src/main/java/com/baeldung/automata/RtState.java
@@ -21,12 +21,12 @@ public final class RtState implements State {
}
public State transit(final CharSequence c) {
- for(final Transition t : this.transitions) {
- if(t.isPossible(c)) {
- return t.state();
- }
- }
- throw new IllegalArgumentException("Input not accepted: " + c);
+ return transitions
+ .stream()
+ .filter(t -> t.isPossible(c))
+ .map(Transition::state)
+ .findAny()
+ .orElseThrow(() -> new IllegalArgumentException("Input not accepted: " + c));
}
public boolean isFinal() {
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeCheckerTest.java b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeCheckerTest.java
new file mode 100644
index 0000000000..95eb85749d
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeCheckerTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.algorithms.primechecker;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.baeldung.algorithms.primechecker.BigIntegerPrimeChecker;
+import com.baeldung.algorithms.primechecker.PrimeChecker;
+
+public class BigIntegerPrimeCheckerTest {
+
+ PrimeChecker primeChecker = new BigIntegerPrimeChecker();
+
+ @Test
+ public void givenPrimeNumber_whenCheckIsPrime_thenTrue(){
+ assertTrue(primeChecker.isPrime(13));
+ assertTrue(primeChecker.isPrime(1009));
+ }
+
+ @Test
+ public void givenNonPrimeNumber_whenCheckIsPrime_thenFalse(){
+ assertTrue(!primeChecker.isPrime(50));
+ assertTrue(!primeChecker.isPrime(1001));
+ }
+
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BruteForcePrimeCheckerTest.java b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BruteForcePrimeCheckerTest.java
new file mode 100644
index 0000000000..50af4ab05c
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/BruteForcePrimeCheckerTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.algorithms.primechecker;
+
+import org.junit.Test;
+
+import com.baeldung.algorithms.primechecker.BruteForcePrimeChecker;
+
+import static org.junit.Assert.*;
+
+public class BruteForcePrimeCheckerTest {
+
+ BruteForcePrimeChecker primeChecker = new BruteForcePrimeChecker();
+
+ @Test
+ public void givenPrimeNumber_whenCheckIsPrime_thenTrue(){
+ assertTrue(primeChecker.isPrime(13));
+ assertTrue(primeChecker.isPrime(1009));
+ }
+
+ @Test
+ public void givenNonPrimeNumber_whenCheckIsPrime_thenFalse(){
+ assertTrue(!primeChecker.isPrime(50));
+ assertTrue(!primeChecker.isPrime(1001));
+ }
+
+
+
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/primechecker/OptimisedPrimeCheckerTest.java b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/OptimisedPrimeCheckerTest.java
new file mode 100644
index 0000000000..21ad55467f
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/OptimisedPrimeCheckerTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.algorithms.primechecker;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.baeldung.algorithms.primechecker.OptimisedPrimeChecker;
+import com.baeldung.algorithms.primechecker.PrimeChecker;
+
+public class OptimisedPrimeCheckerTest {
+
+ PrimeChecker primeChecker = new OptimisedPrimeChecker();
+
+ @Test
+ public void givenPrimeNumber_whenCheckIsPrime_thenTrue(){
+ assertTrue(primeChecker.isPrime(13));
+ assertTrue(primeChecker.isPrime(1009));
+ }
+
+ @Test
+ public void givenNonPrimeNumber_whenCheckIsPrime_thenFalse(){
+ assertTrue(!primeChecker.isPrime(50));
+ assertTrue(!primeChecker.isPrime(1001));
+ }
+
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/primechecker/PrimesPrimeCheckerTest.java b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/PrimesPrimeCheckerTest.java
new file mode 100644
index 0000000000..63de593b44
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/primechecker/PrimesPrimeCheckerTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.algorithms.primechecker;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+import com.baeldung.algorithms.primechecker.PrimeChecker;
+import com.baeldung.algorithms.primechecker.PrimesPrimeChecker;
+
+public class PrimesPrimeCheckerTest {
+ PrimeChecker primeChecker = new PrimesPrimeChecker();
+
+ @Test
+ public void givenPrimeNumber_whenCheckIsPrime_thenTrue() {
+ assertTrue(primeChecker.isPrime(13));
+ assertTrue(primeChecker.isPrime(1009));
+ }
+
+ @Test
+ public void givenNonPrimeNumber_whenCheckIsPrime_thenFalse() {
+ assertTrue(!primeChecker.isPrime(50));
+ assertTrue(!primeChecker.isPrime(1001));
+ }
+
+}
diff --git a/apache-poi/.gitignore b/apache-poi/.gitignore
index e05054868c..9552c1e63d 100644
--- a/apache-poi/.gitignore
+++ b/apache-poi/.gitignore
@@ -1 +1,3 @@
*.docx
+temp.xls
+temp.xlsx
diff --git a/apache-poi/temp.xlsx b/apache-poi/temp.xlsx
index 50307a28c2..12a9b2656c 100644
Binary files a/apache-poi/temp.xlsx and b/apache-poi/temp.xlsx differ
diff --git a/book b/book
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java/0.8260098203820962 b/core-java/0.8260098203820962
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/core-java/README.md b/core-java/README.md
index 63e3748ec6..0861ee7c5e 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -84,4 +84,5 @@
- [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)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 225eb3fc29..1212465280 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -198,7 +198,6 @@
org.apache.maven.plugins
maven-surefire-plugin
- ${maven-surefire-plugin.version}
**/*IntegrationTest.java
@@ -250,6 +249,7 @@
single
+ ${project.basedir}
org.baeldung.executable.ExecutableMavenJar
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Address.java b/core-java/src/main/java/com/baeldung/arraycopy/model/Address.java
new file mode 100644
index 0000000000..43c6d77fe6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/arraycopy/model/Address.java
@@ -0,0 +1,61 @@
+package com.baeldung.arraycopy.model;
+
+public class Address implements Cloneable {
+ private String country;
+ private String state;
+ private String city;
+ private String street;
+ private String zipcode;
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getZipcode() {
+ return zipcode;
+ }
+
+ public void setZipcode(String zipcode) {
+ this.zipcode = zipcode;
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ super.clone();
+ Address address = new Address();
+ address.setCity(this.city);
+ address.setCountry(this.country);
+ address.setState(this.state);
+ address.setStreet(this.street);
+ address.setZipcode(this.zipcode);
+ return address;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java
new file mode 100644
index 0000000000..757a8f8ec1
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/arraycopy/model/Employee.java
@@ -0,0 +1,25 @@
+package com.baeldung.arraycopy.model;
+
+import java.io.Serializable;
+
+public class Employee implements Serializable {
+ private static final long serialVersionUID = -2454619097207585825L;
+ private int id;
+ private String name;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/pow/PowerExample.java b/core-java/src/main/java/com/baeldung/pow/PowerExample.java
new file mode 100644
index 0000000000..5be5376e6a
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/pow/PowerExample.java
@@ -0,0 +1,19 @@
+package com.baeldung.pow;
+
+import java.text.DecimalFormat;
+
+public class PowerExample {
+
+ public static void main(String[] args) {
+
+ int intResult = (int) Math.pow(2, 3);
+ System.out.println("Math.pow(2, 3) = " + intResult);
+
+ double dblResult = Math.pow(4.2, 3);
+ System.out.println("Math.pow(4.2, 3) = " + Math.pow(4.2, 3));
+
+ DecimalFormat df = new DecimalFormat(".00");
+ System.out.println("Math.pow(4.2, 3) rounded = " + df.format(dblResult));
+
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilTest.java b/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilTest.java
new file mode 100644
index 0000000000..2235e55338
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/arraycopy/ArrayCopyUtilTest.java
@@ -0,0 +1,168 @@
+package com.baeldung.arraycopy;
+
+import com.baeldung.arraycopy.model.Address;
+import com.baeldung.arraycopy.model.Employee;
+import org.apache.commons.lang3.SerializationUtils;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+public class ArrayCopyUtilTest {
+ private static Employee[] employees;
+ private static final int MAX = 2;
+
+ @BeforeClass
+ public static void setup(){
+ createEmployeesArray();
+ }
+
+ private static void createEmployeesArray() {
+ employees = new Employee[MAX];
+ Employee employee;
+ for(int i = 0; i < MAX; i++) {
+ employee = new Employee();
+ employee.setName("Emp"+i);
+ employee.setId(i);
+ employees[i] = employee;
+ }
+ }
+
+ @Test
+ public void givenArrayOfPrimitiveType_whenCopiedViaSystemsArrayCopy_thenSuccessful(){
+ int[] array = {23, 43, 55};
+ int[] copiedArray = new int[3];
+
+ System.arraycopy(array, 0, copiedArray, 0, 3);
+
+ Assert.assertArrayEquals(copiedArray, array);
+ }
+
+ @Test
+ public void givenArrayOfPrimitiveType_whenCopiedSubSequenceViaSystemsArrayCopy_thenSuccessful(){
+ int[] array = {23, 43, 55, 12, 65, 88, 92};
+ int[] copiedArray = new int[3];
+
+ System.arraycopy(array, 2, copiedArray, 0, 3);
+
+ Assert.assertTrue(3 == copiedArray.length);
+ Assert.assertTrue(copiedArray[0] == array[2]);
+ Assert.assertTrue(copiedArray[1] == array[3]);
+ Assert.assertTrue(copiedArray[2] == array[4]);
+ }
+
+ @Test
+ public void givenArrayOfPrimitiveType_whenCopiedSubSequenceViaArraysCopyOfRange_thenSuccessful(){
+ int[] array = {23, 43, 55, 12, 65, 88, 92};
+
+ int[] copiedArray = Arrays.copyOfRange(array, 1, 4);
+
+ Assert.assertTrue(3 == copiedArray.length);
+ Assert.assertTrue(copiedArray[0] == array[1]);
+ Assert.assertTrue(copiedArray[1] == array[2]);
+ Assert.assertTrue(copiedArray[2] == array[3]);
+ }
+
+ @Test
+ public void givenArrayOfPrimitiveType_whenCopiedViaArraysCopyOf_thenValueChangeIsSuccessful(){
+ int[] array = {23, 43, 55, 12};
+ int newLength = array.length;
+
+ int[] copiedArray = Arrays.copyOf(array, newLength);
+
+ Assert.assertArrayEquals(copiedArray, array);
+ array[0] = 9;
+ Assert.assertTrue(copiedArray[0] != array[0]);
+ copiedArray[1] = 12;
+ Assert.assertTrue(copiedArray[1] != array[1]);
+ }
+
+ @Test
+ public void givenArrayOfNonPrimitiveType_whenCopiedViaArraysCopyOf_thenDoShallowCopy(){
+ Employee[] copiedArray = Arrays.copyOf(employees, employees.length);
+
+ Assert.assertArrayEquals(copiedArray, employees);
+ employees[0].setName(employees[0].getName()+"_Changed");
+ //change in employees' element caused change in the copied array
+ Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName()));
+ }
+
+ @Test
+ public void givenArrayOfPrimitiveType_whenCopiedViaArrayClone_thenValueChangeIsSuccessful(){
+ int[] array = {23, 43, 55, 12};
+
+ int[] copiedArray = array.clone();
+
+ Assert.assertArrayEquals(copiedArray, array);
+ array[0] = 9;
+ Assert.assertTrue(copiedArray[0] != array[0]);
+ copiedArray[1] = 12;
+ Assert.assertTrue(copiedArray[1] != array[1]);
+ }
+
+ @Test
+ public void givenArraysOfNonPrimitiveType_whenCopiedViaArrayClone_thenDoShallowCopy(){
+ Employee[] copiedArray = employees.clone();
+
+ Assert.assertArrayEquals(copiedArray, employees);;
+ employees[0].setName(employees[0].getName()+"_Changed");
+ //change in employees' element changed the copied array
+ Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName()));
+ }
+
+ @Test
+ public void givenArraysOfCloneableNonPrimitiveType_whenCopiedViaArrayClone_thenDoShallowCopy(){
+ Address[] addresses = createAddressArray();
+
+ Address[] copiedArray = addresses.clone();
+
+ addresses[0].setCity(addresses[0].getCity()+"_Changed");
+ Assert.assertArrayEquals(copiedArray, addresses);
+ }
+
+ @Test
+ public void givenArraysOfSerializableNonPrimitiveType_whenCopiedViaSerializationUtils_thenDoDeepCopy(){
+ Employee[] copiedArray = SerializationUtils.clone(employees);
+
+ employees[0].setName(employees[0].getName()+"_Changed");
+ //change in employees' element didn't change in the copied array
+ Assert.assertFalse(
+ copiedArray[0].getName().equals(employees[0].getName()));
+ }
+
+ @Test
+ public void givenArraysOfNonPrimitiveType_whenCopiedViaStream_thenDoShallowCopy(){
+ Employee[] copiedArray = Arrays.stream(employees).toArray(Employee[]::new);
+
+ Assert.assertArrayEquals(copiedArray, employees);
+ employees[0].setName(employees[0].getName()+"_Changed");
+ //change in employees' element didn't change in the copied array
+ Assert.assertTrue(copiedArray[0].getName().equals(employees[0].getName()));
+ }
+
+ @Test
+ public void givenArraysOfPrimitiveType_whenCopiedViaStream_thenSuccessful(){
+ String[] strArray = {"orange", "red", "green'"};
+
+ String[] copiedArray = Arrays.stream(strArray).toArray(String[]::new);
+
+ Assert.assertArrayEquals(copiedArray, strArray);
+ }
+
+ private Address[] createAddressArray(){
+ Address[] addresses = new Address[1];
+ addresses[0] = createAddress();
+ return addresses;
+ }
+
+ private Address createAddress() {
+ Address address = new Address();
+ address.setCountry("USA");
+ address.setState("CA");
+ address.setCity("San Francisco");
+ address.setStreet("Street 1");
+ address.setZipcode("59999");
+ return address;
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleTest.java b/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleTest.java
rename to core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
index 7bb2d4bb70..fc343e4cee 100644
--- a/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleTest.java
+++ b/core-java/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
@@ -12,7 +12,7 @@ import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
-public class CountdownLatchExampleTest {
+public class CountdownLatchExampleIntegrationTest {
@Test
public void whenParallelProcessing_thenMainThreadWillBlockUntilCompletion() throws InterruptedException {
// Given
diff --git a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java
index 6cf6ad3551..35aa07821c 100644
--- a/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/enums/PizzaUnitTest.java
@@ -1,5 +1,6 @@
package com.baeldung.enums;
+import com.baeldung.enums.Pizza.PizzaStatusEnum;
import org.junit.Test;
import java.util.ArrayList;
@@ -69,11 +70,31 @@ public class PizzaUnitTest {
}
@Test
- public void givenPizaOrder_whenDelivered_thenPizzaGetsDeliveredAndStatusChanges() {
+ public void whenDelivered_thenPizzaGetsDeliveredAndStatusChanges() {
Pizza pz = new Pizza();
pz.setStatus(Pizza.PizzaStatusEnum.READY);
pz.deliver();
assertTrue(pz.getStatus() == Pizza.PizzaStatusEnum.DELIVERED);
}
+
+ @Test
+ public void whenConvertedIntoEnum_thenGetsConvertedCorrectly() {
+ String pizzaEnumValue = "READY";
+ PizzaStatusEnum pizzaStatusEnum = PizzaStatusEnum.valueOf(pizzaEnumValue);
+ assertTrue(pizzaStatusEnum == PizzaStatusEnum.READY);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void whenConvertedIntoEnum_thenThrowsException() {
+ String pizzaEnumValue = "rEAdY";
+ PizzaStatusEnum pizzaStatusEnum = PizzaStatusEnum.valueOf(pizzaEnumValue);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void givenInvalidEnumValueContentWiseAsString_whenConvertedIntoEnum_thenThrowsException() {
+ String pizzaEnumValue = "invalid";
+ PizzaStatusEnum pizzaStatusEnum = PizzaStatusEnum.valueOf(pizzaEnumValue);
+ }
+
}
diff --git a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java
index 5c338101d8..ebcbb7a3fc 100644
--- a/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java
+++ b/core-java/src/test/java/com/baeldung/java8/comparator/Java8ComparatorTest.java
@@ -60,7 +60,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingComparing_thenCheckingSort() {
+ public void whenComparing_thenSortedByName() {
Comparator employeeNameComparator = Comparator.comparing(Employee::getName);
Arrays.sort(employees, employeeNameComparator);
// System.out.println(Arrays.toString(employees));
@@ -68,7 +68,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingComparingWithComparator_thenCheckingSort() {
+ public void whenComparingWithComparator_thenSortedByNameDesc() {
Comparator employeeNameComparator = Comparator.comparing(Employee::getName, (s1, s2) -> {
return s2.compareTo(s1);
});
@@ -76,9 +76,18 @@ public class Java8ComparatorTest {
// System.out.println(Arrays.toString(employees));
assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc));
}
+
+ @Test
+ public void whenReversed_thenSortedByNameDesc() {
+ Comparator employeeNameComparator = Comparator.comparing(Employee::getName);
+ Comparator employeeNameComparatorReversed = employeeNameComparator.reversed();
+ Arrays.sort(employees, employeeNameComparatorReversed);
+// System.out.println(Arrays.toString(employees));
+ assertTrue(Arrays.equals(employees, sortedEmployeesByNameDesc));
+ }
@Test
- public void givenEmployeeArray_whenUsingComparingInt_thenCheckingSort() {
+ public void whenComparingInt_thenSortedByAge() {
Comparator employeeAgeComparator = Comparator.comparingInt(Employee::getAge);
Arrays.sort(employees, employeeAgeComparator);
// System.out.println(Arrays.toString(employees));
@@ -86,7 +95,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingComparingLong_thenCheckingSort() {
+ public void whenComparingLong_thenSortedByMobile() {
Comparator employeeMobileComparator = Comparator.comparingLong(Employee::getMobile);
Arrays.sort(employees, employeeMobileComparator);
// System.out.println(Arrays.toString(employees));
@@ -94,7 +103,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingComparingDouble_thenCheckingSort() {
+ public void whenComparingDouble_thenSortedBySalary() {
Comparator employeeSalaryComparator = Comparator.comparingDouble(Employee::getSalary);
Arrays.sort(employees, employeeSalaryComparator);
// System.out.println(Arrays.toString(employees));
@@ -102,7 +111,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingNaturalOrder_thenCheckingSort() {
+ public void whenNaturalOrder_thenSortedByName() {
Comparator employeeNameComparator = Comparator. naturalOrder();
Arrays.sort(employees, employeeNameComparator);
// System.out.println(Arrays.toString(employees));
@@ -110,7 +119,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingReverseOrder_thenCheckingSort() {
+ public void whenReverseOrder_thenSortedByNameDesc() {
Comparator employeeNameComparator = Comparator. reverseOrder();
Arrays.sort(employees, employeeNameComparator);
// System.out.println(Arrays.toString(employees));
@@ -118,7 +127,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingNullFirst_thenCheckingSort() {
+ public void whenNullsFirst_thenSortedByNameWithNullsFirst() {
Comparator employeeNameComparator = Comparator.comparing(Employee::getName);
Comparator employeeNameComparator_nullFirst = Comparator.nullsFirst(employeeNameComparator);
Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullFirst);
@@ -127,7 +136,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingNullLast_thenCheckingSort() {
+ public void whenNullsLast_thenSortedByNameWithNullsLast() {
Comparator employeeNameComparator = Comparator.comparing(Employee::getName);
Comparator employeeNameComparator_nullLast = Comparator.nullsLast(employeeNameComparator);
Arrays.sort(employeesArrayWithNulls, employeeNameComparator_nullLast);
@@ -136,7 +145,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingThenComparing_thenCheckingSort() {
+ public void whenThenComparing_thenSortedByAgeName() {
Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName);
Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator);
@@ -145,7 +154,7 @@ public class Java8ComparatorTest {
}
@Test
- public void givenEmployeeArray_whenUsingThenComparingInt_thenCheckingSort() {
+ public void whenThenComparing_thenSortedByNameAge() {
Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge);
Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator);
@@ -153,40 +162,6 @@ public class Java8ComparatorTest {
assertTrue(Arrays.equals(someMoreEmployees, sortedEmployeesByNameAge));
}
- @Before
- public void printData() {
-// System.out.println("employees");
-// System.out.println(Arrays.toString(employees));
- //
-// System.out.println("employeesArrayWithNulls");
-// System.out.println(Arrays.toString(employeesArrayWithNulls));
- //
- // System.out.println("sortedEmployeesByName");
- // System.out.println(Arrays.toString(sortedEmployeesByName));
- //
- // System.out.println("sortedEmployeesByNameDesc");
- // System.out.println(Arrays.toString(sortedEmployeesByNameDesc));
- //
- // System.out.println("sortedEmployeesByAge");
- // System.out.println(Arrays.toString(sortedEmployeesByAge));
- //
- // System.out.println("sortedEmployeesByMobile");
- // System.out.println(Arrays.toString(sortedEmployeesByMobile));
- //
- // System.out.println("sortedEmployeesBySalary");
- // System.out.println(Arrays.toString(sortedEmployeesBySalary));
- //
- // System.out.println("sortedEmployeesArray_WithNullsFirst");
- // System.out.println(Arrays.toString(sortedEmployeesArray_WithNullsFirst));
- //
- // System.out.println("sortedEmployeesArray_WithNullsLast");
- // System.out.println(Arrays.toString(sortedEmployeesArray_WithNullsLast));
- //
- // System.out.println("sortedEmployeesByNameAge");
- // System.out.println(Arrays.toString(sortedEmployeesByNameAge));
- //
-// System.out.println("someMoreEmployees");
-// System.out.println(Arrays.toString(someMoreEmployees));
- //
- }
+
}
+
diff --git a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java
index cf9334954b..b7939d09da 100644
--- a/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java
+++ b/core-java/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListTest.java
@@ -1,52 +1,39 @@
package com.baeldung.list.flattennestedlist;
-import org.junit.Test;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import org.hamcrest.collection.IsIterableContainingInOrder;
+import org.junit.Test;
public class FlattenNestedListTest {
+ List> lol = asList(asList("one:one"), asList("two:one", "two:two", "two:three"), asList("three:one", "three:two", "three:three", "three:four"));
@Test
- public void givenListOfListOfString_flattenNestedList1() {
- // given
- List ls1 = Arrays.asList("one:one", "one:two", "one:three");
- List ls2 = Arrays.asList("two:one", "two:two", "two:three");
- List ls3 = Arrays.asList("three:one", "three:two", "three:three");
+ public void givenString_flattenNestedList1() {
+ List ls = flattenListOfListsImperatively(lol);
- List> list = Arrays.asList(ls1, ls2, ls3);
-
- // when
- List ls = flattenListOfListsImperatively(list);
-
- // then
assertNotNull(ls);
- assertTrue(ls.size() == 9);
- //TODO content assertion
+ assertTrue(ls.size() == 8);
+ // assert content
+ assertThat(ls, IsIterableContainingInOrder.contains("one:one", "two:one", "two:two", "two:three", "three:one", "three:two", "three:three", "three:four"));
}
@Test
- public void givenListOfListOfString_flattenNestedList2() {
- // given
- List ls1 = Arrays.asList("one:one", "one:two", "one:three");
- List ls2 = Arrays.asList("two:one", "two:two", "two:three");
- List ls3 = Arrays.asList("three:one", "three:two", "three:three");
+ public void givenString_flattenNestedList2() {
+ List ls = flattenListOfListsStream(lol);
- List> list = Arrays.asList(ls1, ls2, ls3);
-
- // when
- List ls = flattenListOfListsStream(list);
-
- // then
assertNotNull(ls);
- assertTrue(ls.size() == 9);
- //TODO content assertion
+ assertTrue(ls.size() == 8);
+ // assert content
+ assertThat(ls, IsIterableContainingInOrder.contains("one:one", "two:one", "two:two", "two:three", "three:one", "three:two", "three:three", "three:four"));
}
public List flattenListOfListsImperatively(List> list) {
@@ -56,9 +43,6 @@ public class FlattenNestedListTest {
}
public List flattenListOfListsStream(List> list) {
- return list.stream()
- .flatMap(Collection::stream)
- .collect(Collectors.toList());
+ return list.stream().flatMap(Collection::stream).collect(Collectors.toList());
}
-
}
diff --git a/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitTest.java b/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java
similarity index 98%
rename from core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitTest.java
rename to core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java
index 2c330c513d..2e38886271 100644
--- a/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitTest.java
+++ b/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java
@@ -7,7 +7,7 @@ import java.io.*;
import java.util.concurrent.Executors;
import java.util.function.Consumer;
-public class JavaProcessUnitTest {
+public class JavaProcessUnitIntegrationTest {
private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().startsWith("windows");
private static class StreamGobbler implements Runnable {
diff --git a/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java b/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamIntegrationTest.java
similarity index 93%
rename from core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java
rename to core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamIntegrationTest.java
index c2eb1cff5d..42e85fc586 100644
--- a/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamTest.java
+++ b/core-java/src/test/java/org/baeldung/java/streams/ThreadPoolInParallelStreamIntegrationTest.java
@@ -1,38 +1,38 @@
-package org.baeldung.java.streams;
-
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ForkJoinPool;
-import java.util.stream.Collectors;
-import java.util.stream.LongStream;
-import java.util.stream.Stream;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class ThreadPoolInParallelStreamTest {
-
- @Test
- public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException {
- long firstNum = 1;
- long lastNum = 1_000_000;
-
- List aList = LongStream.rangeClosed(firstNum, lastNum).boxed().collect(Collectors.toList());
-
- ForkJoinPool customThreadPool = new ForkJoinPool(4);
- long actualTotal = customThreadPool.submit(() -> aList.parallelStream().reduce(0L, Long::sum)).get();
-
- assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal);
- }
-
- @Test
- public void givenList_whenCallingParallelStream_shouldBeParallelStream() {
- List aList = new ArrayList<>();
- Stream parallelStream = aList.parallelStream();
-
- assertTrue(parallelStream.isParallel());
- }
-}
+package org.baeldung.java.streams;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+import java.util.stream.Collectors;
+import java.util.stream.LongStream;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ThreadPoolInParallelStreamIntegrationTest {
+
+ @Test
+ public void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException {
+ long firstNum = 1;
+ long lastNum = 1_000_000;
+
+ List aList = LongStream.rangeClosed(firstNum, lastNum).boxed().collect(Collectors.toList());
+
+ ForkJoinPool customThreadPool = new ForkJoinPool(4);
+ long actualTotal = customThreadPool.submit(() -> aList.parallelStream().reduce(0L, Long::sum)).get();
+
+ assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal);
+ }
+
+ @Test
+ public void givenList_whenCallingParallelStream_shouldBeParallelStream() {
+ List aList = new ArrayList<>();
+ Stream parallelStream = aList.parallelStream();
+
+ assertTrue(parallelStream.isParallel());
+ }
+}
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index 7f2c78c9b0..2523cc2125 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -145,6 +145,7 @@
single
+ ${project.basedir}
org.baeldung.executable.ExecutableMavenJar
diff --git a/events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events b/events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events
new file mode 100644
index 0000000000..d3ce8b9cea
Binary files /dev/null and b/events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events differ
diff --git a/events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events b/events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events
new file mode 100644
index 0000000000..2ab0ec469f
Binary files /dev/null and b/events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events differ
diff --git a/events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events b/events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events
new file mode 100644
index 0000000000..d805fc253e
Binary files /dev/null and b/events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events differ
diff --git a/events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events b/events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events
new file mode 100644
index 0000000000..3d67b74ced
Binary files /dev/null and b/events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events differ
diff --git a/guava21/README.md b/guava21/README.md
new file mode 100644
index 0000000000..ff12555376
--- /dev/null
+++ b/guava21/README.md
@@ -0,0 +1 @@
+## Relevant articles:
diff --git a/guava21/pom.xml b/guava21/pom.xml
new file mode 100644
index 0000000000..f393c65aec
--- /dev/null
+++ b/guava21/pom.xml
@@ -0,0 +1,41 @@
+
+
+ 4.0.0
+
+ com.baeldung.guava
+ tutorial
+ 1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+
+ com.google.guava
+ guava
+ 21.0
+
+
+
+
+ junit
+ junit
+ 4.11
+
+
+
+
+
+
\ No newline at end of file
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java b/guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java
new file mode 100644
index 0000000000..79ce02b7f0
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/AtomicLongMapTutorials.java
@@ -0,0 +1,27 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.util.concurrent.AtomicLongMap;
+
+public class AtomicLongMapTutorials {
+
+ private AtomicLongMap atomicLongMap;
+
+ public AtomicLongMapTutorials() {
+ atomicLongMap = AtomicLongMap.create();
+ }
+
+ public void addKeys() {
+ atomicLongMap.addAndGet("apple", 250);
+ atomicLongMap.addAndGet("bat", 350);
+ atomicLongMap.addAndGet("cat", 450);
+ atomicLongMap.addAndGet("dog", 550);
+ }
+
+ public static void main(String[] args) {
+ AtomicLongMapTutorials atomicLongMapTutorials = new AtomicLongMapTutorials();
+ atomicLongMapTutorials.addKeys();
+
+ System.out.println(atomicLongMapTutorials.atomicLongMap.get("2"));
+ }
+
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java b/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java
new file mode 100644
index 0000000000..abb4c51e8f
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/ComparatorsExamples.java
@@ -0,0 +1,25 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.collect.Comparators;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+public class ComparatorsExamples {
+
+ public static void main(String[] args) {
+
+ List integers = Arrays.asList(1, 2, 3, 4, 4, 6, 7, 8, 9, 10);
+ boolean isInAscendingOrder = Comparators.isInOrder(integers, new AscedingOrderComparator());
+ System.out.println(isInAscendingOrder);
+
+ }
+
+ private static class AscedingOrderComparator implements Comparator {
+ @Override
+ public int compare(Integer o1, Integer o2) {
+ return o1.compareTo(o2);
+ }
+ }
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java b/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java
new file mode 100644
index 0000000000..0304d48fbc
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/ConcatStreams.java
@@ -0,0 +1,11 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.collect.Streams;
+
+import java.util.stream.Stream;
+
+public class ConcatStreams {
+ public static Stream concatStreams(Stream stream1, Stream stream2, Stream stream3) {
+ return Streams.concat(stream1, stream2, stream3);
+ }
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java b/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java
new file mode 100644
index 0000000000..5c85e684d5
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/InternerBuilderExample.java
@@ -0,0 +1,15 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+
+public class InternerBuilderExample {
+
+ public static void main(String[] args) {
+ Interner interners = Interners. newBuilder()
+ .concurrencyLevel(2)
+ .strong(). build();
+
+ }
+
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java b/guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java
new file mode 100644
index 0000000000..78bcbe3d49
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/MonitorExample.java
@@ -0,0 +1,27 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.util.concurrent.Monitor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MonitorExample {
+ private List students = new ArrayList();
+ private static final int MAX_SIZE = 100;
+
+ private Monitor monitor = new Monitor();
+
+ public void addToCourse(String item) throws InterruptedException {
+ Monitor.Guard studentsBelowCapacity = monitor.newGuard(this::isStudentsCapacityUptoLimit);
+ monitor.enterWhen(studentsBelowCapacity);
+ try {
+ students.add(item);
+ } finally {
+ monitor.leave();
+ }
+ }
+
+ public Boolean isStudentsCapacityUptoLimit() {
+ return students.size() > MAX_SIZE;
+ }
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java b/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java
new file mode 100644
index 0000000000..2b3bd7cdc4
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/MoreCollectorsExample.java
@@ -0,0 +1,18 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.collect.MoreCollectors;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+public class MoreCollectorsExample {
+
+ public static void main(String[] args) {
+ List numbers = Arrays.asList(1);
+ Optional number = numbers
+ .stream()
+ .map(e -> e * 2)
+ .collect(MoreCollectors.toOptional());
+ }
+}
diff --git a/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java b/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java
new file mode 100644
index 0000000000..b15f61afd5
--- /dev/null
+++ b/guava21/src/main/java/com/baeldung/guava/tutorial/StreamsUtility.java
@@ -0,0 +1,39 @@
+package com.baeldung.guava.tutorial;
+
+import com.google.common.collect.Streams;
+
+import java.util.*;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.Stream;
+
+public class StreamsUtility {
+
+ public static void main(String[] args) {
+
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
+ //Using Collection
+ Stream streamFromCollection = Streams.stream(numbers);
+ //Using Iterator
+ Stream streamFromIterator = Streams.stream(numbers.iterator());
+ //Using Iterable
+ Stream streamFromIterable = Streams.stream((Iterable) numbers);
+ //Using Optional
+ Stream streamFromOptional = Streams.stream(Optional.of(1));
+ //Using OptionalLong to LongStream
+ LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1));
+ //Using OptionalInt to IntStream
+ IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1));
+ //Using OptionalDouble to DoubleStream
+ DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0));
+
+ Stream concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable, streamFromIterator);
+
+ List integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+ //This will return 10
+ Optional lastItem = Streams.findLast(integers.stream());
+
+ Streams.zip(Stream.of("candy", "chocolate", "bar"), Stream.of("$1", "$2", "$3"), (arg1, arg2) -> arg1 + ":" + arg2);
+ }
+}
diff --git a/guava21/src/test/java/AtomicLongMapTests.java b/guava21/src/test/java/AtomicLongMapTests.java
new file mode 100644
index 0000000000..6bde997e8d
--- /dev/null
+++ b/guava21/src/test/java/AtomicLongMapTests.java
@@ -0,0 +1,54 @@
+import com.google.common.util.concurrent.AtomicLongMap;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class AtomicLongMapTests {
+
+ private static final String SPRING_COURSE_KEY = "Spring";
+ private static final String HIBERNATE_COURSE_KEY = "hibernate";
+ private static final String GUAVA_COURSE_KEY = "Guava";
+
+ AtomicLongMap courses = AtomicLongMap.create();
+
+ public void setUp() {
+ courses.put(SPRING_COURSE_KEY, 1056);
+ courses.put(HIBERNATE_COURSE_KEY, 259);
+ courses.put(GUAVA_COURSE_KEY, 78);
+ }
+
+ @Test
+ public void accumulateAndGet_withLongBinaryOperator_thenSuccessful() {
+ long noOfStudents = 56;
+ long oldValue = courses.get(SPRING_COURSE_KEY);
+
+ long totalNotesRequired = courses.accumulateAndGet("Guava", noOfStudents, (x, y) -> (x * y));
+
+ assertEquals(totalNotesRequired, oldValue * noOfStudents);
+ }
+
+ @Test
+ public void getAndAccumulate_withLongBinaryOperator_thenSuccessful() {
+ long noOfStudents = 56;
+ long beforeUpdate = courses.get(SPRING_COURSE_KEY);
+
+ long onUpdate = courses.accumulateAndGet("Guava", noOfStudents, (x, y) -> (x * y));
+
+ long afterUpdate = courses.get(SPRING_COURSE_KEY);
+
+ assertEquals(onUpdate, afterUpdate);
+ assertEquals(afterUpdate, beforeUpdate * noOfStudents);
+ }
+
+ @Test
+ public void updateAndGet_withLongUnaryOperator_thenSuccessful() {
+ long beforeUpdate = courses.get(SPRING_COURSE_KEY);
+
+ long onUpdate = courses.updateAndGet("Guava", (x) -> (x / 2));
+
+ long afterUpdate = courses.get(SPRING_COURSE_KEY);
+
+ assertEquals(onUpdate, afterUpdate);
+ assertEquals(afterUpdate, beforeUpdate / 2);
+ }
+}
diff --git a/guava21/src/test/java/ComparatorsUnitTests.java b/guava21/src/test/java/ComparatorsUnitTests.java
new file mode 100644
index 0000000000..8aaae1e14e
--- /dev/null
+++ b/guava21/src/test/java/ComparatorsUnitTests.java
@@ -0,0 +1,77 @@
+import com.google.common.collect.Comparators;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.ToDoubleFunction;
+import java.util.function.ToIntFunction;
+import java.util.function.ToLongFunction;
+
+public class ComparatorsUnitTests {
+
+ @Test
+ public void isInOrderTest() {
+
+ List numbers = Arrays.asList(1, 2, 3, 4, 4, 6, 7, 8, 9, 10);
+
+ boolean isInAscendingOrder = Comparators.isInOrder(numbers, new AscendingOrderComparator());
+
+ Assert.assertTrue(isInAscendingOrder);
+ }
+
+ @Test
+ public void isInStrictOrderTest() {
+
+ List numbers = Arrays.asList(1, 2, 3, 4, 3, 6, 7, 8, 9, 10);
+
+ boolean isInAscendingOrder = Comparators.isInOrder(numbers, new AscendingOrderComparator());
+
+ Assert.assertFalse(isInAscendingOrder);
+ }
+
+ private class AscendingOrderComparator implements Comparator {
+
+ @Override
+ public int compare(Integer o1, Integer o2) {
+ return o1.compareTo(o2);
+ }
+
+ @Override
+ public Comparator reversed() {
+ return null;
+ }
+
+ @Override
+ public Comparator thenComparing(Comparator super Integer> other) {
+ return null;
+ }
+
+ @Override
+ public Comparator thenComparing(Function super Integer, ? extends U> keyExtractor, Comparator super U> keyComparator) {
+ return null;
+ }
+
+ @Override
+ public > Comparator thenComparing(Function super Integer, ? extends U> keyExtractor) {
+ return null;
+ }
+
+ @Override
+ public Comparator thenComparingInt(ToIntFunction super Integer> keyExtractor) {
+ return null;
+ }
+
+ @Override
+ public Comparator thenComparingLong(ToLongFunction super Integer> keyExtractor) {
+ return null;
+ }
+
+ @Override
+ public Comparator thenComparingDouble(ToDoubleFunction super Integer> keyExtractor) {
+ return null;
+ }
+ }
+}
diff --git a/guava21/src/test/java/GauavaStreamsTests.java b/guava21/src/test/java/GauavaStreamsTests.java
new file mode 100644
index 0000000000..1482d685cf
--- /dev/null
+++ b/guava21/src/test/java/GauavaStreamsTests.java
@@ -0,0 +1,158 @@
+import com.google.common.collect.Streams;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.Stream;
+
+public class GauavaStreamsTests {
+
+ List numbers;
+
+ @Before
+ public void setUp() {
+ numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20);
+ }
+
+ @Test
+ public void createStreamsWithCollection() {
+ //Deprecated API to create stream from collection
+ Stream streamFromCollection = Streams.stream(numbers);
+
+ //Assert.assertNotNull(streamFromCollection);
+ StreamUtility.assertStreamEquals(streamFromCollection, numbers.stream());
+ }
+
+ @Test
+ public void createStreamsWithIterable() {
+ Iterable numbersIterable = (Iterable) numbers;
+
+ Stream streamFromIterable = Streams.stream(numbersIterable);
+
+ Assert.assertNotNull(streamFromIterable);
+ StreamUtility.assertStreamEquals(streamFromIterable, numbers.stream());
+ }
+
+ @Test
+ public void createStreamsWithIterator() {
+ Iterator numbersIterator = numbers.iterator();
+
+ Stream streamFromIterator = Streams.stream(numbersIterator);
+
+ Assert.assertNotNull(streamFromIterator);
+ StreamUtility.assertStreamEquals(streamFromIterator, numbers.stream());
+ }
+
+ @Test
+ public void createStreamsWithOptional() {
+
+ Stream streamFromOptional = Streams.stream(Optional.of(1));
+
+ Assert.assertNotNull(streamFromOptional);
+ Assert.assertEquals(streamFromOptional.count(), 1);
+ }
+
+ @Test
+ public void createStreamsWithOptionalLong() {
+
+ LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1));
+
+ Assert.assertNotNull(streamFromOptionalLong);
+ Assert.assertEquals(streamFromOptionalLong.count(), 1);
+ }
+
+ @Test
+ public void createStreamsWithOptionalInt() {
+
+ IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1));
+
+ //Assert.assertNotNull(streamFromOptionalInt);
+ Assert.assertEquals(streamFromOptionalInt.count(), 1);
+ }
+
+ @Test
+ public void createStreamsWithOptionalDouble() {
+
+ DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0));
+
+ //Assert.assertNotNull(streamFromOptionalDouble);
+ Assert.assertEquals(streamFromOptionalDouble.count(), 1);
+
+ }
+
+ @Test
+ public void concatStreamsOfSameType() {
+ Stream oddNumbers = Arrays
+ .asList(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
+ .stream();
+ Stream evenNumbers = Arrays
+ .asList(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
+ .stream();
+
+ Stream combinedStreams = Streams.concat(oddNumbers, evenNumbers);
+
+ //Assert.assertNotNull(combinedStreams);
+ StreamUtility.assertStreamEquals(combinedStreams, Stream.concat(oddNumbers, evenNumbers));
+ }
+
+ @Test
+ public void concatStreamsOfTypeLongStream() {
+ LongStream firstTwenty = LongStream.range(1, 20);
+ LongStream nextTwenty = LongStream.range(21, 40);
+
+ LongStream combinedStreams = Streams.concat(firstTwenty, nextTwenty);
+
+ Assert.assertNotNull(combinedStreams);
+ StreamUtility.assertStreamEquals(combinedStreams, LongStream.concat(firstTwenty, nextTwenty));
+ }
+
+ @Test
+ public void concatStreamsOfTypeIntStream() {
+ IntStream firstTwenty = IntStream.range(1, 20);
+ IntStream nextTwenty = IntStream.range(21, 40);
+
+ IntStream combinedStreams = Streams.concat(firstTwenty, nextTwenty);
+
+ Assert.assertNotNull(combinedStreams);
+ StreamUtility.assertStreamEquals(combinedStreams, IntStream.concat(firstTwenty, nextTwenty));
+ }
+
+ @Test
+ public void findLastOfStream() {
+ Optional lastElement = Streams.findLast(numbers.stream());
+
+ Assert.assertNotNull(lastElement.get());
+ Assert.assertEquals(lastElement.get(), numbers.get(20));
+ }
+
+ @Test
+ public void mapWithIndexTest() {
+ Stream stringSream = Stream.of("a", "b", "c");
+
+ Stream mappedStream = Streams.mapWithIndex(stringSream, (str, index) -> str + ":" + index);
+
+ //Assert.assertNotNull(mappedStream);
+ Assert.assertEquals(mappedStream
+ .findFirst()
+ .get(), "a:0");
+
+ }
+
+ @Test
+ public void streamsZipTest() {
+ Stream stringSream = Stream.of("a", "b", "c");
+ Stream intStream = Stream.of(1, 2, 3);
+ Stream mappedStream = Streams.zip(stringSream, intStream, (str, index) -> str + ":" + index);
+
+ //Assert.assertNotNull(mappedStream);
+ Assert.assertEquals(mappedStream
+ .findFirst()
+ .get(), "a:1");
+
+ }
+
+}
diff --git a/guava21/src/test/java/InternBuilderUnitTests.java b/guava21/src/test/java/InternBuilderUnitTests.java
new file mode 100644
index 0000000000..b569b59978
--- /dev/null
+++ b/guava21/src/test/java/InternBuilderUnitTests.java
@@ -0,0 +1,18 @@
+import com.google.common.collect.Interner;
+import com.google.common.collect.Interners;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class InternBuilderUnitTests {
+
+ @Test
+ public void interBuilderTest() {
+
+ Interner interners = Interners. newBuilder()
+ .concurrencyLevel(2)
+ .strong(). build();
+
+ Assert.assertNotNull(interners);
+ }
+
+}
diff --git a/guava21/src/test/java/MonitorUnitTests.java b/guava21/src/test/java/MonitorUnitTests.java
new file mode 100644
index 0000000000..7b52c48d8f
--- /dev/null
+++ b/guava21/src/test/java/MonitorUnitTests.java
@@ -0,0 +1,53 @@
+import com.google.common.util.concurrent.Monitor;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MonitorUnitTests {
+
+ @Test
+ public void whenGaurdConditionIsTrue_IsSuccessful() {
+ Monitor monitor = new Monitor();
+ boolean enteredInCriticalSection = false;
+
+ Monitor.Guard gaurdCondition = monitor.newGuard(this::returnTrue);
+
+ if (monitor.enterIf(gaurdCondition)) {
+ try {
+ System.out.println("Entered in critical section");
+ enteredInCriticalSection = true;
+ } finally {
+ monitor.leave();
+ }
+ }
+
+ Assert.assertTrue(enteredInCriticalSection);
+
+ }
+
+ @Test
+ public void whenGaurdConditionIsFalse_IsSuccessful() {
+ Monitor monitor = new Monitor();
+ boolean enteredInCriticalSection = false;
+
+ Monitor.Guard gaurdCondition = monitor.newGuard(this::returnFalse);
+
+ if (monitor.enterIf(gaurdCondition)) {
+ try {
+ System.out.println("Entered in critical section");
+ enteredInCriticalSection = true;
+ } finally {
+ monitor.leave();
+ }
+ }
+
+ Assert.assertFalse(enteredInCriticalSection);
+ }
+
+ private boolean returnTrue() {
+ return true;
+ }
+
+ private boolean returnFalse() {
+ return false;
+ }
+}
diff --git a/guava21/src/test/java/MoreCollectorsUnitTests.java b/guava21/src/test/java/MoreCollectorsUnitTests.java
new file mode 100644
index 0000000000..a205337450
--- /dev/null
+++ b/guava21/src/test/java/MoreCollectorsUnitTests.java
@@ -0,0 +1,36 @@
+import com.google.common.collect.MoreCollectors;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+public class MoreCollectorsUnitTests {
+
+ @Test
+ public void toOptionalTest() {
+
+ List numbers = Arrays.asList(1);
+
+ Optional number = numbers
+ .stream()
+ .map(e -> e * 2)
+ .collect(MoreCollectors.toOptional());
+
+ Assert.assertEquals(number.get(), new Integer(2));
+ }
+
+ @Test
+ public void onlyElementTest() {
+ List numbers = Arrays.asList(1);
+
+ Integer number = numbers
+ .stream()
+ .map(e -> e * 2)
+ .collect(MoreCollectors.onlyElement());
+
+ Assert.assertEquals(number, new Integer(2));
+ }
+
+}
diff --git a/guava21/src/test/java/StreamUtility.java b/guava21/src/test/java/StreamUtility.java
new file mode 100644
index 0000000000..1eb866fb88
--- /dev/null
+++ b/guava21/src/test/java/StreamUtility.java
@@ -0,0 +1,66 @@
+import org.junit.Assert;
+
+import java.util.Iterator;
+import java.util.stream.DoubleStream;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.Stream;
+
+public class StreamUtility {
+
+ public static boolean assertStreamEquals(Stream stream1, Stream stream2) {
+
+ Iterator iterator1 = stream1.iterator();
+ Iterator iterator2 = stream2.iterator();
+
+ while (iterator1.hasNext()) {
+ Assert.assertEquals(iterator1.next(), iterator2.next());
+ }
+
+ Assert.assertFalse(iterator2.hasNext());
+
+ return true;
+ }
+
+ public static boolean assertStreamEquals(LongStream stream1, LongStream stream2) {
+
+ Iterator iterator1 = stream1.iterator();
+ Iterator iterator2 = stream2.iterator();
+
+ while (iterator1.hasNext()) {
+ Assert.assertEquals(iterator1.next(), iterator2.next());
+ }
+
+ Assert.assertFalse(iterator2.hasNext());
+
+ return true;
+ }
+
+ public static boolean assertStreamEquals(DoubleStream stream1, DoubleStream stream2) {
+
+ Iterator iterator1 = stream1.iterator();
+ Iterator iterator2 = stream2.iterator();
+
+ while (iterator1.hasNext()) {
+ Assert.assertEquals(iterator1.next(), iterator2.next());
+ }
+
+ Assert.assertFalse(iterator2.hasNext());
+
+ return true;
+ }
+
+ public static boolean assertStreamEquals(IntStream stream1, IntStream stream2) {
+
+ Iterator iterator1 = stream1.iterator();
+ Iterator iterator2 = stream2.iterator();
+
+ while (iterator1.hasNext()) {
+ Assert.assertEquals(iterator1.next(), iterator2.next());
+ }
+
+ Assert.assertFalse(iterator2.hasNext());
+
+ return true;
+ }
+}
diff --git a/hbase/pom.xml b/hbase/pom.xml
index 2382e47af2..9d523abf1a 100644
--- a/hbase/pom.xml
+++ b/hbase/pom.xml
@@ -33,6 +33,7 @@
org.apache.hbase
hbase
${hbase.version}
+ pom
junit
diff --git a/jackson/README.md b/jackson/README.md
index d9faa377f1..5bc16e66b7 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -26,3 +26,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance)
- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat)
- [A Guide to Optional with Jackson](http://www.baeldung.com/jackson-optional)
+- [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map)
diff --git a/jackson/pom.xml b/jackson/pom.xml
index 881ba8e24c..8e627c146b 100644
--- a/jackson/pom.xml
+++ b/jackson/pom.xml
@@ -195,7 +195,7 @@
- 2.8.6
+ 2.8.7
1.7.21
diff --git a/jackson/src/main/java/com/baeldung/jackson/entities/ClassWithAMap.java b/jackson/src/main/java/com/baeldung/jackson/entities/ClassWithAMap.java
new file mode 100644
index 0000000000..54ebff8a56
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/entities/ClassWithAMap.java
@@ -0,0 +1,24 @@
+package com.baeldung.jackson.entities;
+
+import java.util.Map;
+
+import com.baeldung.jackson.serialization.MyPairDeserializer;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+public class ClassWithAMap {
+
+ @JsonProperty("map")
+ @JsonDeserialize(keyUsing = MyPairDeserializer.class)
+ private final Map map;
+
+ @JsonCreator
+ public ClassWithAMap(Map map) {
+ this.map = map;
+ }
+
+ public Map getMap() {
+ return map;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/entities/MyPair.java b/jackson/src/main/java/com/baeldung/jackson/entities/MyPair.java
new file mode 100644
index 0000000000..ebe41890fe
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/entities/MyPair.java
@@ -0,0 +1,80 @@
+package com.baeldung.jackson.entities;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public class MyPair {
+
+ private String first;
+ private String second;
+
+ public MyPair(String first, String second) {
+ this.first = first;
+ this.second = second;
+ }
+
+ public MyPair(String both) {
+ String[] pairs = both.split("and");
+ this.first = pairs[0].trim();
+ this.second = pairs[1].trim();
+ }
+
+ @Override
+ @JsonValue
+ public String toString() {
+ return first + " and " + second;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((first == null) ? 0 : first.hashCode());
+ result = prime * result + ((second == null) ? 0 : second.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (!(obj instanceof MyPair)) {
+ return false;
+ }
+ MyPair other = (MyPair) obj;
+ if (first == null) {
+ if (other.first != null) {
+ return false;
+ }
+ } else if (!first.equals(other.first)) {
+ return false;
+ }
+ if (second == null) {
+ if (other.second != null) {
+ return false;
+ }
+ } else if (!second.equals(other.second)) {
+ return false;
+ }
+ return true;
+ }
+
+ public String getFirst() {
+ return first;
+ }
+
+ public void setFirst(String first) {
+ this.first = first;
+ }
+
+ public String getSecond() {
+ return second;
+ }
+
+ public void setSecond(String second) {
+ this.second = second;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairDeserializer.java b/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairDeserializer.java
new file mode 100644
index 0000000000..0aa6db98d0
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairDeserializer.java
@@ -0,0 +1,18 @@
+package com.baeldung.jackson.serialization;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.MyPair;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.KeyDeserializer;
+
+public class MyPairDeserializer extends KeyDeserializer {
+
+ @Override
+ public MyPair deserializeKey(String key, DeserializationContext ctxt)
+ throws IOException, JsonProcessingException {
+
+ return new MyPair(key);
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairSerializer.java b/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairSerializer.java
new file mode 100644
index 0000000000..68afb6c193
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/serialization/MyPairSerializer.java
@@ -0,0 +1,25 @@
+package com.baeldung.jackson.serialization;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import com.baeldung.jackson.entities.MyPair;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public class MyPairSerializer extends JsonSerializer {
+
+ private final ObjectMapper mapper = new ObjectMapper();
+
+ @Override
+ public void serialize(MyPair value, JsonGenerator gen,
+ SerializerProvider serializers) throws IOException,
+ JsonProcessingException {
+ StringWriter writer = new StringWriter();
+ mapper.writeValue(writer, value);
+ gen.writeFieldName(writer.toString());
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonMapDeserializeTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonMapDeserializeTest.java
new file mode 100644
index 0000000000..5021abaac1
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/JacksonMapDeserializeTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.jackson.deserialization;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.baeldung.jackson.entities.ClassWithAMap;
+import com.baeldung.jackson.entities.MyPair;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class JacksonMapDeserializeTest {
+
+ private Map map;
+ private Map cmap;
+ final ObjectMapper mapper = new ObjectMapper();
+
+ @Test
+ public void whenSimpleMapDeserialize_thenCorrect()
+ throws JsonParseException, JsonMappingException, IOException {
+
+ final String jsonInput = "{\"key\": \"value\"}";
+ TypeReference> typeRef = new TypeReference>() {
+ };
+
+ final Map map = mapper.readValue(jsonInput, typeRef);
+
+ Assert.assertEquals("value", map.get("key"));
+ }
+
+ @Test
+ public void whenObjectStringMapDeserialize_thenCorrect()
+ throws JsonParseException, JsonMappingException, IOException {
+
+ final String jsonInput = "{\"Abbott and Costello\":\"Comedy\"}";
+
+ TypeReference> typeRef = new TypeReference>() {
+ };
+
+ map = mapper.readValue(jsonInput, typeRef);
+
+ Assert.assertEquals("Comedy", map.get(new MyPair("Abbott", "Costello")));
+
+ ClassWithAMap classWithMap = mapper.readValue(jsonInput,
+ ClassWithAMap.class);
+
+ Assert.assertEquals("Comedy",
+ classWithMap.getMap().get(new MyPair("Abbott", "Costello")));
+ }
+
+ @Test
+ public void whenObjectObjectMapDeserialize_thenCorrect()
+ throws JsonParseException, JsonMappingException, IOException {
+
+ final String jsonInput = "{\"Abbott and Costello\" : \"Comedy and 1940s\"}";
+ TypeReference> typeRef = new TypeReference>() {
+ };
+
+ cmap = mapper.readValue(jsonInput, typeRef);
+
+ Assert.assertEquals(new MyPair("Comedy", "1940s"),
+ cmap.get(new MyPair("Abbott", "Costello")));
+ }
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/serialization/JacksonMapSerializeTest.java b/jackson/src/test/java/com/baeldung/jackson/serialization/JacksonMapSerializeTest.java
new file mode 100644
index 0000000000..a5ee76f3b8
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/serialization/JacksonMapSerializeTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.jackson.serialization;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.baeldung.jackson.entities.MyPair;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.MapSerializer;
+
+public class JacksonMapSerializeTest {
+
+ @JsonSerialize(keyUsing = MyPairSerializer.class)
+ private Map map;
+
+ @JsonSerialize(keyUsing = MapSerializer.class)
+ private Map cmap;
+
+ @JsonSerialize(keyUsing = MyPairSerializer.class)
+ private MyPair mapKey;
+
+ @JsonSerialize(keyUsing = MyPairSerializer.class)
+ private MyPair mapValue;
+
+ final ObjectMapper mapper = new ObjectMapper();
+
+ @Test
+ public void whenSimpleMapSerialize_thenCorrect()
+ throws JsonProcessingException {
+
+ Map map = new HashMap<>();
+ map.put("key", "value");
+
+ final String jsonResult = mapper.writeValueAsString(map);
+
+ Assert.assertEquals("{\"key\":\"value\"}", jsonResult);
+ }
+
+ @Test
+ public void whenCustomObjectStringMapSerialize_thenCorrect()
+ throws JsonProcessingException {
+
+ map = new HashMap<>();
+ MyPair key = new MyPair("Abbott", "Costello");
+ map.put(key, "Comedy");
+
+ final String jsonResult = mapper.writeValueAsString(map);
+
+ Assert.assertEquals("{\"Abbott and Costello\":\"Comedy\"}", jsonResult);
+ }
+
+ @Test
+ public void whenCustomObjectObjectMapSerialize_thenCorrect()
+ throws JsonProcessingException {
+
+ cmap = new HashMap<>();
+ mapKey = new MyPair("Abbott", "Costello");
+ mapValue = new MyPair("Comedy", "1940's");
+ cmap.put(mapKey, mapValue);
+
+ final String jsonResult = mapper.writeValueAsString(cmap);
+
+ Assert.assertEquals("{\"Abbott and Costello\":\"Comedy and 1940's\"}",
+ jsonResult);
+ }
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/streaming/JacksonStreamingAPITest.java b/jackson/src/test/java/com/baeldung/jackson/streaming/JacksonStreamingAPITest.java
new file mode 100644
index 0000000000..6f61793315
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/streaming/JacksonStreamingAPITest.java
@@ -0,0 +1,119 @@
+package com.baeldung.jackson.streaming;
+
+
+import com.fasterxml.jackson.core.*;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import static junit.framework.Assert.assertNull;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.TestCase.assertEquals;
+
+public class JacksonStreamingAPITest {
+
+ @Test
+ public void givenJsonGenerator_whenAppendJsonToIt_thenGenerateJson() throws IOException {
+ //given
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ JsonFactory jfactory = new JsonFactory();
+ JsonGenerator jGenerator = jfactory.createGenerator(stream, JsonEncoding.UTF8);
+
+ //when
+ jGenerator.writeStartObject();
+ jGenerator.writeStringField("name", "Tom");
+ jGenerator.writeNumberField("age", 25);
+ jGenerator.writeFieldName("address");
+ jGenerator.writeStartArray();
+ jGenerator.writeString("Poland");
+ jGenerator.writeString("5th avenue");
+ jGenerator.writeEndArray();
+ jGenerator.writeEndObject();
+ jGenerator.close();
+
+ //then
+ String json = new String(stream.toByteArray(), "UTF-8");
+ assertEquals(json, "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}");
+ }
+
+ @Test
+ public void givenJson_whenReadItUsingStreamAPI_thenShouldCreateProperJsonObject() throws IOException {
+ //given
+ String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}";
+ JsonFactory jfactory = new JsonFactory();
+ JsonParser jParser = jfactory.createParser(json);
+
+ String parsedName = null;
+ Integer parsedAge = null;
+ List addresses = new LinkedList<>();
+
+ //when
+ while (jParser.nextToken() != JsonToken.END_OBJECT) {
+
+ String fieldname = jParser.getCurrentName();
+ if ("name".equals(fieldname)) {
+ jParser.nextToken();
+ parsedName = jParser.getText();
+
+ }
+
+ if ("age".equals(fieldname)) {
+ jParser.nextToken();
+ parsedAge = jParser.getIntValue();
+
+ }
+
+ if ("address".equals(fieldname)) {
+ jParser.nextToken();
+
+ while (jParser.nextToken() != JsonToken.END_ARRAY) {
+ addresses.add(jParser.getText());
+ }
+ }
+
+ }
+ jParser.close();
+
+ //then
+ assertEquals(parsedName, "Tom");
+ assertEquals(parsedAge, (Integer) 25);
+ assertEquals(addresses, Arrays.asList("Poland", "5th avenue"));
+
+ }
+
+ @Test
+ public void givenJson_whenWantToExtractPartOfIt_thenShouldExtractOnlyNeededFieldWithoutGoingThroughWholeJSON() throws IOException {
+ //given
+ String json = "{\"name\":\"Tom\",\"age\":25,\"address\":[\"Poland\",\"5th avenue\"]}";
+ JsonFactory jfactory = new JsonFactory();
+ JsonParser jParser = jfactory.createParser(json);
+
+ String parsedName = null;
+ Integer parsedAge = null;
+ List addresses = new LinkedList<>();
+
+ //when
+ while (jParser.nextToken() != JsonToken.END_OBJECT) {
+
+ String fieldname = jParser.getCurrentName();
+
+ if ("age".equals(fieldname)) {
+ jParser.nextToken();
+ parsedAge = jParser.getIntValue();
+ return;
+ }
+
+ }
+ jParser.close();
+
+ //then
+ assertNull(parsedName);
+ assertEquals(parsedAge, (Integer) 25);
+ assertTrue(addresses.isEmpty());
+
+ }
+}
diff --git a/javaslang/pom.xml b/javaslang/pom.xml
index e111132aec..3770cce548 100644
--- a/javaslang/pom.xml
+++ b/javaslang/pom.xml
@@ -22,19 +22,40 @@
javaslang
2.1.0-alpha
+
+ io.javaslang
+ javaslang-test
+ ${javaslang.test.version}
+
+
+ 2.0.5
+
+
org.apache.maven.plugins
maven-compiler-plugin
- 3.3
+ 3.5.1
1.8
1.8
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
\ No newline at end of file
diff --git a/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedLongRunningUnitTest.java b/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedLongRunningUnitTest.java
new file mode 100644
index 0000000000..2bbc92563e
--- /dev/null
+++ b/javaslang/src/test/java/com/baeldung/javaslang/PropertyBasedLongRunningUnitTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.javaslang;
+
+import javaslang.CheckedFunction1;
+import javaslang.collection.Stream;
+import javaslang.test.Arbitrary;
+import javaslang.test.CheckResult;
+import javaslang.test.Property;
+import org.junit.Test;
+
+import java.util.function.Predicate;
+
+import static javaslang.API.*;
+
+public class PropertyBasedLongRunningUnitTest {
+
+ private static Predicate divisibleByTwo = i -> i % 2 == 0;
+ private static Predicate divisibleByFive = i -> i % 5 == 0;
+
+ private Stream stringsSupplier() {
+ return Stream.from(0).map(i -> Match(i).of(
+ Case($(divisibleByFive.and(divisibleByTwo)), "DividedByTwoAndFiveWithoutRemainder"),
+ Case($(divisibleByFive), "DividedByFiveWithoutRemainder"),
+ Case($(divisibleByTwo), "DividedByTwoWithoutRemainder"),
+ Case($(), "")));
+ }
+
+ @Test
+ public void givenArbitrarySeq_whenCheckThatEverySecondElementIsEqualToString_thenTestPass() {
+ //given
+ Arbitrary multiplesOf2 = Arbitrary
+ .integer()
+ .filter(i -> i > 0)
+ .filter(i -> i % 2 == 0 && i % 5 != 0);
+
+ //when
+ CheckedFunction1 mustEquals = i -> stringsSupplier()
+ .get(i)
+ .equals("DividedByTwoWithoutRemainder");
+
+ //then
+ CheckResult result = Property
+ .def("Every second element must equal to DividedByTwoWithoutRemainder")
+ .forAll(multiplesOf2)
+ .suchThat(mustEquals)
+ .check(10_000, 100);
+
+ result.assertIsSatisfied();
+ }
+
+ @Test
+ public void givenArbitrarySeq_whenCheckThatEveryFifthElementIsEqualToString_thenTestPass() {
+ //given
+ Arbitrary multiplesOf5 = Arbitrary
+ .integer()
+ .filter(i -> i > 0)
+ .filter(i -> i % 5 == 0 && i % 2 == 0);
+
+ //when
+ CheckedFunction1 mustEquals = i -> stringsSupplier()
+ .get(i)
+ .endsWith("DividedByTwoAndFiveWithoutRemainder");
+
+ //then
+ Property
+ .def("Every fifth element must equal to DividedByTwoAndFiveWithoutRemainder")
+ .forAll(multiplesOf5)
+ .suchThat(mustEquals)
+ .check(10_000, 1_000)
+ .assertIsSatisfied();
+ }
+}
diff --git a/jee7/pom.xml b/jee7/pom.xml
index f275f56d58..26d433df78 100644
--- a/jee7/pom.xml
+++ b/jee7/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.baeldung
- jee7schedule
+ jee7
1.0-SNAPSHOT
JavaEE 7 Arquillian Archetype Sample
war
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml b/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
new file mode 100644
index 0000000000..b4bb243559
--- /dev/null
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ com.baeldung.javaeeannotations
+ JavaEEAnnotationsSample
+ 0.0.1-SNAPSHOT
+ war
+ JavaEEAnnotationsSample
+ JavaEEAnnotationsSample
+
+
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.3
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+
+
+
+ javax.servlet.jsp
+ jsp-api
+ 2.1
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+ 1.7
+ 1.7
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.4
+
+ src/main/webapp
+ SpringFieldConstructorInjection
+ false
+
+
+
+
+ JavaEEAnnotationsSample
+
+
\ No newline at end of file
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java b/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
similarity index 85%
rename from jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
rename to jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
index e3f1667595..e24eb307bb 100644
--- a/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
@@ -5,9 +5,6 @@ import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.annotation.HttpConstraint;
-import javax.servlet.annotation.HttpMethodConstraint;
-import javax.servlet.annotation.ServletSecurity;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
@@ -19,20 +16,20 @@ import javax.servlet.http.HttpServletResponse;
urlPatterns = {"/account", "/bankAccount" },
initParams = { @WebInitParam(name = "type", value = "savings") }
)
-@ServletSecurity(
+/*@ServletSecurity(
value = @HttpConstraint(rolesAllowed = {"admin"}),
httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin"})}
- )
+ )*/
public class AccountServlet extends javax.servlet.http.HttpServlet {
String accountType = null;
- @Override
public void init(ServletConfig config) throws ServletException {
accountType = config.getInitParameter("type");
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
PrintWriter writer = response.getWriter();
writer.println("Hello, I am an AccountServlet!");
writer.flush();
@@ -49,8 +46,8 @@ public class AccountServlet extends javax.servlet.http.HttpServlet {
PrintWriter writer = response.getWriter();
writer.println(" Balance of " + accountType + " account is: " +
- accountBalance + "
This account bares an interest rate of " + interestRate +
- " % ");
+ accountBalance + "
This account bares an interest rate of " + interestRate +
+ " %