1.8
1.8
diff --git a/camel-api/pom.xml b/camel-api/pom.xml
index 6db9f9bfd1..c342a73150 100644
--- a/camel-api/pom.xml
+++ b/camel-api/pom.xml
@@ -12,7 +12,7 @@
UTF-8
- 3.6.0
+ 3.7.0
2.19.1
2.19.1
1.5.4.RELEASE
diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml
index e8625b48f7..9cae9c487b 100644
--- a/cas/cas-server/pom.xml
+++ b/cas/cas-server/pom.xml
@@ -52,7 +52,11 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.3
+ 3.7.0
+
+ 1.8
+ 1.8
+
cas
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 61f8df8f49..862d8c2224 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -33,3 +33,4 @@
- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
- [Copy a File with Java](http://www.baeldung.com/java-copy-file)
- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers)
+- [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods)
diff --git a/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java b/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java
index 31b45aab84..a842be8153 100644
--- a/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java
+++ b/core-java-8/src/main/java/com/baeldung/datetime/UseDuration.java
@@ -2,7 +2,6 @@ package com.baeldung.datetime;
import java.time.Duration;
import java.time.LocalTime;
-import java.time.Period;
public class UseDuration {
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
new file mode 100644
index 0000000000..438ecad140
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
@@ -0,0 +1,18 @@
+package com.baeldung.defaultstaticinterfacemethods.application;
+
+import com.baeldung.defaultstaticinterfacemethods.model.Car;
+import com.baeldung.defaultstaticinterfacemethods.model.Vehicle;
+
+public class Application {
+
+ public static void main(String[] args) {
+
+ Vehicle car = new Car("BMW");
+ System.out.println(car.getBrand());
+ System.out.println(car.speedUp());
+ System.out.println(car.slowDown());
+ System.out.println(car.turnAlarmOn());
+ System.out.println(car.turnAlarmOff());
+ System.out.println(Vehicle.getHorsePower(2500, 480));
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
new file mode 100644
index 0000000000..52ec2c3c15
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
@@ -0,0 +1,12 @@
+package com.baeldung.defaultstaticinterfacemethods.model;
+
+public interface Alarm {
+
+ default String turnAlarmOn() {
+ return "Turning the alarm on.";
+ }
+
+ default String turnAlarmOff() {
+ return "Turning the alarm off.";
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
new file mode 100644
index 0000000000..6ec6507e59
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
@@ -0,0 +1,25 @@
+package com.baeldung.defaultstaticinterfacemethods.model;
+
+public class Car implements Vehicle {
+
+ private final String brand;
+
+ public Car(String brand) {
+ this.brand = brand;
+ }
+
+ @Override
+ public String getBrand() {
+ return brand;
+ }
+
+ @Override
+ public String speedUp() {
+ return "The car is speeding up.";
+ }
+
+ @Override
+ public String slowDown() {
+ return "The car is slowing down.";
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
new file mode 100644
index 0000000000..b1de93059a
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
@@ -0,0 +1,25 @@
+package com.baeldung.defaultstaticinterfacemethods.model;
+
+public class Motorbike implements Vehicle {
+
+ private final String brand;
+
+ public Motorbike(String brand) {
+ this.brand = brand;
+ }
+
+ @Override
+ public String getBrand() {
+ return brand;
+ }
+
+ @Override
+ public String speedUp() {
+ return "The motorbike is speeding up.";
+ }
+
+ @Override
+ public String slowDown() {
+ return "The motorbike is slowing down.";
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
new file mode 100644
index 0000000000..abf329fafd
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
@@ -0,0 +1,35 @@
+package com.baeldung.defaultstaticinterfacemethods.model;
+
+public class MultiAlarmCar implements Vehicle, Alarm {
+
+ private final String brand;
+
+ public MultiAlarmCar(String brand) {
+ this.brand = brand;
+ }
+
+ @Override
+ public String getBrand() {
+ return brand;
+ }
+
+ @Override
+ public String speedUp() {
+ return "The motorbike is speeding up.";
+ }
+
+ @Override
+ public String slowDown() {
+ return "The mootorbike is slowing down.";
+ }
+
+ @Override
+ public String turnAlarmOn() {
+ return Vehicle.super.turnAlarmOn() + " " + Alarm.super.turnAlarmOn();
+ }
+
+ @Override
+ public String turnAlarmOff() {
+ return Vehicle.super.turnAlarmOff() + " " + Alarm.super.turnAlarmOff();
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
new file mode 100644
index 0000000000..b0bdd63c2c
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
@@ -0,0 +1,22 @@
+package com.baeldung.defaultstaticinterfacemethods.model;
+
+public interface Vehicle {
+
+ String getBrand();
+
+ String speedUp();
+
+ String slowDown();
+
+ default String turnAlarmOn() {
+ return "Turning the vehice alarm on.";
+ }
+
+ default String turnAlarmOff() {
+ return "Turning the vehicle alarm off.";
+ }
+
+ static int getHorsePower(int rpm, int torque) {
+ return (rpm * torque) / 5252;
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java
new file mode 100644
index 0000000000..5e7cfdb54f
--- /dev/null
+++ b/core-java-8/src/main/java/com/baeldung/iterators/Iterators.java
@@ -0,0 +1,80 @@
+package com.baeldung.iterators;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Source code https://github.com/eugenp/tutorials
+ *
+ * @author Santosh Thakur
+ */
+
+public class Iterators {
+
+ public static int failFast1() {
+ ArrayList numbers = new ArrayList<>();
+
+ numbers.add(10);
+ numbers.add(20);
+ numbers.add(30);
+ numbers.add(40);
+
+ Iterator iterator = numbers.iterator();
+ while (iterator.hasNext()) {
+ Integer number = iterator.next();
+ numbers.add(50);
+ }
+
+ return numbers.size();
+ }
+
+ public static int failFast2() {
+ ArrayList numbers = new ArrayList<>();
+ numbers.add(10);
+ numbers.add(20);
+ numbers.add(30);
+ numbers.add(40);
+
+ Iterator iterator = numbers.iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next() == 30) {
+ // will not throw Exception
+ iterator.remove();
+ }
+ }
+
+ System.out.println("using iterator's remove method = " + numbers);
+
+ iterator = numbers.iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next() == 40) {
+ // will throw Exception on
+ // next call of next() method
+ numbers.remove(2);
+ }
+ }
+
+ return numbers.size();
+ }
+
+ public static int failSafe1() {
+ ConcurrentHashMap map = new ConcurrentHashMap<>();
+
+ map.put("First", 10);
+ map.put("Second", 20);
+ map.put("Third", 30);
+ map.put("Fourth", 40);
+
+ Iterator iterator = map.keySet()
+ .iterator();
+
+ while (iterator.hasNext()) {
+ String key = iterator.next();
+ map.put("Fifth", 50);
+ }
+
+ return map.size();
+ }
+
+}
diff --git a/core-java-8/src/main/java/com/baeldung/streamApi/Product.java b/core-java-8/src/main/java/com/baeldung/stream/Product.java
similarity index 89%
rename from core-java-8/src/main/java/com/baeldung/streamApi/Product.java
rename to core-java-8/src/main/java/com/baeldung/stream/Product.java
index 26b8bd6fed..e99a969b81 100644
--- a/core-java-8/src/main/java/com/baeldung/streamApi/Product.java
+++ b/core-java-8/src/main/java/com/baeldung/stream/Product.java
@@ -1,8 +1,6 @@
-package com.baeldung.streamApi;
+package com.baeldung.stream;
import java.util.List;
-import java.util.Optional;
-import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
diff --git a/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java b/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java
index 364fdeffbb..f0d5f1aa7e 100644
--- a/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java
+++ b/core-java-8/src/main/java/com/baeldung/stream/StreamApi.java
@@ -16,7 +16,7 @@ public class StreamApi {
}
public static String getLastElementUsingSkip(List valueList) {
- long count = valueList.stream().count();
+ long count = (long) valueList.size();
Stream stream = valueList.stream();
return stream.skip(count - 1).findFirst().orElse(null);
}
diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java
index 2a42a166fa..015ca3f942 100644
--- a/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java
+++ b/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java
@@ -2,6 +2,7 @@ package com.baeldung.counter;
import java.util.HashMap;
import java.util.Map;
+import java.util.Random;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
@@ -18,8 +19,18 @@ public class CounterStatistics {
private static final Map counterWithMutableIntMap = new HashMap<>();
private static final Map counterWithIntArrayMap = new HashMap<>();
private static final Map counterWithLongWrapperMap = new HashMap<>();
+ private static final Map counterWithLongWrapperStreamMap = new HashMap<>();
+
+ static {
+ CounterUtil.COUNTRY_NAMES = new String[10000];
+ final String prefix = "NewString";
+ Random random = new Random();
+ for (int i=0; i<10000; i++) {
+ CounterUtil.COUNTRY_NAMES[i] = new String(prefix + random.nextInt(1000));
+ }
+ }
- @Benchmark
+ @Benchmark
public void wrapperAsCounter() {
CounterUtil.counterWithWrapperObject(counterMap);
}
@@ -28,6 +39,11 @@ public class CounterStatistics {
public void lambdaExpressionWithWrapper() {
CounterUtil.counterWithLambdaAndWrapper(counterWithLongWrapperMap);
}
+
+ @Benchmark
+ public void parallelStreamWithWrapper() {
+ CounterUtil.counterWithParallelStreamAndWrapper(counterWithLongWrapperStreamMap);
+ }
@Benchmark
public void mutableIntegerAsCounter() {
diff --git a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java
index afd7202892..c2bf47e213 100644
--- a/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java
+++ b/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java
@@ -6,7 +6,7 @@ import java.util.stream.Stream;
public class CounterUtil {
- private final static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" };
+ public static String[] COUNTRY_NAMES = { "China", "Australia", "India", "USA", "USSR", "UK", "China", "France", "Poland", "Austria", "India", "USA", "Egypt", "China" };
public static void counterWithWrapperObject(Map counterMap) {
for (String country : COUNTRY_NAMES) {
@@ -15,9 +15,14 @@ public class CounterUtil {
}
public static void counterWithLambdaAndWrapper(Map counterMap) {
- counterMap.putAll(Stream.of(COUNTRY_NAMES)
+ Stream.of(COUNTRY_NAMES)
+ .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting()));
+ }
+
+ public static void counterWithParallelStreamAndWrapper(Map counterMap) {
+ Stream.of(COUNTRY_NAMES)
.parallel()
- .collect(Collectors.groupingBy(k -> k, Collectors.counting())));
+ .collect(Collectors.groupingBy(k -> k, () -> counterMap, Collectors.counting()));
}
public static class MutableInteger {
@@ -49,4 +54,4 @@ public class CounterUtil {
}
}
-}
+}
\ No newline at end of file
diff --git a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
index e7a76d1ab9..6fb6d21b19 100644
--- a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
@@ -4,7 +4,6 @@ import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Month;
-import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
index 90e858f9ac..834179febd 100644
--- a/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
@@ -4,7 +4,6 @@ import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
-import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
new file mode 100644
index 0000000000..7d4b06908a
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.defaultistaticinterfacemethods.test;
+
+import com.baeldung.defaultstaticinterfacemethods.model.Car;
+import com.baeldung.defaultstaticinterfacemethods.model.Motorbike;
+import com.baeldung.defaultstaticinterfacemethods.model.Vehicle;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.*;
+
+public class StaticDefaulInterfaceMethodUnitTest {
+
+ private static Car car;
+ private static Motorbike motorbike;
+
+ @BeforeClass
+ public static void setUpCarInstance() {
+ car = new Car("BMW");
+ }
+
+ @BeforeClass
+ public static void setUpMotorbikeInstance() {
+ motorbike = new Motorbike("Yamaha");
+ }
+
+ @Test
+ public void givenCarInstace_whenBrandisBMW_thenOneAssertion() {
+ assertThat(car.getBrand()).isEqualTo("BMW");
+ }
+
+ @Test
+ public void givenCarInstance_whenCallingSpeedUp_thenOneAssertion() {
+ assertThat(car.speedUp()).isEqualTo("The car is speeding up.");
+ }
+
+ @Test
+ public void givenCarInstance_whenCallingSlowDown_thenOneAssertion() {
+ assertThat(car.slowDown()).isEqualTo("The car is slowing down.");
+ }
+
+ @Test
+ public void givenCarInstance_whenCallingTurnAlarmOn_thenOneAssertion() {
+ assertThat(car.turnAlarmOn()).isEqualTo("Turning the vehice alarm on.");
+ }
+
+ @Test
+ public void givenCarInstance_whenCallingTurnAlarmOff_thenOneAssertion() {
+ assertThat(car.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off.");
+ }
+
+ @Test
+ public void givenVehicleInterface_whenCallinggetHorsePower_thenOneAssertion() {
+ assertThat(Vehicle.getHorsePower(2500, 480)).isEqualTo(228);
+ }
+
+ @Test
+ public void givenMooorbikeInstace_whenBrandisYamaha_thenOneAssertion() {
+ assertThat(motorbike.getBrand()).isEqualTo("Yamaha");
+ }
+
+ @Test
+ public void givenMotorbikeInstance_whenCallingSpeedUp_thenOneAssertion() {
+ assertThat(motorbike.speedUp()).isEqualTo("The motorbike is speeding up.");
+ }
+
+ @Test
+ public void givenMotorbikeInstance_whenCallingSlowDown_thenOneAssertion() {
+ assertThat(motorbike.slowDown()).isEqualTo("The motorbike is slowing down.");
+ }
+
+ @Test
+ public void givenMotorbikeInstance_whenCallingTurnAlarmOn_thenOneAssertion() {
+ assertThat(motorbike.turnAlarmOn()).isEqualTo("Turning the vehice alarm on.");
+ }
+
+ @Test
+ public void givenMotorbikeInstance_whenCallingTurnAlarmOff_thenOneAssertion() {
+ assertThat(motorbike.turnAlarmOff()).isEqualTo("Turning the vehicle alarm off.");
+ }
+}
\ No newline at end of file
diff --git a/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java b/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java
new file mode 100644
index 0000000000..73793da7ae
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/iterators/IteratorsTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.iterators;
+
+import static com.baeldung.iterators.Iterators.failFast1;
+import static com.baeldung.iterators.Iterators.failFast2;
+import static com.baeldung.iterators.Iterators.failSafe1;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.ConcurrentModificationException;
+
+import org.junit.Test;
+
+/**
+ * Source code https://github.com/eugenp/tutorials
+ *
+ * @author Santosh Thakur
+ */
+
+public class IteratorsTest {
+
+ @Test
+ public void whenFailFast_ThenThrowsException() {
+ assertThatThrownBy(() -> {
+ failFast1();
+ }).isInstanceOf(ConcurrentModificationException.class);
+ }
+
+ @Test
+ public void whenFailFast_ThenThrowsExceptionInSecondIteration() {
+ assertThatThrownBy(() -> {
+ failFast2();
+ }).isInstanceOf(ConcurrentModificationException.class);
+ }
+
+ @Test
+ public void whenFailSafe_ThenDoesNotThrowException() {
+ assertThat(failSafe1()).isGreaterThanOrEqualTo(0);
+ }
+
+}
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
index 73a10a57f4..5005cf7f47 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.java8;
-import com.baeldung.streamApi.Product;
+import com.baeldung.stream.Product;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
index 1cac428285..2475716554 100644
--- a/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/java8/comparator/Java8ComparatorUnitTest.java
@@ -6,7 +6,6 @@ import java.util.Comparator;
import org.junit.Before;
import org.junit.Test;
-import lombok.Data;
import static org.junit.Assert.assertTrue;
public class Java8ComparatorUnitTest {
@@ -134,8 +133,7 @@ public class Java8ComparatorUnitTest {
@Test
public void whenThenComparing_thenSortedByAgeName() {
- Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge)
- .thenComparing(Employee::getName);
+ Comparator employee_Age_Name_Comparator = Comparator.comparing(Employee::getAge).thenComparing(Employee::getName);
Arrays.sort(someMoreEmployees, employee_Age_Name_Comparator);
// System.out.println(Arrays.toString(someMoreEmployees));
@@ -144,8 +142,7 @@ public class Java8ComparatorUnitTest {
@Test
public void whenThenComparing_thenSortedByNameAge() {
- Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName)
- .thenComparingInt(Employee::getAge);
+ Comparator employee_Name_Age_Comparator = Comparator.comparing(Employee::getName).thenComparingInt(Employee::getAge);
Arrays.sort(someMoreEmployees, employee_Name_Age_Comparator);
// System.out.println(Arrays.toString(someMoreEmployees));
diff --git a/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java
index 75078d75bc..2c88dc5ec7 100644
--- a/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java
+++ b/core-java-8/src/test/java/com/baeldung/stream/PrimitiveStreamsUnitTest.java
@@ -2,11 +2,11 @@ package com.baeldung.stream;
import org.junit.Test;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
+import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -66,7 +66,9 @@ public class PrimitiveStreamsUnitTest {
@Test
public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() {
- int sum = Arrays.asList(33,45).stream().mapToInt(a -> a).sum();
+ int sum = Stream.of(33,45)
+ .mapToInt(i -> i)
+ .sum();
assertEquals(78, sum);
}
diff --git a/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java b/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
new file mode 100644
index 0000000000..a72f811336
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
@@ -0,0 +1,101 @@
+package com.baeldung.stringjoiner;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+
+public class StringJoinerUnitTest {
+ private final String DELIMITER_COMMA = ",";
+ private final String DELIMITER_HYPHEN = "-";
+ private final String PREFIX = "[";
+ private final String SUFFIX = "]";
+ private final String EMPTY_JOINER = "empty";
+
+ @Test
+ public void whenJoinerWithoutPrefixSuffixWithoutEmptyValue_thenReturnDefault() {
+ StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA);
+ assertEquals(0, commaSeparatedJoiner.toString().length());
+ }
+
+ @Test
+ public void whenJoinerWithPrefixSuffixWithoutEmptyValue_thenReturnDefault() {
+ StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX);
+ assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), PREFIX + SUFFIX);
+ }
+
+ @Test
+ public void whenJoinerWithoutPrefixSuffixWithEmptyValue_thenReturnDefault() {
+ StringJoiner commaSeparatedJoiner = new StringJoiner(DELIMITER_COMMA);
+ commaSeparatedJoiner.setEmptyValue(EMPTY_JOINER);
+
+ assertEquals(commaSeparatedJoiner.toString(), EMPTY_JOINER);
+ }
+
+ @Test
+ public void whenJoinerWithPrefixSuffixWithEmptyValue_thenReturnDefault() {
+ StringJoiner commaSeparatedPrefixSuffixJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX);
+ commaSeparatedPrefixSuffixJoiner.setEmptyValue(EMPTY_JOINER);
+
+ assertEquals(commaSeparatedPrefixSuffixJoiner.toString(), EMPTY_JOINER);
+ }
+
+ @Test
+ public void whenAddElements_thenJoinElements() {
+ StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX);
+ rgbJoiner.add("Red")
+ .add("Green")
+ .add("Blue");
+
+ assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
+ }
+
+ @Test
+ public void whenAddListElements_thenJoinListElements() {
+ List rgbList = new ArrayList();
+ rgbList.add("Red");
+ rgbList.add("Green");
+ rgbList.add("Blue");
+
+ StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX);
+
+ for (String color : rgbList) {
+ rgbJoiner.add(color);
+ }
+
+ assertEquals(rgbJoiner.toString(), "[Red,Green,Blue]");
+ }
+
+ @Test
+ public void whenMergeJoiners_thenReturnMerged() {
+ StringJoiner rgbJoiner = new StringJoiner(DELIMITER_COMMA, PREFIX, SUFFIX);
+ StringJoiner cmybJoiner = new StringJoiner(DELIMITER_HYPHEN, PREFIX, SUFFIX);
+
+ rgbJoiner.add("Red")
+ .add("Green")
+ .add("Blue");
+ cmybJoiner.add("Cyan")
+ .add("Magenta")
+ .add("Yellow")
+ .add("Black");
+
+ rgbJoiner.merge(cmybJoiner);
+
+ assertEquals(rgbJoiner.toString(), "[Red,Green,Blue,Cyan-Magenta-Yellow-Black]");
+ }
+
+ @Test
+ public void whenUsedWithinCollectors_thenJoin() {
+ List rgbList = Arrays.asList("Red", "Green", "Blue");
+ String commaSeparatedRGB = rgbList.stream()
+ .map(color -> color.toString())
+ .collect(Collectors.joining(","));
+
+ assertEquals(commaSeparatedRGB, "Red,Green,Blue");
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java b/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
index 7b5f781620..513f163da8 100644
--- a/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
+++ b/core-java-8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterTest.java
@@ -1,7 +1,6 @@
package com.baeldung.temporaladjusters;
import com.baeldung.temporaladjuster.CustomTemporalAdjuster;
-import org.junit.Assert;
import org.junit.Test;
import java.time.LocalDate;
diff --git a/core-java-9/README.md b/core-java-9/README.md
index ce8a140dc0..575376ccb7 100644
--- a/core-java-9/README.md
+++ b/core-java-9/README.md
@@ -19,3 +19,4 @@
- [Java 9 java.util.Objects Additions](http://www.baeldung.com/java-9-objects-new)
- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string)
- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime)
+- [Java 9 Variable Handles Demistyfied](http://www.baeldung.com/java-variable-handles)
diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml
index f6792fdbd9..0f43265916 100644
--- a/core-java-9/pom.xml
+++ b/core-java-9/pom.xml
@@ -2,10 +2,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.baeldung
- core-java9
+ core-java-9
0.2-SNAPSHOT
- core-java9
+ core-java-9
@@ -90,7 +90,7 @@
1.7.21
1.2.1
- 3.6.0
+ 3.7.0
2.19.1
diff --git a/core-java-sun/pom.xml b/core-java-sun/pom.xml
index 3997f47d19..11aa21f44d 100644
--- a/core-java-sun/pom.xml
+++ b/core-java-sun/pom.xml
@@ -483,7 +483,7 @@
1.7.0
- 3.6.0
+ 3.7.0
2.19.1
\ No newline at end of file
diff --git a/core-java/README.md b/core-java/README.md
index ae9e0d96c4..94d203533e 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -126,3 +126,10 @@
- [Java – Append Data to a File](http://www.baeldung.com/java-append-to-file)
- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque)
- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter)
+- [Batch Processing in JDBC](http://www.baeldung.com/jdbc-batch-processing)
+- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
+- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
+- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
+- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
+- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree)
+- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
diff --git a/core-java/pom.xml b/core-java/pom.xml
index 068a772c43..5c1e9fcad0 100644
--- a/core-java/pom.xml
+++ b/core-java/pom.xml
@@ -1,496 +1,505 @@
- 4.0.0
- com.baeldung
- core-java
- 0.1.0-SNAPSHOT
- jar
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ com.baeldung
+ core-java
+ 0.1.0-SNAPSHOT
+ jar
- core-java
+ core-java
-
+
-
-
- net.sourceforge.collections
- collections-generic
- ${collections-generic.version}
-
-
- com.google.guava
- guava
- ${guava.version}
-
+
+
+ net.sourceforge.collections
+ collections-generic
+ ${collections-generic.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
-
- commons-io
- commons-io
- ${commons-io.version}
-
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
-
- org.decimal4j
- decimal4j
- ${decimal4j.version}
-
+
+ org.decimal4j
+ decimal4j
+ ${decimal4j.version}
+
-
- org.bouncycastle
- bcprov-jdk15on
- ${bouncycastle.version}
-
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
-
- org.unix4j
- unix4j-command
- ${unix4j.version}
-
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
-
-
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
+
-
+
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
-
-
- log4j
- log4j
- 1.2.17
-
-
- org.slf4j
- slf4j-api
- ${org.slf4j.version}
-
-
- ch.qos.logback
- logback-classic
- ${logback.version}
-
-
-
- org.slf4j
- jcl-over-slf4j
- ${org.slf4j.version}
-
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
+
+
+ log4j
+ log4j
+ 1.2.17
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
-
+
-
- org.hamcrest
- hamcrest-all
- 1.3
- test
-
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+ test
+
-
- junit
- junit
- ${junit.version}
- test
-
+
+ junit
+ junit
+ ${junit.version}
+ test
+
-
- org.hamcrest
- hamcrest-core
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-library
- ${org.hamcrest.version}
- test
-
+
+ org.hamcrest
+ hamcrest-core
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
-
- org.javamoney
- moneta
- 1.1
-
+
+ org.javamoney
+ moneta
+ 1.1
+
-
- org.owasp.esapi
- esapi
- 2.1.0.1
-
-
- com.h2database
- h2
- 1.4.196
- runtime
-
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.openjdk.jmh
- jmh-core
- 1.19
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- 1.19
-
-
- org.springframework
- spring-web
- 4.3.4.RELEASE
-
+
+ org.owasp.esapi
+ esapi
+ 2.1.0.1
+
+
+ com.sun.messaging.mq
+ fscontext
+ ${fscontext.version}
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.19
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.19
+
+ org.springframework
+ spring-web
+ 4.3.4.RELEASE
+
+
org.springframework.boot
spring-boot-starter
1.5.8.RELEASE
+
+ org.hsqldb
+ hsqldb
+ 2.4.0
+ runtime
+
+
-
+
+ core-java
+
+
+ src/main/resources
+ true
+
+
-
- core-java
-
-
- src/main/resources
- true
-
-
+
-
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+
+
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
-
-
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*LiveTest.java
+ **/*IntegrationTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+
+ true
+
+
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
-
+
+ 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-dependency-plugin
-
-
- copy-dependencies
- prepare-package
-
- copy-dependencies
-
-
- ${project.build.directory}/libs
-
-
-
-
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.basedir}
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+ jar-with-dependencies
+
+
+
+
+
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
-
- true
- libs/
- org.baeldung.executable.ExecutableMavenJar
-
-
-
-
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+ shade
+
+
+ true
+
+
+ org.baeldung.executable.ExecutableMavenJar
+
+
+
+
+
+
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- package
-
- single
-
-
- ${project.basedir}
-
-
- org.baeldung.executable.ExecutableMavenJar
-
-
-
- jar-with-dependencies
-
-
-
-
-
+
+ com.jolira
+ onejar-maven-plugin
+
+
+
+ org.baeldung.executable.ExecutableMavenJar
+ true
+ ${project.build.finalName}-onejar.${project.packaging}
+
+
+ one-jar
+
+
+
+
-
- org.apache.maven.plugins
- maven-shade-plugin
-
-
-
- shade
-
-
- true
-
-
- org.baeldung.executable.ExecutableMavenJar
-
-
-
-
-
-
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+ spring-boot
+ 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
-
-
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- 1.6.0
-
- java
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
- -Xmx300m
- -XX:+UseParallelGC
- -classpath
-
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
-
-
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 1.6.0
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.0.0-M1
+
+ 1.8
+ 1.8
+
+
-
+
-
+
-
-
- integration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
-
-
- **/*IntegrationTest.java
-
-
-
-
-
-
- json
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
-
-
- run-benchmarks
-
- none
-
- exec
-
-
- test
- java
-
- -classpath
-
- org.openjdk.jmh.Main
- .*
-
-
-
-
-
-
-
-
-
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
-
-
- 2.8.5
+
+
+ 2.8.5
-
- 1.7.21
- 1.1.7
+
+ 1.7.21
+ 1.1.7
-
- 22.0
- 3.5
- 1.55
- 1.10
- 3.6.1
- 1.0.3
- 2.5
- 4.1
- 4.01
- 0.4
- 1.8.7
- 1.16.12
- 4.6-b01
- 1.13
- 0.6.5
- 0.9.0
+
+ 22.0
+ 3.5
+ 1.55
+ 1.10
+ 3.6.1
+ 1.0.3
+ 2.5
+ 4.1
+ 4.01
+ 0.4
+ 1.8.7
+ 1.16.12
+ 4.6-b01
+ 1.13
+ 0.6.5
+ 0.9.0
+
+
+ 1.3
+ 4.12
+ 2.8.9
+ 3.6.1
+ 1.7.0
-
- 1.3
- 4.12
- 2.8.9
- 3.6.1
- 1.7.0
-
-
- 3.6.0
- 2.19.1
-
-
+
+ 3.7.0
+ 2.19.1
+
+
\ No newline at end of file
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java
index 7f7fcbb5a8..86438baf1a 100644
--- a/core-java/src/main/java/com/baeldung/array/ArrayInverter.java
+++ b/core-java/src/main/java/com/baeldung/array/ArrayInverter.java
@@ -25,7 +25,9 @@ public class ArrayInverter {
}
public Object[] invertUsingStreams(final Object[] array) {
- return IntStream.range(1, array.length + 1).mapToObj(i -> array[array.length - i]).toArray();
+ return IntStream.rangeClosed(1, array.length)
+ .mapToObj(i -> array[array.length - i])
+ .toArray();
}
public void invertUsingCommonsLang(Object[] array) {
diff --git a/core-java/src/main/java/com/baeldung/cipher/Encryptor.java b/core-java/src/main/java/com/baeldung/cipher/Encryptor.java
new file mode 100644
index 0000000000..901975a5d6
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/cipher/Encryptor.java
@@ -0,0 +1,35 @@
+package com.baeldung.cipher;
+
+import javax.crypto.*;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.Certificate;
+
+public class Encryptor {
+
+ public byte[] encryptMessage(byte[] message, byte[] keyBytes) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
+ cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+ byte[] encryptedMessage = cipher.doFinal(message);
+ return encryptedMessage;
+ }
+
+ public byte[] encryptMessage(byte[] message, Certificate publicKeyCertificate) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
+ Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, publicKeyCertificate);
+ byte[] encryptedMessage = cipher.doFinal(message);
+ return encryptedMessage;
+ }
+
+ public byte[] decryptMessage(byte[] encryptedMessage, byte[] keyBytes) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
+ cipher.init(Cipher.DECRYPT_MODE, secretKey);
+ byte[] clearMessage = cipher.doFinal(encryptedMessage);
+ return clearMessage;
+ }
+
+
+}
diff --git a/core-java/src/main/java/com/baeldung/initializationguide/User.java b/core-java/src/main/java/com/baeldung/initializationguide/User.java
new file mode 100644
index 0000000000..e2e3f051dd
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/initializationguide/User.java
@@ -0,0 +1,53 @@
+package com.baeldung.initializationguide;
+
+import java.io.Serializable;
+
+public class User implements Serializable, Cloneable {
+ private static final long serialVersionUID = 1L;
+ static String forum;
+ private String name;
+ private int id;
+
+ {
+ id = 0;
+ System.out.println("Instance Initializer");
+ }
+
+ static {
+ forum = "Java";
+ System.out.println("Static Initializer");
+ }
+
+ public User(String name, int id) {
+ super();
+ this.name = name;
+ this.id = id;
+ }
+
+ public User() {
+ System.out.println("Constructor");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ return this;
+ }
+
+}
+
diff --git a/core-java/src/main/java/com/baeldung/javadoc/Person.java b/core-java/src/main/java/com/baeldung/javadoc/Person.java
new file mode 100644
index 0000000000..5efb410de4
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/javadoc/Person.java
@@ -0,0 +1,22 @@
+package com.baeldung.javadoc;
+
+public class Person {
+ /**
+ * This is a first name
+ */
+ private String firstName;
+ private String lastName;
+
+ public String getFirstName() {
+ return firstName;
+ }
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+ public String getLastName() {
+ return lastName;
+ }
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java b/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java
new file mode 100644
index 0000000000..029a779cdb
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/javadoc/SuperHero.java
@@ -0,0 +1,64 @@
+package com.baeldung.javadoc;
+
+/**
+ * Hero is the main entity we will be using to . . .
+ * @author Captain America
+ *
+ */
+public class SuperHero extends Person {
+
+ /**
+ * The public name of a hero that is common knowledge
+ */
+ private String heroName;
+ private String uniquePower;
+ private int health;
+ private int defense;
+
+ /**
+ * This is a simple description of the method. . .
+ * Superman!
+ *
+ * @param incomingDamage the amount of incoming damage
+ * @return the amount of health hero has after attack
+ * @see HERO-402
+ * @since 1.0
+ */
+ public int successfullyAttacked(int incomingDamage, String damageType) {
+ // do things
+ return 0;
+ }
+
+ public String getHeroName() {
+ return heroName;
+ }
+
+ public void setHeroName(String heroName) {
+ this.heroName = heroName;
+ }
+
+ public String getUniquePower() {
+ return uniquePower;
+ }
+
+ public void setUniquePower(String uniquePower) {
+ this.uniquePower = uniquePower;
+ }
+
+ public int getHealth() {
+ return health;
+ }
+
+ public void setHealth(int health) {
+ this.health = health;
+ }
+
+ public int getDefense() {
+ return defense;
+ }
+
+ public void setDefense(int defense) {
+ this.defense = defense;
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java
new file mode 100644
index 0000000000..d5c53c3ffc
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/jdbc/BatchProcessing.java
@@ -0,0 +1,96 @@
+package com.baeldung.jdbc;
+
+import java.sql.*;
+import java.util.UUID;
+
+public class BatchProcessing {
+
+ private final String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"};
+ private final String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"};
+ private final String[] ADDRESSES = new String[]{"China","York","Diego","Carolina","India"};
+
+ private Connection connection;
+
+ public void getConnection(){
+ try {
+ Class.forName("org.hsqldb.jdbcDriver");
+ connection = DriverManager.getConnection("jdbc:hsqldb:file:C:\\EMPLOYEEDB", "SA", "");
+ connection.setAutoCommit(false);
+ } catch (Exception e) {
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public void createTables(){
+ try {
+ connection.createStatement().executeUpdate("create table EMPLOYEE (ID VARCHAR(36), NAME VARCHAR(45), DESIGNATION VARCHAR(15))");
+ connection.createStatement().executeUpdate("create table EMP_ADDRESS (ID VARCHAR(36), EMP_ID VARCHAR(36), ADDRESS VARCHAR(45))");
+ System.out.println("Tables Created!!!");
+ } catch (SQLException e) {
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public void useStatement(){
+ try {
+ String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES ('%s','%s','%s');";
+ String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES ('%s','%s','%s');";
+ Statement statement = connection.createStatement();
+ for(int i = 0; i < EMPLOYEES.length; i++){
+ String employeeId = UUID.randomUUID().toString();
+ statement.addBatch(String.format(insertEmployeeSQL, employeeId, EMPLOYEES[i],DESIGNATIONS[i]));
+ statement.addBatch(String.format(insertEmployeeAddrSQL, UUID.randomUUID().toString(),employeeId,ADDRESSES[i]));
+ }
+ statement.executeBatch();
+ connection.commit();
+ } catch (Exception e) {
+ try {
+ connection.rollback();
+ } catch (SQLException ex) {
+ System.out.println("Error during rollback");
+ System.out.println(ex.getMessage());
+ }
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public void usePreparedStatement(){
+ try {
+ String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);";
+ String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);";
+ PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);
+ PreparedStatement empAddressStmt = connection.prepareStatement(insertEmployeeAddrSQL);
+ for(int i = 0; i < EMPLOYEES.length; i++){
+ String employeeId = UUID.randomUUID().toString();
+ employeeStmt.setString(1,employeeId);
+ employeeStmt.setString(2,EMPLOYEES[i]);
+ employeeStmt.setString(3,DESIGNATIONS[i]);
+ employeeStmt.addBatch();
+
+ empAddressStmt.setString(1,UUID.randomUUID().toString());
+ empAddressStmt.setString(2,employeeId);
+ empAddressStmt.setString(3,ADDRESSES[i]);
+ empAddressStmt.addBatch();
+ }
+ employeeStmt.executeBatch();
+ empAddressStmt.executeBatch();
+ connection.commit();
+ } catch (Exception e) {
+ try {
+ connection.rollback();
+ } catch (SQLException ex) {
+ System.out.println("Error during rollback");
+ System.out.println(ex.getMessage());
+ }
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public static void main(String[] args) {
+ BatchProcessing batchProcessing = new BatchProcessing();
+ batchProcessing.getConnection();
+ batchProcessing.createTables();
+ batchProcessing.useStatement();
+ batchProcessing.usePreparedStatement();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java b/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java
index a9f055f8f4..d2f9f0459c 100644
--- a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java
+++ b/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java
@@ -16,7 +16,7 @@ public class EchoMultiServer {
try {
serverSocket = new ServerSocket(port);
while (true)
- new EchoClientHandler(serverSocket.accept()).run();
+ new EchoClientHandler(serverSocket.accept()).start();
} catch (IOException e) {
e.printStackTrace();
diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
new file mode 100644
index 0000000000..e9c8056ff5
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
@@ -0,0 +1,22 @@
+package com.baeldung.threadlocalrandom;
+
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+public class ThreadLocalRandomBenchMarkRunner {
+
+ public static void main(String[] args) throws Exception {
+
+ Options options = new OptionsBuilder().include(ThreadLocalRandomBenchMarker.class.getSimpleName())
+ .threads(1)
+ .forks(1)
+ .shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server")
+ .build();
+
+ new Runner(options).run();
+
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
new file mode 100644
index 0000000000..8a0e2d2826
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
@@ -0,0 +1,64 @@
+package com.baeldung.threadlocalrandom;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+@BenchmarkMode(Mode.AverageTime)
+@Warmup(iterations = 1)
+@OutputTimeUnit(TimeUnit.MICROSECONDS)
+@State(Scope.Benchmark)
+public class ThreadLocalRandomBenchMarker {
+
+ List> randomCallables = new ArrayList<>();
+ List> threadLocalRandomCallables = new ArrayList<>();
+
+ @Setup(Level.Iteration)
+ public void init() {
+ Random random = new Random();
+ randomCallables = new ArrayList<>();
+ threadLocalRandomCallables = new ArrayList<>();
+ for (int i = 0; i < 1000; i++) {
+ randomCallables.add(() -> {
+ return random.nextInt();
+ });
+ }
+
+ for (int i = 0; i < 1000; i++) {
+ threadLocalRandomCallables.add(() -> {
+ return ThreadLocalRandom.current()
+ .nextInt();
+ });
+ }
+ }
+
+ @Benchmark
+ public void randomValuesUsingRandom() throws InterruptedException {
+ ExecutorService executor = Executors.newWorkStealingPool();
+ executor.invokeAll(randomCallables);
+ executor.shutdown();
+ }
+
+ @Benchmark
+ public void randomValuesUsingThreadLocalRandom() throws InterruptedException {
+ ExecutorService executor = Executors.newWorkStealingPool();
+ executor.invokeAll(threadLocalRandomCallables);
+ executor.shutdown();
+ }
+
+}
diff --git a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java
index 285dc12219..e3179dca32 100644
--- a/core-java/src/main/java/com/baeldung/tree/BinaryTree.java
+++ b/core-java/src/main/java/com/baeldung/tree/BinaryTree.java
@@ -8,15 +8,7 @@ public class BinaryTree {
Node root;
public void add(int value) {
-
- Node newNode = new Node(value);
-
- if (root == null) {
- root = newNode;
- return;
- }
-
- addRecursive(root, value);
+ root = addRecursive(root, value);
}
private Node addRecursive(Node current, int value) {
@@ -27,34 +19,41 @@ public class BinaryTree {
if (value < current.value) {
current.left = addRecursive(current.left, value);
- } else {
+ } else if (value > current.value) {
current.right = addRecursive(current.right, value);
}
return current;
-
}
public boolean isEmpty() {
return root == null;
}
+ public int getSize() {
+ return getSizeRecursive(root);
+ }
+
+ private int getSizeRecursive(Node current) {
+ return current == null ? 0 : getSizeRecursive(current.left) + 1 + getSizeRecursive(current.right);
+ }
+
public boolean containsNode(int value) {
return containsNodeRecursive(root, value);
}
private boolean containsNodeRecursive(Node current, int value) {
-
if (current == null) {
return false;
- } else if (value == current.value) {
- return true;
- } else if (value < current.value) {
- return containsNodeRecursive(current.left, value);
- } else {
- return containsNodeRecursive(current.right, value);
}
+ if (value == current.value) {
+ return true;
+ }
+
+ return value < current.value
+ ? containsNodeRecursive(current.left, value)
+ : containsNodeRecursive(current.right, value);
}
public void delete(int value) {
@@ -86,23 +85,18 @@ public class BinaryTree {
current.value = smallestValue;
current.right = deleteRecursive(current.right, smallestValue);
return current;
-
- } else if (value < current.value) {
+ }
+ if (value < current.value) {
current.left = deleteRecursive(current.left, value);
return current;
- } else {
- current.right = deleteRecursive(current.right, value);
- return current;
}
+
+ current.right = deleteRecursive(current.right, value);
+ return current;
}
private int findSmallestValue(Node root) {
-
- if (root.left == null) {
- return root.value;
- }
-
- return findSmallestValue(root.left);
+ return root.left == null ? root.value : findSmallestValue(root.left);
}
public void traverseInOrder(Node node) {
@@ -125,12 +119,15 @@ public class BinaryTree {
if (node != null) {
traversePostOrder(node.left);
traversePostOrder(node.right);
-
System.out.print(" " + node.value);
}
}
public void traverseLevelOrder() {
+ if (root == null) {
+ return;
+ }
+
Queue nodes = new LinkedList<>();
nodes.add(root);
diff --git a/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java b/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java
new file mode 100644
index 0000000000..ba8d2ed96f
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.cipher;
+
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class EncryptorUnitTest {
+ private String encKeyString;
+ private String message;
+ private String certificateString;
+ private Encryptor encryptor;
+
+ @Before
+ public void init(){
+ encKeyString = "1234567890123456";
+ message = "This is a secret message";
+ encryptor = new Encryptor();
+ certificateString = "-----BEGIN CERTIFICATE-----\n" +
+ "MIICVjCCAb8CAg37MA0GCSqGSIb3DQEBBQUAMIGbMQswCQYDVQQGEwJKUDEOMAwG\n" +
+ "A1UECBMFVG9reW8xEDAOBgNVBAcTB0NodW8ta3UxETAPBgNVBAoTCEZyYW5rNERE\n" +
+ "MRgwFgYDVQQLEw9XZWJDZXJ0IFN1cHBvcnQxGDAWBgNVBAMTD0ZyYW5rNEREIFdl\n" +
+ "YiBDQTEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBmcmFuazRkZC5jb20wHhcNMTIw\n" +
+ "ODIyMDUyNzIzWhcNMTcwODIxMDUyNzIzWjBKMQswCQYDVQQGEwJKUDEOMAwGA1UE\n" +
+ "CAwFVG9reW8xETAPBgNVBAoMCEZyYW5rNEREMRgwFgYDVQQDDA93d3cuZXhhbXBs\n" +
+ "ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYBBrx5PlP0WNI/ZdzD\n" +
+ "+6Pktmurn+F2kQYbtc7XQh8/LTBvCo+P6iZoLEmUA9e7EXLRxgU1CVqeAi7QcAn9\n" +
+ "MwBlc8ksFJHB0rtf9pmf8Oza9E0Bynlq/4/Kb1x+d+AyhL7oK9tQwB24uHOueHi1\n" +
+ "C/iVv8CSWKiYe6hzN1txYe8rAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAASPdjigJ\n" +
+ "kXCqKWpnZ/Oc75EUcMi6HztaW8abUMlYXPIgkV2F7YanHOB7K4f7OOLjiz8DTPFf\n" +
+ "jC9UeuErhaA/zzWi8ewMTFZW/WshOrm3fNvcMrMLKtH534JKvcdMg6qIdjTFINIr\n" +
+ "evnAhf0cwULaebn+lMs8Pdl7y37+sfluVok=\n" +
+ "-----END CERTIFICATE-----";
+ }
+
+ @Test
+ public void givenEncryptionKey_whenMessageIsPassedToEncryptor_thenMessageIsEncrypted() throws Exception {
+ byte[] encryptedMessage = encryptor.encryptMessage(message.getBytes(),encKeyString.getBytes());
+
+ assertThat(encryptedMessage).isNotNull();
+ assertThat(encryptedMessage.length % 32).isEqualTo(0);
+ }
+
+ @Test
+ public void givenCertificateWithPublicKey_whenMessageIsPassedToEncryptor_thenMessageIsEncrypted() throws Exception {
+ CertificateFactory factory = CertificateFactory.getInstance("X.509");
+ InputStream is = new ByteArrayInputStream(certificateString.getBytes());
+ X509Certificate certificate = (X509Certificate) factory.generateCertificate(is);
+
+ byte[] encryptedMessage = encryptor.encryptMessage(message.getBytes(),certificate);
+
+ assertThat(encryptedMessage).isNotNull();
+ assertThat(encryptedMessage.length % 128).isEqualTo(0);
+ }
+
+ @Test
+ public void givenEncryptionKey_whenMessageIsEncrypted_thenDecryptMessage() throws Exception{
+ byte[] encryptedMessageBytes = encryptor.encryptMessage(message.getBytes(),encKeyString.getBytes());
+
+ byte[] clearMessageBytes = encryptor.decryptMessage(encryptedMessageBytes, encKeyString.getBytes());
+
+ assertThat(message).isEqualTo(new String(clearMessageBytes));
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
new file mode 100644
index 0000000000..f2dfc992c2
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
@@ -0,0 +1,60 @@
+package com.baeldung.collection;
+
+import java.util.ConcurrentModificationException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WhenComparingTreeMapVsHashMap {
+
+ @Test
+ public void whenInsertObjectsTreeMap_thenNaturalOrder() {
+ Map treemap = new TreeMap<>();
+ treemap.put(3, "TreeMap");
+ treemap.put(2, "vs");
+ treemap.put(1, "HashMap");
+ Assert.assertThat(treemap.keySet(), Matchers.contains(1, 2, 3));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void whenInsertNullInTreeMap_thenException() {
+ Map treemap = new TreeMap<>();
+ treemap.put(null, "NullPointerException");
+ }
+
+ @Test
+ public void whenInsertObjectsHashMap_thenRandomOrder() {
+ Map hashmap = new HashMap<>();
+ hashmap.put(3, "TreeMap");
+ hashmap.put(2, "vs");
+ hashmap.put(1, "HashMap");
+ Assert.assertThat(hashmap.keySet(), Matchers.containsInAnyOrder(1, 2, 3));
+ }
+
+ @Test
+ public void whenInsertNullInHashMap_thenInsertsNull() {
+ Map hashmap = new HashMap<>();
+ hashmap.put(null, null);
+ Assert.assertNull(hashmap.get(null));
+ }
+
+ @Test
+ public void givenHashMapAndTreeMap_whenputDuplicates_thenOnlyUnique() {
+ Map treeMap = new HashMap<>();
+ treeMap.put(1, "Baeldung");
+ treeMap.put(1, "Baeldung");
+
+ Assert.assertTrue(treeMap.size() == 1);
+
+ Map treeMap2 = new TreeMap<>();
+ treeMap2.put(1, "Baeldung");
+ treeMap2.put(1, "Baeldung");
+
+ Assert.assertTrue(treeMap2.size() == 1);
+ }
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java b/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java
new file mode 100644
index 0000000000..8d352ba706
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/initializationguide/UserTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.initializationguide;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class UserTest {
+
+ @Test
+ public void givenUserInstance_whenIntializedWithNew_thenInstanceIsNotNull() {
+ User user = new User("Alice", 1);
+ assertThat(user).isNotNull();
+ }
+
+ @Test
+ public void givenUserInstance_whenInitializedWithReflection_thenInstanceIsNotNull() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+ User user = User.class.getConstructor(String.class, int.class)
+ .newInstance("Alice", 2);
+ assertThat(user).isNotNull();
+ }
+
+ @Test
+ public void givenUserInstance_whenCopiedWithClone_thenExactMatchIsCreated() throws CloneNotSupportedException {
+ User user = new User("Alice", 3);
+ User clonedUser = (User) user.clone();
+ assertThat(clonedUser).isEqualTo(user);
+ }
+
+ @Test
+ public void givenUserInstance_whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault() {
+ User user = new User();
+ assertThat(user.getName()).isNull();
+ assertThat(user.getId() == 0);
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java
new file mode 100644
index 0000000000..90f2ea133f
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/jdbc/BatchProcessingTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.jdbc;
+
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.Statement;
+
+@RunWith(MockitoJUnitRunner.class)
+public class BatchProcessingTest {
+
+
+ @InjectMocks
+ private BatchProcessing target = new BatchProcessing();
+
+ @Mock
+ private Connection connection;
+
+ @Mock
+ private Statement statement;
+
+ @Mock
+ private PreparedStatement employeeStatement;
+
+ @Mock
+ private PreparedStatement employeeAddressStatement;
+
+ @Before
+ public void before(){
+ MockitoAnnotations.initMocks(this);
+ }
+
+
+ @Test
+ public void when_useStatement_thenInsertData_success() throws Exception {
+ Mockito.when(connection.createStatement()).thenReturn(statement);
+ target.useStatement();
+ }
+
+ @Test
+ public void when_useStatement_ifThrowException_thenCatchException() throws Exception {
+ Mockito.when(connection.createStatement()).thenThrow(new RuntimeException());
+ target.useStatement();
+ }
+
+ @Test
+ public void when_usePreparedStatement_thenInsertData_success() throws Exception {
+ String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);";
+ String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);";
+ Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement);
+ Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenReturn(employeeAddressStatement);
+ target.usePreparedStatement();
+ }
+
+ @Test
+ public void when_usePreparedStatement_ifThrowException_thenCatchException() throws Exception {
+ String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?);";
+ String insertEmployeeAddrSQL = "INSERT INTO EMP_ADDRESS(ID, EMP_ID, ADDRESS) VALUES (?,?,?);";
+ Mockito.when(connection.prepareStatement(insertEmployeeSQL)).thenReturn(employeeStatement);
+ Mockito.when(connection.prepareStatement(insertEmployeeAddrSQL)).thenThrow(new RuntimeException());
+ target.usePreparedStatement();
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomTest.java b/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomTest.java
new file mode 100644
index 0000000000..c75813baba
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.threadlocalrandom;
+
+import java.util.concurrent.ThreadLocalRandom;
+
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class ThreadLocalRandomTest {
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomIntBounded_thenCorrect() {
+ int leftLimit = 1;
+ int rightLimit = 100;
+ int generatedInt = ThreadLocalRandom.current().nextInt(leftLimit, rightLimit);
+
+ assertTrue(generatedInt < rightLimit && generatedInt >= leftLimit);
+ }
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomIntUnbounded_thenCorrect() {
+ int generatedInt = ThreadLocalRandom.current().nextInt();
+
+ assertTrue(generatedInt < Integer.MAX_VALUE && generatedInt >= Integer.MIN_VALUE);
+ }
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomLongBounded_thenCorrect() {
+ long leftLimit = 1L;
+ long rightLimit = 100L;
+ long generatedLong = ThreadLocalRandom.current().nextLong(leftLimit, rightLimit);
+
+ assertTrue(generatedLong < rightLimit && generatedLong >= leftLimit);
+ }
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomLongUnbounded_thenCorrect() {
+ long generatedInt = ThreadLocalRandom.current().nextLong();
+
+ assertTrue(generatedInt < Long.MAX_VALUE && generatedInt >= Long.MIN_VALUE);
+ }
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomDoubleBounded_thenCorrect() {
+ double leftLimit = 1D;
+ double rightLimit = 100D;
+ double generatedInt = ThreadLocalRandom.current().nextDouble(leftLimit, rightLimit);
+
+ assertTrue(generatedInt < rightLimit && generatedInt >= leftLimit);
+ }
+
+ @Test
+ public void givenUsingThreadLocalRandom_whenGeneratingRandomDoubleUnbounded_thenCorrect() {
+ double generatedInt = ThreadLocalRandom.current().nextDouble();
+
+ assertTrue(generatedInt < Double.MAX_VALUE && generatedInt >= Double.MIN_VALUE);
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void givenUsingThreadLocalRandom_whenSettingSeed_thenThrowUnsupportedOperationException() {
+ ThreadLocalRandom.current().setSeed(0l);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java
index 2c20c730df..99e656fe28 100644
--- a/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java
+++ b/core-java/src/test/java/com/baeldung/tree/BinaryTreeTest.java
@@ -1,5 +1,6 @@
package com.baeldung.tree;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -26,6 +27,26 @@ public class BinaryTreeTest {
assertFalse(bt.containsNode(1));
}
+ @Test
+ public void givenABinaryTree_WhenAddingExistingElement_ThenElementIsNotAdded() {
+
+ BinaryTree bt = createBinaryTree();
+
+ int initialSize = bt.getSize();
+
+ assertTrue(bt.containsNode(3));
+ bt.add(3);
+ assertEquals(initialSize, bt.getSize());
+ }
+
+ @Test
+ public void givenABinaryTree_WhenLookingForNonExistingElement_ThenReturnsFalse() {
+
+ BinaryTree bt = createBinaryTree();
+
+ assertFalse(bt.containsNode(99));
+ }
+
@Test
public void givenABinaryTree_WhenDeletingElements_ThenTreeDoesNotContainThoseElements() {
@@ -36,6 +57,19 @@ public class BinaryTreeTest {
assertFalse(bt.containsNode(9));
}
+ @Test
+ public void givenABinaryTree_WhenDeletingNonExistingElement_ThenTreeDoesNotDelete() {
+
+ BinaryTree bt = createBinaryTree();
+
+ int initialSize = bt.getSize();
+
+ assertFalse(bt.containsNode(99));
+ bt.delete(99);
+ assertFalse(bt.containsNode(99));
+ assertEquals(initialSize, bt.getSize());
+ }
+
@Test
public void givenABinaryTree_WhenTraversingInOrder_ThenPrintValues() {
diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml
index e795d1e042..b511f0dd7b 100644
--- a/core-kotlin/pom.xml
+++ b/core-kotlin/pom.xml
@@ -105,7 +105,11 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.5.1
+ 3.7.0
+
+ 1.8
+ 1.8
+
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index 3faef99e8d..af242e5905 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -52,6 +52,7 @@
org.apache.maven.plugins
maven-compiler-plugin
+ 3.7.0
1.8
1.8
diff --git a/eclipse/README.md b/eclipse/README.md
deleted file mode 100644
index ff12555376..0000000000
--- a/eclipse/README.md
+++ /dev/null
@@ -1 +0,0 @@
-## Relevant articles:
diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml
index a9b667baac..b89ff6ed15 100644
--- a/ejb/ejb-session-beans/pom.xml
+++ b/ejb/ejb-session-beans/pom.xml
@@ -82,7 +82,7 @@
maven-compiler-plugin
- 3.1
+ 3.7.0
1.8
1.8
diff --git a/flyway/myFlywayConfig.properties b/flyway/myFlywayConfig.properties
index 8bb102930a..6b11f6f277 100644
--- a/flyway/myFlywayConfig.properties
+++ b/flyway/myFlywayConfig.properties
@@ -1,5 +1,5 @@
-flyway.user=root
-flyway.password=mysql
+flyway.user=sa
+flyway.password=
flyway.schemas=app-db
-flyway.url=jdbc:mysql://localhost:3306/
+flyway.url=jdbc:h2:mem:DATABASE
flyway.locations=filesystem:db/migration
\ No newline at end of file
diff --git a/flyway/pom.xml b/flyway/pom.xml
new file mode 100644
index 0000000000..84009e4579
--- /dev/null
+++ b/flyway/pom.xml
@@ -0,0 +1,76 @@
+
+
+ 4.0.0
+
+ flyway
+ jar
+
+ flyway
+ Flyway Callbacks Demo
+
+
+ parent-boot-5
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-5
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.flywaydb
+ flyway-core
+ 5.0.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ mysql
+ mysql-connector-java
+ 6.0.3
+
+
+
+ com.h2database
+ h2
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.flywaydb
+ flyway-maven-plugin
+ 5.0.2
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java b/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java
new file mode 100644
index 0000000000..6ad4ce510c
--- /dev/null
+++ b/flyway/src/main/java/com/baeldung/flywaycallbacks/ExampleFlywayCallback.java
@@ -0,0 +1,33 @@
+package com.baeldung.flywaycallbacks;
+
+import java.sql.Connection;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.flywaydb.core.api.MigrationInfo;
+import org.flywaydb.core.api.callback.BaseFlywayCallback;
+
+public class ExampleFlywayCallback extends BaseFlywayCallback {
+
+ private Log log = LogFactory.getLog(getClass());
+
+ @Override
+ public void afterEachMigrate(Connection connection, MigrationInfo info) {
+ log.info("> afterEachMigrate");
+ }
+
+ @Override
+ public void afterMigrate(Connection connection) {
+ log.info("> afterMigrate");
+ }
+
+ @Override
+ public void beforeEachMigrate(Connection connection, MigrationInfo info) {
+ log.info("> beforeEachMigrate");
+ }
+
+ @Override
+ public void beforeMigrate(Connection connection) {
+ log.info("> beforeMigrate");
+ }
+}
diff --git a/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java b/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java
new file mode 100644
index 0000000000..34d794f7d1
--- /dev/null
+++ b/flyway/src/main/java/com/baeldung/flywaycallbacks/FlywayApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.flywaycallbacks;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class FlywayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FlywayApplication.class, args);
+ }
+
+}
diff --git a/flyway/src/main/resources/application.properties b/flyway/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql b/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql
new file mode 100644
index 0000000000..7a8f142d22
--- /dev/null
+++ b/flyway/src/main/resources/db/callbacks/beforeEachMigrate.sql
@@ -0,0 +1 @@
+SELECT 1
\ No newline at end of file
diff --git a/flyway/src/main/resources/db/callbacks/beforeMigrate.sql b/flyway/src/main/resources/db/callbacks/beforeMigrate.sql
new file mode 100644
index 0000000000..7a8f142d22
--- /dev/null
+++ b/flyway/src/main/resources/db/callbacks/beforeMigrate.sql
@@ -0,0 +1 @@
+SELECT 1
\ No newline at end of file
diff --git a/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql b/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql
new file mode 100644
index 0000000000..526d8e2aea
--- /dev/null
+++ b/flyway/src/main/resources/db/migration/V1_0__add_table_one.sql
@@ -0,0 +1,5 @@
+create table table_one (
+ id numeric,
+ name varchar(50),
+ constraint pk_table_one primary key (id)
+);
\ No newline at end of file
diff --git a/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql b/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql
new file mode 100644
index 0000000000..d51f4a5d56
--- /dev/null
+++ b/flyway/src/main/resources/db/migration/V1_1__add_table_two.sql
@@ -0,0 +1,5 @@
+create table table_two (
+ id numeric,
+ name varchar(50),
+ constraint pk_table_two primary key (id)
+);
\ No newline at end of file
diff --git a/flyway/src/main/resources/logback.xml b/flyway/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7f4aa46e0d
--- /dev/null
+++ b/flyway/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java
new file mode 100644
index 0000000000..5e96fff64d
--- /dev/null
+++ b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayApplicationTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.flywaycallbacks;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.flywaydb.core.Flyway;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
+@ContextConfiguration(classes = FlywayCallbackTestConfig.class)
+public class FlywayApplicationTest {
+
+ private Log log = LogFactory.getLog(getClass());
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ public void migrateWithNoCallbacks() {
+ logTestBoundary("migrateWithNoCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration");
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithJavaCallbacks() {
+ logTestBoundary("migrateWithJavaCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration");
+ flyway.setCallbacks(new ExampleFlywayCallback());
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithSqlCallbacks() {
+ logTestBoundary("migrateWithSqlCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration", "db/callbacks");
+ flyway.migrate();
+ }
+
+ @Test
+ public void migrateWithSqlAndJavaCallbacks() {
+ logTestBoundary("migrateWithSqlAndJavaCallbacks");
+ Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setLocations("db/migration", "db/callbacks");
+ flyway.setCallbacks(new ExampleFlywayCallback());
+ flyway.migrate();
+ }
+
+ private void logTestBoundary(String testName) {
+ System.out.println("\n");
+ log.info("> " + testName);
+ }
+ }
diff --git a/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java
new file mode 100644
index 0000000000..f64b490dcf
--- /dev/null
+++ b/flyway/src/test/java/com/baeldung/flywaycallbacks/FlywayCallbackTestConfig.java
@@ -0,0 +1,21 @@
+package com.baeldung.flywaycallbacks;
+
+import javax.sql.DataSource;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+@Configuration
+public class FlywayCallbackTestConfig {
+
+ @Bean
+ public DataSource createDatasource() {
+ EmbeddedDatabaseBuilder dbBuilder = new EmbeddedDatabaseBuilder();
+ return dbBuilder.setType(EmbeddedDatabaseType.H2)
+ .setName("DATABASE")
+ .build();
+ }
+
+}
diff --git a/geotools/pom.xml b/geotools/pom.xml
index 37b4a2338a..d0eb787be8 100644
--- a/geotools/pom.xml
+++ b/geotools/pom.xml
@@ -59,6 +59,7 @@
true
org.apache.maven.plugins
maven-compiler-plugin
+ 3.7.0
1.8
1.8
diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml
index d588df4abc..0e227798af 100644
--- a/guest/core-java-9/pom.xml
+++ b/guest/core-java-9/pom.xml
@@ -16,7 +16,7 @@
maven-compiler-plugin
- 3.6.2
+ 3.7.0
1.9
1.9
diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml
index 548d5c663b..222716386b 100644
--- a/guest/core-java/pom.xml
+++ b/guest/core-java/pom.xml
@@ -22,7 +22,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml
index aec7f9228a..37c71e77af 100644
--- a/guest/junit5-example/pom.xml
+++ b/guest/junit5-example/pom.xml
@@ -41,7 +41,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml
index 197f3df2b9..43f1d106f0 100644
--- a/guest/log4j2-example/pom.xml
+++ b/guest/log4j2-example/pom.xml
@@ -39,7 +39,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/logback-example/pom.xml b/guest/logback-example/pom.xml
index 9d88c94197..8ad406fc89 100644
--- a/guest/logback-example/pom.xml
+++ b/guest/logback-example/pom.xml
@@ -30,7 +30,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml
index eada59c5a1..82361779e2 100644
--- a/guest/memory-leaks/pom.xml
+++ b/guest/memory-leaks/pom.xml
@@ -28,7 +28,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/spring-boot-app/pom.xml b/guest/spring-boot-app/pom.xml
index 88b8c229e3..ba57bbd5c5 100644
--- a/guest/spring-boot-app/pom.xml
+++ b/guest/spring-boot-app/pom.xml
@@ -38,7 +38,7 @@
maven-compiler-plugin
- 3.6.1
+ 3.7.0
1.8
1.8
diff --git a/guest/thread-pools/pom.xml b/guest/thread-pools/pom.xml
index 72a10213c4..4588f3da4c 100644
--- a/guest/thread-pools/pom.xml
+++ b/guest/thread-pools/pom.xml
@@ -17,7 +17,7 @@
maven-compiler-plugin
- 3.5.1
+ 3.7.0
1.8
1.8
diff --git a/guest/tomcat-app/pom.xml b/guest/tomcat-app/pom.xml
index e62c6f78d8..2a4bf8ef59 100644
--- a/guest/tomcat-app/pom.xml
+++ b/guest/tomcat-app/pom.xml
@@ -52,7 +52,7 @@
maven-compiler-plugin
- 3.5.1
+ 3.7.0
1.8
1.8
diff --git a/guest/webservices/rest-client/pom.xml b/guest/webservices/rest-client/pom.xml
index af03ac1948..016fa54af7 100644
--- a/guest/webservices/rest-client/pom.xml
+++ b/guest/webservices/rest-client/pom.xml
@@ -8,7 +8,7 @@
maven-compiler-plugin
- 3.5
+ 3.7.0
1.8
1.8
diff --git a/guest/webservices/rest-server/pom.xml b/guest/webservices/rest-server/pom.xml
index 350e7eb9c9..69d370965f 100644
--- a/guest/webservices/rest-server/pom.xml
+++ b/guest/webservices/rest-server/pom.xml
@@ -33,7 +33,7 @@
maven-compiler-plugin
- 3.5.1
+ 3.7.0
1.8
1.8
diff --git a/hibernate5/README.md b/hibernate5/README.md
index d480a7455c..1eb090f05d 100644
--- a/hibernate5/README.md
+++ b/hibernate5/README.md
@@ -4,3 +4,4 @@
- [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers)
- [Hibernate – Mapping Date and Time](http://www.baeldung.com/hibernate-date-time)
- [Hibernate Inheritance Mapping](http://www.baeldung.com/hibernate-inheritance)
+- [A Guide to Multitenancy in Hibernate 5](http://www.baeldung.com/hibernate-5-multitenancy)
diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml
index 3b0b2fcd88..31fe10ee97 100644
--- a/hibernate5/pom.xml
+++ b/hibernate5/pom.xml
@@ -16,7 +16,7 @@
UTF-8
- 3.6.0
+ 3.7.0
5.2.12.Final
6.0.6
2.2.3
@@ -41,7 +41,7 @@
com.h2database
h2
- 1.4.194
+ 1.4.196
org.hibernate
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/App.java b/hibernate5/src/main/java/com/baeldung/hibernate/App.java
deleted file mode 100644
index 26a40bb782..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/App.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.hibernate;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-
-import com.baeldung.hibernate.pojo.Supplier;
-
-/**
- * Hello world!
- *
- */
-public class App {
- public static void main(String[] args) {
- try {
- // NOTE: this is just for boostrap testing for multitenancy.
- System.out.println("Checking the system.");
- SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory();
- Session currentSession = sessionFactory.withOptions().tenantIdentifier("h2db1").openSession();
- Transaction transaction = currentSession.getTransaction();
- transaction.begin();
- currentSession.createCriteria(Supplier.class).list().stream().forEach(System.out::println);
- transaction.commit();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- }
-}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java b/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java
deleted file mode 100644
index b9ed2bd139..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/ConfigurableMultiTenantConnectionProvider.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.baeldung.hibernate;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider;
-import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
-
-public class ConfigurableMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
-
- private final Map connectionProviderMap =
- new HashMap<>();
-
-
- public ConfigurableMultiTenantConnectionProvider(
- Map connectionProviderMap) {
- this.connectionProviderMap.putAll( connectionProviderMap );
- }
- @Override
- protected ConnectionProvider getAnyConnectionProvider() {
- System.out.println("Any");
- return connectionProviderMap.values().iterator().next();
- }
-
- @Override
- protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
- System.out.println("Specific");
- return connectionProviderMap.get( tenantIdentifier );
- }
-
- @Override
- public Connection getConnection(String tenantIdentifier) throws SQLException {
- Connection connection = super.getConnection(tenantIdentifier);
- // uncomment to see option 2 for SCHEMA strategy.
- //connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'");
- return connection;
- }
-
-}
\ No newline at end of file
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java
deleted file mode 100644
index 30f3c3cf53..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateMultiTenantUtil.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.baeldung.hibernate;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.hibernate.SessionFactory;
-import org.hibernate.boot.Metadata;
-import org.hibernate.boot.MetadataSources;
-import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
-import org.hibernate.cfg.AvailableSettings;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
-import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
-import org.hibernate.service.ServiceRegistry;
-
-import com.baeldung.hibernate.pojo.Supplier;
-
-public class HibernateMultiTenantUtil {
- private static SessionFactory sessionFactory;
- private static Map connectionProviderMap = new HashMap<>();
- private static final String[] tenantDBNames = { "mydb1", "mydb2" };
-
- public static SessionFactory getSessionFactory() throws UnsupportedTenancyException, IOException {
- if (sessionFactory == null) {
- // Configuration configuration = new Configuration().configure();
- ServiceRegistry serviceRegistry = configureServiceRegistry();
- sessionFactory = makeSessionFactory(serviceRegistry);
-
- }
- return sessionFactory;
- }
-
- private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
- MetadataSources metadataSources = new MetadataSources(serviceRegistry);
- for (Class annotatedClasses : getAnnotatedClasses()) {
- metadataSources.addAnnotatedClass(annotatedClasses);
- }
-
- Metadata metadata = metadataSources.buildMetadata();
- return metadata.getSessionFactoryBuilder()
- .build();
-
- }
-
- private static Class>[] getAnnotatedClasses() {
- return new Class>[] { Supplier.class };
- }
-
- private static ServiceRegistry configureServiceRegistry() throws UnsupportedTenancyException, IOException {
-
- // Properties properties = configuration.getProperties();
- Properties properties = getProperties();
-
- connectionProviderMap = setUpConnectionProviders(properties, tenantDBNames);
- properties.put(AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER, new ConfigurableMultiTenantConnectionProvider(connectionProviderMap));
-
- return new StandardServiceRegistryBuilder().applySettings(properties)
- .build();
- }
-
- private static Properties getProperties() throws IOException {
- Properties properties = new Properties();
- URL propertiesURL = Thread.currentThread()
- .getContextClassLoader()
- .getResource("hibernate-multitenancy.properties");
- FileInputStream inputStream = new FileInputStream(propertiesURL.getFile());
- properties.load(inputStream);
- System.out.println("LOADED PROPERTIES FROM hibernate.properties");
-
- return properties;
- }
-
- private static Map setUpConnectionProviders(Properties properties, String[] tenantNames) throws UnsupportedTenancyException {
- Map providerMap = new HashMap<>();
- for (String tenant : tenantNames) {
- DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl();
-
- String tenantStrategy = properties.getProperty("hibernate.multiTenancy");
- System.out.println("Strategy:" + tenantStrategy);
- properties.put(Environment.URL, tenantUrl(properties.getProperty(Environment.URL), tenant, tenantStrategy));
- System.out.println("URL:" + properties.getProperty(Environment.URL));
- connectionProvider.configure(properties);
- System.out.println("Tenant:" + tenant);
- providerMap.put(tenant, connectionProvider);
-
- }
- System.out.println("Added connections for:");
- providerMap.keySet()
- .stream()
- .forEach(System.out::println);
- return providerMap;
- }
-
- private static Object tenantUrl(String originalUrl, String tenant, String tenantStrategy) throws UnsupportedTenancyException {
- if (tenantStrategy.toUpperCase()
- .equals("DATABASE")) {
- return originalUrl.replace(DEFAULT_DB_NAME, tenant);
- } else if (tenantStrategy.toUpperCase()
- .equals("SCHEMA")) {
- return originalUrl + String.format(SCHEMA_TOKEN, tenant);
- } else {
- throw new UnsupportedTenancyException("Not yet supported");
- }
- }
-
- public static final String SCHEMA_TOKEN = ";INIT=CREATE SCHEMA IF NOT EXISTS %1$s\\;SET SCHEMA %1$s";
- public static final String DEFAULT_DB_NAME = "mydb1";
-
-}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java
deleted file mode 100644
index 85c96d8b10..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/dao/GenericDao.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.hibernate.dao;
-
-import java.util.List;
-
-public interface GenericDao {
-
- void save (T entity);
- void delete (T Entity);
- T findByName(String name);
- List findAll();
- void populate();
-}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java b/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java
deleted file mode 100644
index c0397ee5bb..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/dao/SupplierDao.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.baeldung.hibernate.dao;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.Criteria;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-import org.hibernate.criterion.Expression;
-
-import com.baeldung.hibernate.pojo.Supplier;
-
-public class SupplierDao implements GenericDao{
- private SessionFactory sessionFactory;
- private String tenant;
-
- public SupplierDao(SessionFactory sessionFactory, String tenant) {
- this.sessionFactory = sessionFactory;
- this.tenant = tenant;
- populate();
- }
-
- @Override
- public void save(Supplier entity) {
- Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
- session.save(entity);
- }
-
- @Override
- public void delete(Supplier supplier) {
- Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
- session.delete(supplier);
- }
-
- @Override
- public Supplier findByName(String name) {
- Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
- List fetchedSuppliers = session.createCriteria(Supplier.class).add(Expression.eq("name", name)).list();
- if (fetchedSuppliers.size()>0) {
- return fetchedSuppliers.get(0);
- }else {
- return null;
- }
- }
-
- @Override
- public List findAll() {
- Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
- return session.createCriteria(Supplier.class).list();
- }
-
- @Override
- public void populate() {
- System.out.println("Init DB1");
- Session session = sessionFactory.withOptions().tenantIdentifier(tenant).openSession();
- Transaction transaction = session.getTransaction();
-
- transaction.begin();
- session.createSQLQuery("DROP ALL OBJECTS").executeUpdate();
- session
- .createSQLQuery(
- "create table Supplier (id integer generated by default as identity, country varchar(255), name varchar(255), primary key (id))")
- .executeUpdate();
- Supplier genertedSupplier = generateEntityForTenant(tenant);
- System.out.println("Inserting Supplier"+genertedSupplier);
- save (genertedSupplier);
-
- }
-
- private Supplier generateEntityForTenant(String forTenant) {
- if (forTenant.equals("mydb1")) {
- return new Supplier ("John","USA");
- }
- return new Supplier ("Miller","UK");
- }
-
-
-
-}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java
new file mode 100644
index 0000000000..1d60ccb6c0
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptor.java
@@ -0,0 +1,32 @@
+package com.baeldung.hibernate.interceptors;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.hibernate.EmptyInterceptor;
+import org.hibernate.type.Type;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.baeldung.hibernate.interceptors.entity.User;
+
+public class CustomInterceptor extends EmptyInterceptor {
+ private static final Logger logger = LoggerFactory.getLogger(CustomInterceptor.class);
+
+ @Override
+ public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
+ if (entity instanceof User) {
+ logger.info(((User) entity).toString());
+ }
+ return super.onSave(entity, id, state, propertyNames, types);
+ }
+
+ @Override
+ public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object [] previousState, String[] propertyNames, Type[] types) {
+ if (entity instanceof User) {
+ ((User) entity).setLastModified(new Date());
+ logger.info(((User) entity).toString());
+ }
+ return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types);
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java
new file mode 100644
index 0000000000..a84a981f7f
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/CustomInterceptorImpl.java
@@ -0,0 +1,122 @@
+package com.baeldung.hibernate.interceptors;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+import org.hibernate.CallbackException;
+import org.hibernate.EntityMode;
+import org.hibernate.Interceptor;
+import org.hibernate.Transaction;
+import org.hibernate.type.Type;
+
+public class CustomInterceptorImpl implements Interceptor {
+
+ @Override
+ public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) throws CallbackException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void preFlush(Iterator entities) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void postFlush(Iterator entities) throws CallbackException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Boolean isTransient(Object entity) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int[] findDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getEntityName(Object object) throws CallbackException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object getEntity(String entityName, Serializable id) throws CallbackException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void afterTransactionBegin(Transaction tx) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void beforeTransactionCompletion(Transaction tx) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void afterTransactionCompletion(Transaction tx) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public String onPrepareStatement(String sql) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java
new file mode 100644
index 0000000000..11dce698ca
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/HibernateUtil.java
@@ -0,0 +1,79 @@
+package com.baeldung.hibernate.interceptors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.Interceptor;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.SessionFactoryBuilder;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.service.ServiceRegistry;
+
+import com.baeldung.hibernate.interceptors.entity.User;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+
+public class HibernateUtil {
+ private static SessionFactory sessionFactory;
+ private static String PROPERTY_FILE_NAME;
+
+ public static SessionFactory getSessionFactory() throws IOException {
+ return getSessionFactory(null);
+ }
+
+ public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ if (sessionFactory == null) {
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ sessionFactory = getSessionFactoryBuilder(serviceRegistry).build();
+ }
+ return sessionFactory;
+ }
+
+ public static SessionFactory getSessionFactoryWithInterceptor(String propertyFileName, Interceptor interceptor) throws IOException {
+ PROPERTY_FILE_NAME = propertyFileName;
+ if (sessionFactory == null) {
+ ServiceRegistry serviceRegistry = configureServiceRegistry();
+ sessionFactory = getSessionFactoryBuilder(serviceRegistry).applyInterceptor(interceptor)
+ .build();
+ }
+ return sessionFactory;
+ }
+
+ public static Session getSessionWithInterceptor(Interceptor interceptor) throws IOException {
+ return getSessionFactory().withOptions()
+ .interceptor(interceptor)
+ .openSession();
+ }
+
+ private static SessionFactoryBuilder getSessionFactoryBuilder(ServiceRegistry serviceRegistry) {
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addPackage("com.baeldung.hibernate.interceptors");
+ metadataSources.addAnnotatedClass(User.class);
+
+ Metadata metadata = metadataSources.buildMetadata();
+ return metadata.getSessionFactoryBuilder();
+
+ }
+
+ private static ServiceRegistry configureServiceRegistry() throws IOException {
+ Properties properties = getProperties();
+ return new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ }
+
+ private static Properties getProperties() throws IOException {
+ Properties properties = new Properties();
+ URL propertiesURL = Thread.currentThread()
+ .getContextClassLoader()
+ .getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate-interceptors.properties"));
+ try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
+ properties.load(inputStream);
+ }
+ return properties;
+ }
+}
\ No newline at end of file
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java
new file mode 100644
index 0000000000..2b1dbe702b
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/interceptors/entity/User.java
@@ -0,0 +1,64 @@
+package com.baeldung.hibernate.interceptors.entity;
+
+import java.util.Date;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+@Entity(name = "hbi_user")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE)
+ private long id;
+ private String name;
+ private String about;
+ @Basic
+ @Temporal(TemporalType.DATE)
+ private Date lastModified;
+
+ public User() {
+ }
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Date getLastModified() {
+ return lastModified;
+ }
+
+ public void setLastModified(Date lastModified) {
+ this.lastModified = lastModified;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getAbout() {
+ return about;
+ }
+
+ public void setAbout(String about) {
+ this.about = about;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("ID: %d\nName: %s\nLast Modified: %s\nAbout: %s\n", getId(), getName(), getLastModified(), getAbout());
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java b/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java
deleted file mode 100644
index d0187bba47..0000000000
--- a/hibernate5/src/main/java/com/baeldung/hibernate/pojo/Supplier.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.baeldung.hibernate.pojo;
-// Generated Feb 9, 2017 11:31:36 AM by Hibernate Tools 5.1.0.Final
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-import org.junit.runners.Suite.SuiteClasses;
-
-
-/**
- * Suppliers generated by hbm2java
- */
-@Entity(name = "Supplier")
-@Table(name ="Supplier")
-public class Supplier implements java.io.Serializable {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Integer id;
- private String name;
- private String country;
-
- public Supplier() {
- }
-
- public Supplier(String name, String country) {
- this.name = name;
- this.country = country;
- }
-
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getCountry() {
- return this.country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- @Override
- public String toString() {
- return new StringBuffer().append("[").append(id).append(",").append(name).append(",").append(country).append("]").toString();
- }
-
- @Override
- public boolean equals(Object obj) {
- return name.equals(((Supplier) obj).getName());
- }
-}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java
deleted file mode 100644
index 82567690ac..0000000000
--- a/hibernate5/src/test/java/com/baeldung/hibernate/MultiTenantDaoHibernateIntegrationTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.hibernate;
-
-import java.io.IOException;
-
-import org.hibernate.SessionFactory;
-import org.junit.Test;
-
-import com.baeldung.hibernate.dao.SupplierDao;
-import com.baeldung.hibernate.pojo.Supplier;
-
-import static org.junit.Assert.assertNull;;
-
-public class MultiTenantDaoHibernateIntegrationTest {
- @Test
- public void givenDBMode_whenFetchingSuppliersByName_thenChecking() throws UnsupportedTenancyException, IOException {
- SessionFactory sessionFactory = HibernateMultiTenantUtil.getSessionFactory();
-
- SupplierDao myDb1Dao = new SupplierDao(sessionFactory, "mydb1");
- Supplier db1SupplierName = myDb1Dao.findByName("John");
-
- // finding the same supplier name in another tenant
- // and we should not be able to find in there and both dbs are different.
- SupplierDao myDb2Dao = new SupplierDao(sessionFactory, "mydb2");
- Supplier db2SupplierName = myDb2Dao.findByName(db1SupplierName.getName());
-
- assertNull(db2SupplierName);
-
- }
-
-}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java
new file mode 100644
index 0000000000..cbf28497bb
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/interceptors/HibernateInterceptorTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.hibernate.interceptors;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.hibernate.interceptors.entity.User;
+
+public class HibernateInterceptorTest {
+ private static SessionFactory sessionFactory;
+ private static Serializable userId;
+
+ @Before
+ public void init() throws IOException {
+ sessionFactory = HibernateUtil.getSessionFactoryWithInterceptor(null, new CustomInterceptor());
+ }
+
+ @AfterClass
+ public static void finish() {
+ if(userId != null) {
+ Session session = sessionFactory.getCurrentSession();
+ Transaction transaction = session.beginTransaction();
+ User user = session.load(User.class, userId);
+ if(user != null) {
+ session.delete(user);
+ }
+ transaction.commit();
+ session.close();
+ }
+ }
+
+ @Test
+ public void givenHibernateInterceptorAndSessionScoped_whenUserCreated_shouldSucceed() {
+ Session session = sessionFactory.withOptions().interceptor(new CustomInterceptor()).openSession();
+ User user = new User("Benjamin Franklin");
+ Transaction transaction = session.beginTransaction();
+ userId = session.save(user);
+ transaction.commit();
+ session.close();
+ }
+
+ @Test
+ public void givenHibernateInterceptorAndSessionFactoryScoped_whenUserModified_shouldSucceed() {
+ Session session = sessionFactory.openSession();
+ Transaction transaction = session.beginTransaction();
+ User user = session.load(User.class, userId);
+ if(user != null) {
+ user.setAbout("I am a scientist.");
+ session.update(user);
+ }
+ transaction.commit();
+ session.close();
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java
new file mode 100644
index 0000000000..1b6cee7e67
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/Car.java
@@ -0,0 +1,26 @@
+package com.baeldung.hibernate.multitenancy;
+
+import java.io.Serializable;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity(name = "Car")
+@Table(name = "Car")
+public class Car implements Serializable {
+
+ private static final long serialVersionUID = 1015320564683423342L;
+
+ private String brand;
+
+ @Id
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java
new file mode 100644
index 0000000000..fdc3f9fa81
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/MultitenancyIntegrationTest.java
@@ -0,0 +1,104 @@
+package com.baeldung.hibernate.multitenancy;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
+import org.hibernate.service.ServiceRegistry;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import com.baeldung.hibernate.multitenancy.database.TenantIdNames;
+
+public abstract class MultitenancyIntegrationTest {
+
+ public abstract String getPropertyFile();
+
+ @Mock
+ private CurrentTenantIdentifierResolver currentTenantIdentifierResolver;
+
+ private SessionFactory sessionFactory;
+
+ @Before
+ public void setup() throws IOException {
+ MockitoAnnotations.initMocks(this);
+
+ Mockito.when(currentTenantIdentifierResolver.validateExistingCurrentSessions())
+ .thenReturn(false);
+
+ Properties properties = getHibernateProperties();
+ properties.put(AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, currentTenantIdentifierResolver);
+
+ sessionFactory = buildSessionFactory(properties);
+
+ initTenant(TenantIdNames.MYDB1);
+ initTenant(TenantIdNames.MYDB2);
+ }
+
+ protected void initTenant(String tenantId) {
+ whenCurrentTenantIs(tenantId);
+ createCarTable();
+ }
+
+ protected void whenCurrentTenantIs(String tenantId) {
+ Mockito.when(currentTenantIdentifierResolver.resolveCurrentTenantIdentifier())
+ .thenReturn(tenantId);
+ }
+
+ protected void whenAddCar(String brand) {
+ Session session = sessionFactory.openSession();
+ Transaction tx = session.beginTransaction();
+ Car car = new Car();
+ car.setBrand(brand);
+ session.save(car);
+ tx.commit();
+ }
+
+ protected void thenCarFound(String brand) {
+ Session session = sessionFactory.openSession();
+ assertNotNull(session.get(Car.class, brand));
+ }
+
+ protected void thenCarNotFound(String brand) {
+ Session session = sessionFactory.openSession();
+ assertNull(session.get(Car.class, brand));
+ }
+
+ @SuppressWarnings("deprecation")
+ private void createCarTable() {
+ Session session = sessionFactory.openSession();
+ Transaction tx = session.beginTransaction();
+ session.createSQLQuery("drop table Car if exists")
+ .executeUpdate();
+ session.createSQLQuery("create table Car (brand varchar(255) primary key)")
+ .executeUpdate();
+ tx.commit();
+ }
+
+ private Properties getHibernateProperties() throws IOException {
+ Properties properties = new Properties();
+ properties.load(getClass().getResourceAsStream(getPropertyFile()));
+ return properties;
+ }
+
+ private static SessionFactory buildSessionFactory(Properties properties) {
+ ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(properties)
+ .build();
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addAnnotatedClass(Car.class);
+ return metadataSources.buildMetadata()
+ .buildSessionFactory();
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java
new file mode 100644
index 0000000000..92f477a646
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/DatabaseApproachMultitenancyIntegrationTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.hibernate.multitenancy.database;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest;
+
+public class DatabaseApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest {
+
+ @Override
+ public String getPropertyFile() {
+ return "/hibernate-database-multitenancy.properties";
+ }
+
+ @Test
+ public void givenDatabaseApproach_whenAddingEntries_thenOnlyAddedToConcreteDatabase() throws IOException {
+ whenCurrentTenantIs(TenantIdNames.MYDB1);
+ whenAddCar("myCar");
+ thenCarFound("myCar");
+ whenCurrentTenantIs(TenantIdNames.MYDB2);
+ thenCarNotFound("myCar");
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java
new file mode 100644
index 0000000000..eb1f410622
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/MapMultiTenantConnectionProvider.java
@@ -0,0 +1,42 @@
+package com.baeldung.hibernate.multitenancy.database;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
+import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider;
+import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
+
+@SuppressWarnings("serial")
+public class MapMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
+
+ private final Map connectionProviderMap = new HashMap<>();
+
+ public MapMultiTenantConnectionProvider() throws IOException {
+ initConnectionProviderForTenant(TenantIdNames.MYDB1);
+ initConnectionProviderForTenant(TenantIdNames.MYDB2);
+ }
+
+ @Override
+ protected ConnectionProvider getAnyConnectionProvider() {
+ return connectionProviderMap.values()
+ .iterator()
+ .next();
+ }
+
+ @Override
+ protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
+ return connectionProviderMap.get(tenantIdentifier);
+ }
+
+ private void initConnectionProviderForTenant(String tenantId) throws IOException {
+ Properties properties = new Properties();
+ properties.load(getClass().getResourceAsStream(String.format("/hibernate-database-%s.properties", tenantId)));
+ DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl();
+ connectionProvider.configure(properties);
+ this.connectionProviderMap.put(tenantId, connectionProvider);
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java
new file mode 100644
index 0000000000..231272fa63
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/database/TenantIdNames.java
@@ -0,0 +1,6 @@
+package com.baeldung.hibernate.multitenancy.database;
+
+public class TenantIdNames {
+ public static final String MYDB1 = "mydb1";
+ public static final String MYDB2 = "mydb2";
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java
new file mode 100644
index 0000000000..304af65fca
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaApproachMultitenancyIntegrationTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.hibernate.multitenancy.schema;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import com.baeldung.hibernate.multitenancy.MultitenancyIntegrationTest;
+import com.baeldung.hibernate.multitenancy.database.TenantIdNames;
+
+public class SchemaApproachMultitenancyIntegrationTest extends MultitenancyIntegrationTest {
+
+ @Override
+ public String getPropertyFile() {
+ return "/hibernate-schema-multitenancy.properties";
+ }
+
+ @Test
+ public void givenSchemaApproach_whenAddingEntries_thenOnlyAddedToConcreteSchema() throws IOException {
+ whenCurrentTenantIs(TenantIdNames.MYDB1);
+ whenAddCar("Ferrari");
+ thenCarFound("Ferrari");
+ whenCurrentTenantIs(TenantIdNames.MYDB2);
+ thenCarNotFound("Ferrari");
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java
new file mode 100644
index 0000000000..601eba651c
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/SchemaMultiTenantConnectionProvider.java
@@ -0,0 +1,48 @@
+package com.baeldung.hibernate.multitenancy.schema;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl;
+import org.hibernate.engine.jdbc.connections.spi.AbstractMultiTenantConnectionProvider;
+import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
+
+@SuppressWarnings("serial")
+public class SchemaMultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider {
+
+ private final ConnectionProvider connectionProvider;
+
+ public SchemaMultiTenantConnectionProvider() throws IOException {
+ connectionProvider = initConnectionProvider();
+ }
+
+ @Override
+ protected ConnectionProvider getAnyConnectionProvider() {
+ return connectionProvider;
+ }
+
+ @Override
+ protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) {
+ return connectionProvider;
+ }
+
+ @Override
+ public Connection getConnection(String tenantIdentifier) throws SQLException {
+ Connection connection = super.getConnection(tenantIdentifier);
+ connection.createStatement()
+ .execute(String.format("SET SCHEMA %s;", tenantIdentifier));
+ return connection;
+ }
+
+ private ConnectionProvider initConnectionProvider() throws IOException {
+ Properties properties = new Properties();
+ properties.load(getClass().getResourceAsStream("/hibernate-schema-multitenancy.properties"));
+
+ DriverManagerConnectionProviderImpl connectionProvider = new DriverManagerConnectionProviderImpl();
+ connectionProvider.configure(properties);
+ return connectionProvider;
+ }
+
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java
new file mode 100644
index 0000000000..2eba94e307
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/multitenancy/schema/TenantIdNames.java
@@ -0,0 +1,6 @@
+package com.baeldung.hibernate.multitenancy.schema;
+
+public class TenantIdNames {
+ public static final String MYDB1 = "mydb1";
+ public static final String MYDB2 = "mydb2";
+}
diff --git a/hibernate5/src/test/resources/hibernate-database-multitenancy.properties b/hibernate5/src/test/resources/hibernate-database-multitenancy.properties
new file mode 100644
index 0000000000..853fa80dfc
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-database-multitenancy.properties
@@ -0,0 +1,2 @@
+hibernate.multiTenancy=DATABASE
+hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.database.MapMultiTenantConnectionProvider
\ No newline at end of file
diff --git a/hibernate5/src/test/resources/hibernate-database-mydb1.properties b/hibernate5/src/test/resources/hibernate-database-mydb1.properties
new file mode 100644
index 0000000000..345f1dbbea
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-database-mydb1.properties
@@ -0,0 +1,4 @@
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1
+hibernate.connection.username=sa
+hibernate.dialect=org.hibernate.dialect.H2Dialect
\ No newline at end of file
diff --git a/hibernate5/src/test/resources/hibernate-database-mydb2.properties b/hibernate5/src/test/resources/hibernate-database-mydb2.properties
new file mode 100644
index 0000000000..626b7853c6
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-database-mydb2.properties
@@ -0,0 +1,4 @@
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:mem:mydb2;DB_CLOSE_DELAY=-1
+hibernate.connection.username=sa
+hibernate.dialect=org.hibernate.dialect.H2Dialect
\ No newline at end of file
diff --git a/hibernate5/src/test/resources/hibernate-multitenancy.properties b/hibernate5/src/test/resources/hibernate-interceptors.properties
similarity index 67%
rename from hibernate5/src/test/resources/hibernate-multitenancy.properties
rename to hibernate5/src/test/resources/hibernate-interceptors.properties
index 298ecd05d3..58b55d0a09 100644
--- a/hibernate5/src/test/resources/hibernate-multitenancy.properties
+++ b/hibernate5/src/test/resources/hibernate-interceptors.properties
@@ -6,4 +6,5 @@ jdbc.password=
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
-hibernate.multiTenancy=DATABASE
+hibernate.hbm2ddl.auto=create-drop
+hibernate.current_session_context_class=org.hibernate.context.internal.ThreadLocalSessionContext
\ No newline at end of file
diff --git a/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties b/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties
new file mode 100644
index 0000000000..4abb621355
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-schema-multitenancy.properties
@@ -0,0 +1,7 @@
+hibernate.connection.driver_class=org.h2.Driver
+hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS MYDB1\\;CREATE SCHEMA IF NOT EXISTS MYDB2\\;
+hibernate.connection.username=sa
+hibernate.connection.autocommit=true
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.multiTenancy=SCHEMA
+hibernate.multi_tenant_connection_provider=com.baeldung.hibernate.multitenancy.schema.SchemaMultiTenantConnectionProvider
\ No newline at end of file
diff --git a/hystrix/pom.xml b/hystrix/pom.xml
index 58e09816ea..9e4b2bb082 100644
--- a/hystrix/pom.xml
+++ b/hystrix/pom.xml
@@ -7,10 +7,10 @@
hystrix
- parent-boot-4
+ parent-boot-5
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-4
+ ../parent-boot-5
diff --git a/influxdb/README.md b/influxdb/README.md
new file mode 100644
index 0000000000..f2c421580e
--- /dev/null
+++ b/influxdb/README.md
@@ -0,0 +1,17 @@
+## Influx SDK Tutorial Project
+
+### Relevant Article:
+- [Introduction to using InfluxDB with Java](http://www.baeldung.com/using-influxdb-with-java/)
+
+### Overview
+This Maven project contains the Java code for the article linked above.
+
+### Package Organization
+Java classes for the intro tutorial are in the
+org.baeldung.influxdb package.
+
+
+### Running the tests
+The test class expects an InfluxDB server to be available on localhost, at the default port of 8086 and with the default "admin" credentials.
+
+```
diff --git a/influxdb/pom.xml b/influxdb/pom.xml
new file mode 100644
index 0000000000..05a8e00fa0
--- /dev/null
+++ b/influxdb/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+ influxdb
+ 0.1-SNAPSHOT
+ jar
+ influxdb
+ InfluxDB SDK Tutorial
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.influxdb
+ influxdb-java
+ ${influxdb.sdk.version}
+
+
+
+ org.projectlombok
+ lombok
+
+ ${lombok.version}
+ provided
+
+
+
+
+
+
+
+ 1.8
+ UTF-8
+ 2.8
+ 1.16.18
+
+
+
+
diff --git a/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java b/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java
new file mode 100644
index 0000000000..fb05a70867
--- /dev/null
+++ b/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java
@@ -0,0 +1,28 @@
+package com.baeldung.influxdb;
+
+import lombok.Data;
+import org.influxdb.annotation.Column;
+import org.influxdb.annotation.Measurement;
+
+import java.time.Instant;
+
+@Data
+@Measurement(name = "memory")
+public class MemoryPoint {
+
+ @Column(name = "time")
+ private Instant time;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "free")
+ private Long free;
+
+ @Column(name = "used")
+ private Long used;
+
+ @Column(name = "buffer")
+ private Long buffer;
+
+}
diff --git a/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
new file mode 100644
index 0000000000..50d35b9b1c
--- /dev/null
+++ b/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
@@ -0,0 +1,179 @@
+package com.baeldung.influxdb;
+
+import lombok.extern.slf4j.Slf4j;
+import org.influxdb.InfluxDB;
+import org.influxdb.InfluxDBFactory;
+import org.influxdb.InfluxDBIOException;
+import org.influxdb.dto.*;
+import org.influxdb.impl.InfluxDBResultMapper;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@Slf4j
+public class InfluxDBConnectionLiveTest {
+
+ @Test
+ public void whenCorrectInfoDatabaseConnects() {
+
+ InfluxDB connection = connectDatabase();
+ assertTrue(pingServer(connection));
+ }
+
+ private InfluxDB connectDatabase() {
+
+ // Connect to database assumed on localhost with default credentials.
+ return InfluxDBFactory.connect("http://127.0.0.1:8086", "admin", "admin");
+
+ }
+
+ private boolean pingServer(InfluxDB influxDB) {
+ try {
+ // Ping and check for version string
+ Pong response = influxDB.ping();
+ if (response.getVersion().equalsIgnoreCase("unknown")) {
+ log.error("Error pinging server.");
+ return false;
+ } else {
+ log.info("Database version: {}", response.getVersion());
+ return true;
+ }
+ } catch (InfluxDBIOException idbo) {
+ log.error("Exception while pinging database: ", idbo);
+ return false;
+ }
+ }
+
+ @Test
+ public void whenDatabaseCreatedDatabaseChecksOk() {
+
+ InfluxDB connection = connectDatabase();
+
+ // Create "baeldung and check for it
+ connection.createDatabase("baeldung");
+ assertTrue(connection.databaseExists("baeldung"));
+
+ // Verify that nonsense databases are not there
+ assertFalse(connection.databaseExists("foobar"));
+
+ // Drop "baeldung" and check again
+ connection.deleteDatabase("baeldung");
+ assertFalse(connection.databaseExists("baeldung"));
+ }
+
+ @Test
+ public void whenPointsWrittenPointsExists() throws Exception {
+
+ InfluxDB connection = connectDatabase();
+
+ String dbName = "baeldung";
+ connection.createDatabase(dbName);
+
+ // Need a retention policy before we can proceed
+ connection.createRetentionPolicy("defaultPolicy", "baeldung", "30d", 1, true);
+
+ // Since we are doing a batch thread, we need to set this as a default
+ connection.setRetentionPolicy("defaultPolicy");
+
+ // Enable batch mode
+ connection.enableBatch(10, 10, TimeUnit.MILLISECONDS);
+
+ for (int i = 0; i < 10; i++) {
+ Point point = Point.measurement("memory")
+ .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
+ .addField("name", "server1")
+ .addField("free", 4743656L)
+ .addField("used", 1015096L)
+ .addField("buffer", 1010467L)
+ .build();
+
+ connection.write(dbName, "defaultPolicy", point);
+ Thread.sleep(2);
+
+ }
+
+ // Unfortunately, the sleep inside the loop doesn't always add enough time to insure
+ // that Influx's batch thread flushes all of the writes and this sometimes fails without
+ // another brief pause.
+ Thread.sleep(10);
+
+ List memoryPointList = getPoints(connection, "Select * from memory", "baeldung");
+
+ assertEquals(10, memoryPointList.size());
+
+ // Turn off batch and clean up
+ connection.disableBatch();
+ connection.deleteDatabase("baeldung");
+ connection.close();
+
+ }
+
+ private List getPoints(InfluxDB connection, String query, String databaseName) {
+
+ // Run the query
+ Query queryObject = new Query(query, databaseName);
+ QueryResult queryResult = connection.query(queryObject);
+
+ // Map it
+ InfluxDBResultMapper resultMapper = new InfluxDBResultMapper();
+ return resultMapper.toPOJO(queryResult, MemoryPoint.class);
+ }
+
+
+
+ @Test
+ public void whenBatchWrittenBatchExists() {
+
+ InfluxDB connection = connectDatabase();
+
+ String dbName = "baeldung";
+ connection.createDatabase(dbName);
+
+ // Need a retention policy before we can proceed
+ // Since we are doing batches, we need not set it
+ connection.createRetentionPolicy("defaultPolicy", "baeldung", "30d", 1, true);
+
+
+ BatchPoints batchPoints = BatchPoints
+ .database(dbName)
+ .retentionPolicy("defaultPolicy")
+ .build();
+ Point point1 = Point.measurement("memory")
+ .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
+ .addField("free", 4743656L)
+ .addField("used", 1015096L)
+ .addField("buffer", 1010467L)
+ .build();
+ Point point2 = Point.measurement("memory")
+ .time(System.currentTimeMillis() - 100, TimeUnit.MILLISECONDS)
+ .addField("free", 4743696L)
+ .addField("used", 1016096L)
+ .addField("buffer", 1008467L)
+ .build();
+ batchPoints.point(point1);
+ batchPoints.point(point2);
+ connection.write(batchPoints);
+
+ List memoryPointList = getPoints(connection, "Select * from memory", "baeldung");
+
+ assertEquals(2, memoryPointList.size());
+ assertTrue(4743696L == memoryPointList.get(0).getFree());
+
+
+ memoryPointList = getPoints(connection, "Select * from memory order by time desc", "baeldung");
+
+ assertEquals(2, memoryPointList.size());
+ assertTrue(4743656L == memoryPointList.get(0).getFree());
+
+ // Clean up database
+ connection.deleteDatabase("baeldung");
+ connection.close();
+ }
+
+}
diff --git a/influxdb/src/test/resources/logback.xml b/influxdb/src/test/resources/logback.xml
new file mode 100644
index 0000000000..f8ebaf1ebd
--- /dev/null
+++ b/influxdb/src/test/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/java-difference-date/pom.xml b/java-difference-date/pom.xml
index 388753de90..ac3f0fa3b5 100644
--- a/java-difference-date/pom.xml
+++ b/java-difference-date/pom.xml
@@ -41,6 +41,7 @@
org.apache.maven.plugins
maven-compiler-plugin
+ 3.7.0
1.8
1.8
diff --git a/java-lite/README.md b/java-lite/README.md
new file mode 100644
index 0000000000..bcb84e186e
--- /dev/null
+++ b/java-lite/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [RESTFul CRUD application with JavaLite] ()
\ No newline at end of file
diff --git a/java-lite/pom.xml b/java-lite/pom.xml
new file mode 100644
index 0000000000..554819f6e4
--- /dev/null
+++ b/java-lite/pom.xml
@@ -0,0 +1,105 @@
+
+
+ 4.0.0
+
+ org.baeldung
+ java-lite
+ 1.0-SNAPSHOT
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ 9.3.4.RC1
+ 1.4.13
+ 1.15
+ 5.1.45
+ 1.7.0
+ 1.8.2
+ 4.11
+
+
+
+
+
+ org.eclipse.jetty
+ jetty-maven-plugin
+ ${jetty.maven.plugin.version}
+
+
+
+ activejdbc.log
+
+
+
+ active_reload
+ true
+
+
+ activeweb.log.request
+ true
+
+
+
+
+
+
+ org.javalite
+ activejdbc-instrumentation
+ ${activejdbc.version}
+
+
+ process-classes
+
+ instrument
+
+
+
+
+
+
+
+
+
+ org.javalite
+ activeweb
+ ${activeweb.version}
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.connector.java.version}
+
+
+
+ com.sun
+ tools
+ ${sun.tools.version}
+ system
+ ${java.home}/../lib/tools.jar
+
+
+
+ org.codehaus.jackson
+ jackson-core-lgpl
+ ${jackson.version}
+
+
+ org.codehaus.jackson
+ jackson-mapper-lgpl
+ ${jackson.version}
+
+
+ junit
+ junit
+ ${junit.version}
+
+
+
+
\ No newline at end of file
diff --git a/java-lite/src/main/java/app/config/AppBootstrap.java b/java-lite/src/main/java/app/config/AppBootstrap.java
new file mode 100644
index 0000000000..7a87c2d0a7
--- /dev/null
+++ b/java-lite/src/main/java/app/config/AppBootstrap.java
@@ -0,0 +1,9 @@
+package app.config;
+
+import org.javalite.activeweb.AppContext;
+import org.javalite.activeweb.Bootstrap;
+
+public class AppBootstrap extends Bootstrap {
+ public void init(AppContext context) {
+ }
+}
diff --git a/java-lite/src/main/java/app/config/AppControllerConfig.java b/java-lite/src/main/java/app/config/AppControllerConfig.java
new file mode 100644
index 0000000000..42b7e728ec
--- /dev/null
+++ b/java-lite/src/main/java/app/config/AppControllerConfig.java
@@ -0,0 +1,15 @@
+package app.config;
+
+import app.controllers.ProductsController;
+import org.javalite.activeweb.AbstractControllerConfig;
+import org.javalite.activeweb.AppContext;
+import org.javalite.activeweb.controller_filters.DBConnectionFilter;
+import org.javalite.activeweb.controller_filters.TimingFilter;
+
+public class AppControllerConfig extends AbstractControllerConfig {
+ @Override
+ public void init(AppContext appContext) {
+ addGlobalFilters(new TimingFilter());
+ add(new DBConnectionFilter()).to(ProductsController.class);
+ }
+}
diff --git a/java-lite/src/main/java/app/config/DbConfig.java b/java-lite/src/main/java/app/config/DbConfig.java
new file mode 100644
index 0000000000..25ba378b22
--- /dev/null
+++ b/java-lite/src/main/java/app/config/DbConfig.java
@@ -0,0 +1,11 @@
+package app.config;
+
+import org.javalite.activeweb.AbstractDBConfig;
+import org.javalite.activeweb.AppContext;
+
+public class DbConfig extends AbstractDBConfig {
+ @Override
+ public void init(AppContext appContext) {
+ this.configFile("/database.properties");
+ }
+}
diff --git a/java-lite/src/main/java/app/controllers/ProductsController.java b/java-lite/src/main/java/app/controllers/ProductsController.java
new file mode 100644
index 0000000000..f68dd9a013
--- /dev/null
+++ b/java-lite/src/main/java/app/controllers/ProductsController.java
@@ -0,0 +1,101 @@
+package app.controllers;
+
+import app.models.Product;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.javalite.activeweb.AppController;
+import org.javalite.activeweb.annotations.RESTful;
+
+import java.util.Map;
+
+@RESTful
+public class ProductsController extends AppController {
+
+ public void index() {
+ try {
+ view("products", Product.findAll());
+ render().contentType("application/json");
+ } catch (Exception e) {
+ view("message", "There was an error.", "code", 200);
+ render("message");
+ }
+ }
+
+ public void create() {
+ try {
+ Map payload = new ObjectMapper().readValue(getRequestString(), Map.class);
+ Product p = new Product();
+ p.fromMap(payload);
+ p.saveIt();
+ view("message", "Successfully saved product id " + p.get("id"), "code", 200);
+ render("message");
+ } catch (Exception e) {
+ view("message", "There was an error.", "code", 200);
+ render("message");
+ }
+ }
+
+ public void update() {
+ try {
+ Map payload = new ObjectMapper().readValue(getRequestString(), Map.class);
+ String id = getId();
+ Product p = Product.findById(id);
+ if (p == null) {
+ view("message", "Product id " + id + " not found.", "code", 200);
+ render("message");
+ return;
+ }
+ p.fromMap(payload);
+ p.saveIt();
+ view("message", "Successfully updated product id " + id, "code", 200);
+ render("message");
+ } catch (Exception e) {
+ view("message", "There was an error.", "code", 200);
+ render("message");
+ }
+ }
+
+ public void show() {
+ try {
+ String id = getId();
+ Product p = Product.findById(id);
+ if (p == null) {
+ view("message", "Product id " + id + " not found.", "code", 200);
+ render("message");
+ return;
+ }
+ view("product", p);
+ render("_product");
+ } catch (Exception e) {
+ view("message", "There was an error.", "code", 200);
+ render("message");
+ }
+ }
+
+ public void destroy() {
+ try {
+ String id = getId();
+ Product p = Product.findById(id);
+ if (p == null) {
+ view("message", "Product id " + id + " not found.", "code", 200);
+ render("message");
+ return;
+ }
+ p.delete();
+ view("message", "Successfully deleted product id " + id, "code", 200);
+ render("message");
+ } catch (Exception e) {
+ view("message", "There was an error.", "code", 200);
+ render("message");
+ }
+ }
+
+ @Override
+ protected String getContentType() {
+ return "application/json";
+ }
+
+ @Override
+ protected String getLayout() {
+ return null;
+ }
+}
diff --git a/java-lite/src/main/java/app/models/Product.java b/java-lite/src/main/java/app/models/Product.java
new file mode 100644
index 0000000000..7fa32b75d9
--- /dev/null
+++ b/java-lite/src/main/java/app/models/Product.java
@@ -0,0 +1,7 @@
+package app.models;
+
+import org.javalite.activejdbc.Model;
+
+public class Product extends Model {
+
+}
diff --git a/java-lite/src/main/resources/database.properties b/java-lite/src/main/resources/database.properties
new file mode 100644
index 0000000000..55b3851d33
--- /dev/null
+++ b/java-lite/src/main/resources/database.properties
@@ -0,0 +1,4 @@
+development.driver=com.mysql.jdbc.Driver
+development.username=user
+development.password=password
+development.url=jdbc:mysql://localhost/dbname
\ No newline at end of file
diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl
new file mode 100644
index 0000000000..41622b4720
--- /dev/null
+++ b/java-lite/src/main/webapp/WEB-INF/views/products/_comma.ftl
@@ -0,0 +1 @@
+,
\ No newline at end of file
diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl
new file mode 100644
index 0000000000..562af0499e
--- /dev/null
+++ b/java-lite/src/main/webapp/WEB-INF/views/products/_product.ftl
@@ -0,0 +1,4 @@
+{
+"id" : ${product.id},
+"name" : "${product.name}"
+}
\ No newline at end of file
diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl
new file mode 100644
index 0000000000..c343f20910
--- /dev/null
+++ b/java-lite/src/main/webapp/WEB-INF/views/products/index.ftl
@@ -0,0 +1 @@
+[<@render partial="product" collection=products spacer="comma"/>]
\ No newline at end of file
diff --git a/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl b/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl
new file mode 100644
index 0000000000..3e7faf1459
--- /dev/null
+++ b/java-lite/src/main/webapp/WEB-INF/views/products/message.ftl
@@ -0,0 +1,4 @@
+{
+"message" : "${message}",
+"code" : ${code}
+}
\ No newline at end of file
diff --git a/java-lite/src/main/webapp/WEB-INF/web.xml b/java-lite/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..c285876c86
--- /dev/null
+++ b/java-lite/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ dispatcher
+ org.javalite.activeweb.RequestDispatcher
+
+ exclusions
+ css,images,js,ico
+
+
+ encoding
+ UTF-8
+
+
+
+
+
+ dispatcher
+ /*
+
+
+
diff --git a/java-lite/src/test/java/app/models/ProductTest.java b/java-lite/src/test/java/app/models/ProductTest.java
new file mode 100644
index 0000000000..f6ee0a3d0a
--- /dev/null
+++ b/java-lite/src/test/java/app/models/ProductTest.java
@@ -0,0 +1,25 @@
+package app.models;
+
+import org.javalite.activejdbc.Base;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ProductTest {
+
+ //@Test
+ public void givenSavedProduct_WhenFindFirst_ThenSavedProductIsReturned() {
+ //Open DB connection
+ Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/dbname", "user", "password");
+
+ //Create a product and save it
+ Product toSaveProduct = new Product();
+ toSaveProduct.set("name", "Bread");
+ toSaveProduct.saveIt();
+
+ //Find product
+ Product savedProduct = Product.findFirst("name = ?", "Bread");
+
+ Assert.assertEquals(toSaveProduct.get("name"), savedProduct.get("name"));
+ }
+
+}
\ No newline at end of file
diff --git a/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
index b4bb243559..de69efa43a 100644
--- a/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
+++ b/jee-7/src/main/java/com/baeldung/javaeeannotations/JavaEEAnnotationsSample/pom.xml
@@ -34,10 +34,10 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.2
+ 3.7.0
- 1.7
- 1.7
+ 1.8
+ 1.8
diff --git a/jhipster/jhipster-microservice/car-app/pom.xml b/jhipster/jhipster-microservice/car-app/pom.xml
index 23da8767cb..5fd7febd07 100644
--- a/jhipster/jhipster-microservice/car-app/pom.xml
+++ b/jhipster/jhipster-microservice/car-app/pom.xml
@@ -506,6 +506,8 @@
maven-compiler-plugin
${maven-compiler-plugin.version}
+ 1.8
+ 1.8
org.mapstruct
diff --git a/jjwt/pom.xml b/jjwt/pom.xml
index 83a1131211..cd2dd9f97e 100644
--- a/jjwt/pom.xml
+++ b/jjwt/pom.xml
@@ -12,10 +12,10 @@
Exercising the JJWT
- parent-boot-4
+ parent-boot-5
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-4
+ ../parent-boot-5
diff --git a/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java
index df147232d9..846445ab2b 100644
--- a/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java
+++ b/jjwt/src/test/java/io/jsonwebtoken/jjwtfun/DemoApplicationIntegrationTest.java
@@ -2,12 +2,12 @@ package io.jsonwebtoken.jjwtfun;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = JJWTFunApplication.class)
+@SpringBootTest(classes = JJWTFunApplication.class)
@WebAppConfiguration
public class DemoApplicationIntegrationTest {
diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml
index 90b1f6bb1d..4727ca2222 100644
--- a/libraries-data/pom.xml
+++ b/libraries-data/pom.xml
@@ -1,5 +1,6 @@
-
+
4.0.0
com.baeldung
@@ -15,18 +16,18 @@
kryo
${kryo.version}
-
+
com.h2database
h2
${h2.version}
-
+
junit
junit
${junit.version}
test
-
+
com.goldmansachs.reladomo
reladomo
${reladomo.version}
@@ -41,8 +42,31 @@
ormlite-jdbc
${ormlite.version}
+
+ org.apache.kafka
+ kafka-streams
+ ${kafka.version}
+
+
+ org.apache.kafka
+ kafka-clients
+ ${kafka.version}
+
+
+ org.slf4j
+ slf4j-log4j12
+
+
+
+
+ org.apache.kafka
+ kafka-clients
+ ${kafka.version}
+ test
+ test
+