diff --git a/core-java-modules/core-java-8-2/pom.xml b/core-java-modules/core-java-8-2/pom.xml
index cc184de529..17f0eea20f 100644
--- a/core-java-modules/core-java-8-2/pom.xml
+++ b/core-java-modules/core-java-8-2/pom.xml
@@ -22,6 +22,7 @@
1.8
1.8
64.2
+ 3.12.2
@@ -30,6 +31,12 @@
icu4j
${icu.version}
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
diff --git a/core-java-modules/core-java-8-2/src/test/java/com/baeldung/bifunction/BiFunctionalInterfacesUnitTest.java b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/bifunction/BiFunctionalInterfacesUnitTest.java
new file mode 100644
index 0000000000..ea63409c88
--- /dev/null
+++ b/core-java-modules/core-java-8-2/src/test/java/com/baeldung/bifunction/BiFunctionalInterfacesUnitTest.java
@@ -0,0 +1,164 @@
+package com.baeldung.bifunction;
+
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class BiFunctionalInterfacesUnitTest {
+ @Test
+ public void givenStreamValues_whenMappedToNewValues() {
+ List mapped = Stream.of("hello", "world")
+ .map(word -> word + "!")
+ .collect(Collectors.toList());
+
+ assertThat(mapped).containsExactly("hello!", "world!");
+ }
+
+ @Test
+ public void givenStreamValues_whenReducedWithPrefixingOperation() {
+ String result = Stream.of("hello", "world")
+ .reduce("", (a, b) -> b + "-" + a);
+
+ assertThat(result).isEqualTo("world-hello-");
+ }
+
+ @Test
+ public void givenStreamValues_whenReducedWithPrefixingLambda_thenHasNoTrailingDash() {
+ String result = Stream.of("hello", "world")
+ .reduce("", (a, b) -> combineWithoutTrailingDash(a, b));
+
+ assertThat(result).isEqualTo("world-hello");
+ }
+
+ private String combineWithoutTrailingDash(String a, String b) {
+ if (a.isEmpty()) {
+ return b;
+ }
+ return b + "-" + a;
+ }
+
+ @Test
+ public void givenStreamValues_whenReducedWithPrefixingMethodReference_thenHasNoTrailingDash() {
+ String result = Stream.of("hello", "world")
+ .reduce("", this::combineWithoutTrailingDash);
+
+ assertThat(result).isEqualTo("world-hello");
+ }
+
+ @Test
+ public void givenTwoLists_whenCombined() {
+ List list1 = Arrays.asList("a", "b", "c");
+ List list2 = Arrays.asList(1, 2, 3);
+
+ List result = new ArrayList<>();
+ for (int i=0; i < list1.size(); i++) {
+ result.add(list1.get(i) + list2.get(i));
+ }
+
+ assertThat(result).containsExactly("a1", "b2", "c3");
+ }
+
+ @Test
+ public void givenTwoLists_whenCombinedWithGeneralPurposeCombiner() {
+ List list1 = Arrays.asList("a", "b", "c");
+ List list2 = Arrays.asList(1, 2, 3);
+
+ List result = listCombiner(list1, list2, (a, b) -> a + b);
+
+ assertThat(result).containsExactly("a1", "b2", "c3");
+ }
+
+ private static List listCombiner(List list1,
+ List list2,
+ BiFunction combiner) {
+ List result = new ArrayList<>();
+ for (int i = 0; i < list1.size(); i++) {
+ result.add(combiner.apply(list1.get(i), list2.get(i)));
+ }
+ return result;
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedWithCombiningFunction() {
+ List list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
+ List list2 = Arrays.asList(0.1f, 0.2f, 4f);
+
+ // algorithm to determine if the value in list1 > value in list 2
+ List result = listCombiner(list1, list2, (a, b) -> a > b);
+
+ assertThat(result).containsExactly(true, true, false);
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedWithCombiningFunctionByMethodReference() {
+ List list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
+ List list2 = Arrays.asList(0.1f, 0.2f, 4f);
+
+ // algorithm to determine if the value in list1 > value in list 2
+ List result = listCombiner(list1, list2, this::firstIsGreaterThanSecond);
+
+ assertThat(result).containsExactly(true, true, false);
+ }
+
+ private boolean firstIsGreaterThanSecond(Double a, Float b) {
+ return a > b;
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedForEqualityByCombiningFunction() {
+ List list1 = Arrays.asList(0.1f, 0.2f, 4f);
+ List list2 = Arrays.asList(0.1f, 0.2f, 4f);
+
+ List result = listCombiner(list1, list2, (a, b) -> a.equals(b));
+
+ assertThat(result).containsExactly(true, true, true);
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedForEqualityByCombiningFunctionWithMethodReference() {
+ List list1 = Arrays.asList(0.1f, 0.2f, 4f);
+ List list2 = Arrays.asList(0.1f, 0.2f, 4f);
+
+ List result = listCombiner(list1, list2, Float::equals);
+
+ assertThat(result).containsExactly(true, true, true);
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedWithCombiningFunctionWithCompareTo() {
+ List list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
+ List list2 = Arrays.asList(0.1d, 0.2d, 4d);
+
+ List result = listCombiner(list1, list2, Double::compareTo);
+
+ assertThat(result).containsExactly(1, 1, -1);
+ }
+
+ /**
+ * Allows you to to pass in a lambda or method reference and then
+ * get access to the BiFunction it is meant to become
+ */
+ private static BiFunction asBiFunction(BiFunction function) {
+ return function;
+ }
+
+ @Test
+ public void givenTwoLists_whenComparedWithCombiningFunctionWithComposedBiFunction() {
+ List list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
+ List list2 = Arrays.asList(0.1d, 0.2d, 4d);
+
+ List result = listCombiner(list1, list2,
+ asBiFunction(Double::compareTo)
+ .andThen(i -> i > 0));
+
+ assertThat(result).containsExactly(true, true, false);
+ }
+}
diff --git a/core-java-modules/core-java-arrays/pom.xml b/core-java-modules/core-java-arrays/pom.xml
index b713c196b5..23db608abc 100644
--- a/core-java-modules/core-java-arrays/pom.xml
+++ b/core-java-modules/core-java-arrays/pom.xml
@@ -389,7 +389,7 @@
- 3.8.1
+ 3.9
1.19
1.19
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
deleted file mode 100644
index 36cfc88b95..0000000000
--- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/JaggedArray.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.baeldung.array;
-
-import java.util.Arrays;
-import java.util.Scanner;
-
-public class JaggedArray {
-
- int[][] shortHandFormInitialization() {
- int[][] jaggedArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
- return jaggedArr;
- }
-
- int[][] declarationAndThenInitialization() {
- int[][] jaggedArr = new int[3][];
- jaggedArr[0] = new int[] { 1, 2 };
- jaggedArr[1] = new int[] { 3, 4, 5 };
- jaggedArr[2] = new int[] { 6, 7, 8, 9 };
- return jaggedArr;
- }
-
- int[][] declarationAndThenInitializationUsingUserInputs() {
- int[][] jaggedArr = new int[3][];
- jaggedArr[0] = new int[2];
- jaggedArr[1] = new int[3];
- jaggedArr[2] = new int[4];
- initializeElements(jaggedArr);
- return jaggedArr;
- }
-
- void initializeElements(int[][] jaggedArr) {
- Scanner sc = new Scanner(System.in);
- for (int outer = 0; outer < jaggedArr.length; outer++) {
- for (int inner = 0; inner < jaggedArr[outer].length; inner++) {
- jaggedArr[outer][inner] = sc.nextInt();
- }
- }
- }
-
- void printElements(int[][] jaggedArr) {
- for (int index = 0; index < jaggedArr.length; index++) {
- System.out.println(Arrays.toString(jaggedArr[index]));
- }
- }
-
- int[] getElementAtGivenIndex(int[][] jaggedArr, int index) {
- return jaggedArr[index];
- }
-
-}
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java
new file mode 100644
index 0000000000..4e01b99a14
--- /dev/null
+++ b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/MultiDimensionalArray.java
@@ -0,0 +1,83 @@
+package com.baeldung.array;
+
+import java.util.Arrays;
+import java.util.Scanner;
+
+public class MultiDimensionalArray {
+
+ int[][] shortHandFormInitialization() {
+ int[][] multiDimensionalArray = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ return multiDimensionalArray;
+ }
+
+ int[][] declarationAndThenInitialization() {
+ int[][] multiDimensionalArray = new int[3][];
+ multiDimensionalArray[0] = new int[] { 1, 2 };
+ multiDimensionalArray[1] = new int[] { 3, 4, 5 };
+ multiDimensionalArray[2] = new int[] { 6, 7, 8, 9 };
+ return multiDimensionalArray;
+ }
+
+ int[][] declarationAndThenInitializationUsingUserInputs() {
+ int[][] multiDimensionalArray = new int[3][];
+ multiDimensionalArray[0] = new int[2];
+ multiDimensionalArray[1] = new int[3];
+ multiDimensionalArray[2] = new int[4];
+ initializeElements(multiDimensionalArray);
+ return multiDimensionalArray;
+ }
+
+ void initializeElements(int[][] multiDimensionalArray) {
+ Scanner sc = new Scanner(System.in);
+ for (int outer = 0; outer < multiDimensionalArray.length; outer++) {
+ for (int inner = 0; inner < multiDimensionalArray[outer].length; inner++) {
+ multiDimensionalArray[outer][inner] = sc.nextInt();
+ }
+ }
+ }
+
+ void initialize2DArray(int[][] multiDimensionalArray) {
+ for (int[] array : multiDimensionalArray) {
+ Arrays.fill(array, 7);
+ }
+ }
+
+ void printElements(int[][] multiDimensionalArray) {
+ for (int index = 0; index < multiDimensionalArray.length; index++) {
+ System.out.println(Arrays.toString(multiDimensionalArray[index]));
+ }
+ }
+
+ int[] getElementAtGivenIndex(int[][] multiDimensionalArray, int index) {
+ return multiDimensionalArray[index];
+ }
+
+ int[] findLengthOfElements(int[][] multiDimensionalArray) {
+ int[] arrayOfLengths = new int[multiDimensionalArray.length];
+ for (int i = 0; i < multiDimensionalArray.length; i++) {
+ arrayOfLengths[i] = multiDimensionalArray[i].length;
+ }
+ return arrayOfLengths;
+ }
+
+ Integer[] findLengthOfElements(Integer[][] multiDimensionalArray) {
+ return Arrays.stream(multiDimensionalArray)
+ .map(array -> array.length)
+ .toArray(Integer[]::new);
+ }
+
+ int[][] copy2DArray(int[][] arrayOfArrays) {
+ int[][] copied2DArray = new int[arrayOfArrays.length][];
+ for (int i = 0; i < arrayOfArrays.length; i++) {
+ int[] array = arrayOfArrays[i];
+ copied2DArray[i] = Arrays.copyOf(array, array.length);
+ }
+ return copied2DArray;
+ }
+
+ Integer[][] copy2DArray(Integer[][] arrayOfArrays) {
+ return Arrays.stream(arrayOfArrays)
+ .map(array -> Arrays.copyOf(array, array.length))
+ .toArray(Integer[][]::new);
+ }
+}
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
new file mode 100644
index 0000000000..62a1a0ee58
--- /dev/null
+++ b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
@@ -0,0 +1,27 @@
+package com.baeldung.array;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+public class RemoveElementFromAnArray {
+
+ public int[] removeAnElementWithAGivenIndex(int[] array, int index) {
+ return ArrayUtils.remove(array, index);
+ }
+
+ public int[] removeAllElementsWithGivenIndices(int[] array, int... indicies) {
+ return ArrayUtils.removeAll(array, indicies);
+ }
+
+ public int[] removeFirstOccurrenceOfGivenElement(int[] array, int element) {
+ return ArrayUtils.removeElement(array, element);
+ }
+
+ public int[] removeAllGivenElements(int[] array, int... elements) {
+ return ArrayUtils.removeElements(array, elements);
+ }
+
+ public int[] removeAllOccurrencesOfAGivenElement(int[] array, int element) {
+ return ArrayUtils.removeAllOccurences(array, element);
+ }
+
+}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
deleted file mode 100644
index a4dd7e25c3..0000000000
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/JaggedArrayUnitTest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.baeldung.array;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.PrintStream;
-
-import org.junit.Test;
-
-public class JaggedArrayUnitTest {
-
- private JaggedArray obj = new JaggedArray();
-
- @Test
- public void whenInitializedUsingShortHandForm_thenCorrect() {
- assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.shortHandFormInitialization());
- }
-
- @Test
- public void whenInitializedWithDeclarationAndThenInitalization_thenCorrect() {
- assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.declarationAndThenInitialization());
- }
-
- @Test
- public void whenInitializedWithDeclarationAndThenInitalizationUsingUserInputs_thenCorrect() {
- InputStream is = new ByteArrayInputStream("1 2 3 4 5 6 7 8 9".getBytes());
- System.setIn(is);
- assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.declarationAndThenInitializationUsingUserInputs());
- System.setIn(System.in);
- }
-
- @Test
- public void givenJaggedArrayAndAnIndex_thenReturnArrayAtGivenIndex() {
- int[][] jaggedArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
- assertArrayEquals(new int[] { 1, 2 }, obj.getElementAtGivenIndex(jaggedArr, 0));
- assertArrayEquals(new int[] { 3, 4, 5 }, obj.getElementAtGivenIndex(jaggedArr, 1));
- assertArrayEquals(new int[] { 6, 7, 8, 9 }, obj.getElementAtGivenIndex(jaggedArr, 2));
- }
-
- @Test
- public void givenJaggedArray_whenUsingArraysAPI_thenVerifyPrintedElements() {
- int[][] jaggedArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
- ByteArrayOutputStream outContent = new ByteArrayOutputStream();
- System.setOut(new PrintStream(outContent));
- obj.printElements(jaggedArr);
- assertEquals("[1, 2][3, 4, 5][6, 7, 8, 9]", outContent.toString().replace("\r", "").replace("\n", ""));
- System.setOut(System.out);
- }
-
-}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java
new file mode 100644
index 0000000000..8980eaa9dc
--- /dev/null
+++ b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/MultiDimensionalArrayUnitTest.java
@@ -0,0 +1,86 @@
+package com.baeldung.array;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.PrintStream;
+
+import org.junit.Test;
+
+public class MultiDimensionalArrayUnitTest {
+
+ private MultiDimensionalArray obj = new MultiDimensionalArray();
+
+ @Test
+ public void whenInitializedUsingShortHandForm_thenCorrect() {
+ assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.shortHandFormInitialization());
+ }
+
+ @Test
+ public void whenInitializedWithDeclarationAndThenInitalization_thenCorrect() {
+ assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.declarationAndThenInitialization());
+ }
+
+ @Test
+ public void whenInitializedWithDeclarationAndThenInitalizationUsingUserInputs_thenCorrect() {
+ InputStream is = new ByteArrayInputStream("1 2 3 4 5 6 7 8 9".getBytes());
+ System.setIn(is);
+ assertArrayEquals(new int[][] { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } }, obj.declarationAndThenInitializationUsingUserInputs());
+ System.setIn(System.in);
+ }
+
+ @Test
+ public void givenMultiDimensionalArrayAndAnIndex_thenReturnArrayAtGivenIndex() {
+ int[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ assertArrayEquals(new int[] { 1, 2 }, obj.getElementAtGivenIndex(multiDimensionalArr, 0));
+ assertArrayEquals(new int[] { 3, 4, 5 }, obj.getElementAtGivenIndex(multiDimensionalArr, 1));
+ assertArrayEquals(new int[] { 6, 7, 8, 9 }, obj.getElementAtGivenIndex(multiDimensionalArr, 2));
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingArraysAPI_thenVerifyPrintedElements() {
+ int[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outContent));
+ obj.printElements(multiDimensionalArr);
+ assertEquals("[1, 2][3, 4, 5][6, 7, 8, 9]", outContent.toString().replace("\r", "").replace("\n", ""));
+ System.setOut(System.out);
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingArraysFill_thenVerifyInitialize2DArray() {
+ int[][] multiDimensionalArr = new int[3][];
+ multiDimensionalArr[0] = new int[2];
+ multiDimensionalArr[1] = new int[3];
+ multiDimensionalArr[2] = new int[4];
+ obj.initialize2DArray(multiDimensionalArr);
+ assertArrayEquals(new int[][] {{7,7}, {7,7,7}, {7,7,7,7}}, multiDimensionalArr);
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingIteration_thenVerifyFindLengthOfElements() {
+ int[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ assertArrayEquals(new int[]{2,3,4}, obj.findLengthOfElements(multiDimensionalArr));
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingArraysStream_thenVerifyFindLengthOfElements() {
+ Integer[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ assertArrayEquals(new Integer[]{2,3,4}, obj.findLengthOfElements(multiDimensionalArr));
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingArraysCopyOf_thenVerifyCopy2DArray() {
+ int[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ assertArrayEquals(multiDimensionalArr, obj.copy2DArray(multiDimensionalArr));
+ }
+
+ @Test
+ public void givenMultiDimensionalArray_whenUsingArraysStream_thenVerifyCopy2DArray() {
+ Integer[][] multiDimensionalArr = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } };
+ assertArrayEquals(multiDimensionalArr, obj.copy2DArray(multiDimensionalArr));
+ }
+}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
new file mode 100644
index 0000000000..ea52cd17d9
--- /dev/null
+++ b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
@@ -0,0 +1,85 @@
+package com.baeldung.array;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.jupiter.api.Test;
+
+class RemoveElementFromAnArrayUnitTest {
+
+ private final RemoveElementFromAnArray sut = new RemoveElementFromAnArray();
+ private final int[] inputArray = new int[] { 40, 10, 20, 30, 40, 50 };
+
+ @Test
+ void testRemoveAnElementWithAGivenIndex() {
+ int index = 2;
+ int[] modifiedArray = sut.removeAnElementWithAGivenIndex(inputArray, index);
+
+ assertFalse(ArrayUtils.contains(modifiedArray, inputArray[index]));
+ }
+
+ @Test
+ void testRemoveAllElementsWithGivenIndices() {
+ int first = 0;
+ int last = inputArray.length - 1;
+ int[] modifiedArray = sut.removeAllElementsWithGivenIndices(inputArray, first, last);
+
+ assertFalse(ArrayUtils.contains(modifiedArray, inputArray[first]) && ArrayUtils.contains(modifiedArray, inputArray[last]));
+ }
+
+ @Test
+ void testRemoveElement_WhenArrayIsNull_ThrowsIndexOutOfBoundEx() {
+ int index = 2;
+
+ assertThrows(IndexOutOfBoundsException.class, () -> {
+ sut.removeAnElementWithAGivenIndex(null, index);
+ });
+
+ assertThrows(IndexOutOfBoundsException.class, () -> {
+ sut.removeAllElementsWithGivenIndices(null, index);
+ });
+ }
+
+ @Test
+ void testRemoveFirstOccurrenceOfGivenElement() {
+ int element = 40;
+ int[] modifiedArray = sut.removeFirstOccurrenceOfGivenElement(inputArray, element);
+
+ int indexInInputArray = ArrayUtils.indexOf(inputArray, element);
+ int indexInModifiedArray = ArrayUtils.indexOf(modifiedArray, element);
+ assertFalse(indexInInputArray == indexInModifiedArray);
+ }
+
+ @Test
+ void testRemoveAllGivenElements() {
+ int duplicateElement = 40;
+ int[] elements = new int[] { duplicateElement, 10, 50 };
+ int[] modifiedArray = sut.removeAllGivenElements(inputArray, elements);
+
+ assertTrue(ArrayUtils.contains(modifiedArray, duplicateElement));
+ assertFalse(ArrayUtils.contains(modifiedArray, elements[1]));
+ assertFalse(ArrayUtils.contains(modifiedArray, elements[2]));
+ }
+
+ @Test
+ void testRemoveAllOccurrencesOfAGivenElement() {
+ int element = 40;
+ int[] modifiedArray = sut.removeAllOccurrencesOfAGivenElement(inputArray, element);
+
+ assertFalse(ArrayUtils.contains(modifiedArray, element));
+ }
+
+ @Test
+ void testRemoveElement_WhenArrayIsNull_ReturnsNull() {
+ int element = 20;
+
+ assertEquals(null, sut.removeFirstOccurrenceOfGivenElement(null, element));
+ assertEquals(null, sut.removeAllGivenElements(null, element));
+ assertEquals(null, sut.removeAllOccurrencesOfAGivenElement(null, element));
+
+ }
+
+}
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/random/SecureRandomDemo.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/random/SecureRandomDemo.java
new file mode 100644
index 0000000000..02f815f5a7
--- /dev/null
+++ b/core-java-modules/core-java-security/src/main/java/com/baeldung/random/SecureRandomDemo.java
@@ -0,0 +1,36 @@
+package com.baeldung.random;
+
+import java.security.SecureRandom;
+import java.security.NoSuchAlgorithmException;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.DoubleStream;
+
+public interface SecureRandomDemo {
+
+ public static void generateSecureRandomValues() {
+ SecureRandom sr = new SecureRandom();
+
+ int randomInt = sr.nextInt();
+ long randomLong = sr.nextLong();
+ float randomFloat = sr.nextFloat();
+ double randomDouble = sr.nextDouble();
+ boolean randomBoolean = sr.nextBoolean();
+
+ IntStream randomIntStream = sr.ints();
+ LongStream randomLongStream = sr.longs();
+ DoubleStream randomDoubleStream = sr.doubles();
+
+ byte[] values = new byte[124];
+ sr.nextBytes(values);
+ }
+
+ public static SecureRandom getSecureRandomForAlgorithm(String algorithm) throws NoSuchAlgorithmException {
+ if (algorithm == null || algorithm.isEmpty()) {
+ return new SecureRandom();
+ }
+
+ return SecureRandom.getInstance(algorithm);
+ }
+
+}
diff --git a/java-dates-2/pom.xml b/java-dates-2/pom.xml
index 9307a794b9..2f861ff5f4 100644
--- a/java-dates-2/pom.xml
+++ b/java-dates-2/pom.xml
@@ -20,6 +20,13 @@
joda-time
${joda-time.version}
+
+
+
+ commons-validator
+ commons-validator
+ 1.6
+
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java
new file mode 100644
index 0000000000..b774edab43
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java
@@ -0,0 +1,5 @@
+package com.baeldung.date.validation;
+
+public interface DateValidator {
+ boolean isValid(String dateStr);
+}
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
new file mode 100644
index 0000000000..f7b2f48d2d
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
@@ -0,0 +1,11 @@
+package com.baeldung.date.validation;
+
+import org.apache.commons.validator.GenericValidator;
+
+public class DateValidatorUsingApacheValidator implements DateValidator {
+
+ @Override
+ public boolean isValid(String dateStr) {
+ return GenericValidator.isDate(dateStr, "yyyy-MM-dd", true);
+ }
+}
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
new file mode 100644
index 0000000000..eb0fbdb086
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
@@ -0,0 +1,25 @@
+package com.baeldung.date.validation;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+public class DateValidatorUsingDateFormat implements DateValidator {
+ private String dateFormat;
+
+ public DateValidatorUsingDateFormat(String dateFormat) {
+ this.dateFormat = dateFormat;
+ }
+
+ @Override
+ public boolean isValid(String dateStr) {
+ DateFormat sdf = new SimpleDateFormat(this.dateFormat);
+ sdf.setLenient(false);
+ try {
+ sdf.parse(dateStr);
+ } catch (ParseException e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
new file mode 100644
index 0000000000..0f68baf06e
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
@@ -0,0 +1,22 @@
+package com.baeldung.date.validation;
+
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+public class DateValidatorUsingDateTimeFormatter implements DateValidator {
+ private DateTimeFormatter dateFormatter;
+
+ public DateValidatorUsingDateTimeFormatter(DateTimeFormatter dateFormatter) {
+ this.dateFormatter = dateFormatter;
+ }
+
+ @Override
+ public boolean isValid(String dateStr) {
+ try {
+ this.dateFormatter.parse(dateStr);
+ } catch (DateTimeParseException e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
new file mode 100644
index 0000000000..f04c2e4185
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
@@ -0,0 +1,23 @@
+package com.baeldung.date.validation;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+public class DateValidatorUsingLocalDate implements DateValidator {
+ private DateTimeFormatter dateFormatter;
+
+ public DateValidatorUsingLocalDate(DateTimeFormatter dateFormatter) {
+ this.dateFormatter = dateFormatter;
+ }
+
+ @Override
+ public boolean isValid(String dateStr) {
+ try {
+ LocalDate.parse(dateStr, this.dateFormatter);
+ } catch (DateTimeParseException e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
new file mode 100644
index 0000000000..daa464722a
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.date.validation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.validator.GenericValidator;
+import org.junit.Test;
+
+public class DateValidatorUsingApacheValidatorUnitTest {
+
+ @Test
+ public void whenValidDatePassed_ThenTrue() {
+ assertTrue(GenericValidator.isDate("2019-02-28", "yyyy-MM-dd", true));
+ }
+
+ @Test
+ public void whenInvalidDatePassed_ThenFalse() {
+ assertFalse(GenericValidator.isDate("2019-02-29", "yyyy-MM-dd", true));
+ }
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
new file mode 100644
index 0000000000..9b86b3381c
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.date.validation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class DateValidatorUsingDateFormatUnitTest {
+
+ @Test
+ public void givenValidator_whenValidDatePassed_ThenTrue() {
+ DateValidator validator = new DateValidatorUsingDateFormat("MM/dd/yyyy");
+
+ assertTrue(validator.isValid("02/28/2019"));
+ }
+
+ @Test
+ public void givenValidator_whenInvalidDatePassed_ThenFalse() {
+ DateValidator validator = new DateValidatorUsingDateFormat("MM/dd/yyyy");
+
+ assertFalse(validator.isValid("02/30/2019"));
+ }
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
new file mode 100644
index 0000000000..368b04f8e3
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.date.validation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.format.DateTimeFormatter;
+import java.time.format.ResolverStyle;
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class DateValidatorUsingDateTimeFormatterUnitTest {
+
+ @Test
+ public void givenValidator_whenValidDatePassed_ThenTrue() {
+ DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.US)
+ .withResolverStyle(ResolverStyle.STRICT);
+ DateValidator validator = new DateValidatorUsingDateTimeFormatter(dateFormatter);
+
+ assertTrue(validator.isValid("2019-02-28"));
+ }
+
+ @Test
+ public void givenValidator_whenInValidDatePassed_ThenFalse() {
+ DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.US)
+ .withResolverStyle(ResolverStyle.STRICT);
+ DateValidator validator = new DateValidatorUsingDateTimeFormatter(dateFormatter);
+
+ assertFalse(validator.isValid("2019-02-30"));
+ }
+
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
new file mode 100644
index 0000000000..63296359db
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.date.validation;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.format.DateTimeFormatter;
+
+import org.junit.Test;
+
+public class DateValidatorUsingLocalDateUnitTest {
+
+ @Test
+ public void givenValidator_whenValidDatePassed_ThenTrue() {
+ DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE;
+ DateValidator validator = new DateValidatorUsingLocalDate(dateFormatter);
+
+ assertTrue(validator.isValid("20190228"));
+ }
+
+ @Test
+ public void givenValidator_whenInValidDatePassed_ThenFalse() {
+ DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE;
+ DateValidator validator = new DateValidatorUsingLocalDate(dateFormatter);
+
+ assertFalse(validator.isValid("20190230"));
+ }
+}
diff --git a/java-strings-2/README.MD b/java-strings-2/README.MD
index 85832fde37..6548c48f2c 100644
--- a/java-strings-2/README.MD
+++ b/java-strings-2/README.MD
@@ -3,3 +3,4 @@
- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
- [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring)
- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
+- [Blank and Empty Strings in Java](https://www.baeldung.com/java-blank-empty-strings)
diff --git a/java-strings-2/pom.xml b/java-strings-2/pom.xml
index 9c27429139..7342953d15 100755
--- a/java-strings-2/pom.xml
+++ b/java-strings-2/pom.xml
@@ -57,6 +57,26 @@
commons-text
${commons-text.version}
+
+ javax.validation
+ validation-api
+ 2.0.0.Final
+
+
+ org.hibernate.validator
+ hibernate-validator
+ 6.0.2.Final
+
+
+ javax.el
+ javax.el-api
+ 3.0.0
+
+
+ org.glassfish.web
+ javax.el
+ 2.2.6
+
@@ -86,7 +106,7 @@
3.8.1
61.1
- 27.0.1-jre
+ 28.0-jre
1.4
diff --git a/java-strings-2/src/main/java/com/baeldung/string/emptystrings/EmptyStringCheck.java b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/EmptyStringCheck.java
new file mode 100644
index 0000000000..6d3234a4ec
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/EmptyStringCheck.java
@@ -0,0 +1,8 @@
+package com.baeldung.string.emptystrings;
+
+class EmptyStringCheck {
+
+ boolean isEmptyString(String string) {
+ return string == null || string.isEmpty();
+ }
+}
diff --git a/java-strings-2/src/main/java/com/baeldung/string/emptystrings/Java5EmptyStringCheck.java b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/Java5EmptyStringCheck.java
new file mode 100644
index 0000000000..096b83acea
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/Java5EmptyStringCheck.java
@@ -0,0 +1,8 @@
+package com.baeldung.string.emptystrings;
+
+class Java5EmptyStringCheck {
+
+ boolean isEmptyString(String string) {
+ return string == null || string.length() == 0;
+ }
+}
diff --git a/java-strings-2/src/main/java/com/baeldung/string/emptystrings/PlainJavaBlankStringCheck.java b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/PlainJavaBlankStringCheck.java
new file mode 100644
index 0000000000..26e281c9b7
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/PlainJavaBlankStringCheck.java
@@ -0,0 +1,8 @@
+package com.baeldung.string.emptystrings;
+
+class PlainJavaBlankStringCheck {
+
+ boolean isBlankString(String string) {
+ return string == null || string.trim().isEmpty();
+ }
+}
diff --git a/java-strings-2/src/main/java/com/baeldung/string/emptystrings/SomeClassWithValidations.java b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/SomeClassWithValidations.java
new file mode 100644
index 0000000000..8c484efb43
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/emptystrings/SomeClassWithValidations.java
@@ -0,0 +1,14 @@
+package com.baeldung.string.emptystrings;
+
+import javax.validation.constraints.Pattern;
+
+class SomeClassWithValidations {
+
+ @Pattern(regexp = "\\A(?!\\s*\\Z).+")
+ private String someString;
+
+ SomeClassWithValidations setSomeString(String someString) {
+ this.someString = someString;
+ return this;
+ }
+}
diff --git a/java-strings-2/src/main/java/com/baeldung/string/multiline/MultiLineString.java b/java-strings-2/src/main/java/com/baeldung/string/multiline/MultiLineString.java
new file mode 100644
index 0000000000..1bde2dcb63
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/multiline/MultiLineString.java
@@ -0,0 +1,67 @@
+package com.baeldung.string.multiline;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+
+public class MultiLineString {
+
+ String newLine = System.getProperty("line.separator");
+
+ public String stringConcatenation() {
+ return "Get busy living"
+ .concat(newLine)
+ .concat("or")
+ .concat(newLine)
+ .concat("get busy dying.")
+ .concat(newLine)
+ .concat("--Stephen King");
+ }
+
+ public String stringJoin() {
+ return String.join(newLine,
+ "Get busy living",
+ "or",
+ "get busy dying.",
+ "--Stephen King");
+ }
+
+ public String stringBuilder() {
+ return new StringBuilder()
+ .append("Get busy living")
+ .append(newLine)
+ .append("or")
+ .append(newLine)
+ .append("get busy dying.")
+ .append(newLine)
+ .append("--Stephen King")
+ .toString();
+ }
+
+ public String stringWriter() {
+ StringWriter stringWriter = new StringWriter();
+ PrintWriter printWriter = new PrintWriter(stringWriter);
+ printWriter.println("Get busy living");
+ printWriter.println("or");
+ printWriter.println("get busy dying.");
+ printWriter.println("--Stephen King");
+ return stringWriter.toString();
+ }
+
+ public String guavaJoiner() {
+ return Joiner.on(newLine).join(ImmutableList.of("Get busy living",
+ "or",
+ "get busy dying.",
+ "--Stephen King"));
+ }
+
+ public String loadFromFile() throws IOException {
+ return new String(Files.readAllBytes(Paths.get("src/main/resources/stephenking.txt")));
+ }
+
+}
diff --git a/java-strings-2/src/main/java/com/baeldung/string/reverse/ReverseStringExamples.java b/java-strings-2/src/main/java/com/baeldung/string/reverse/ReverseStringExamples.java
new file mode 100644
index 0000000000..1a58d09598
--- /dev/null
+++ b/java-strings-2/src/main/java/com/baeldung/string/reverse/ReverseStringExamples.java
@@ -0,0 +1,56 @@
+package com.baeldung.string.reverse;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class ReverseStringExamples {
+
+ public static String reverse(String input) {
+ if (input == null) {
+ return null;
+ }
+
+ String output = "";
+
+ for (int i = input.length() - 1; i >= 0; i--) {
+ output = output + input.charAt(i);
+ }
+
+ return output;
+ }
+
+ public static String reverseUsingStringBuilder(String input) {
+ if (input == null) {
+ return null;
+ }
+
+ StringBuilder output = new StringBuilder(input).reverse();
+
+ return output.toString();
+ }
+
+ public static String reverseUsingApacheCommons(String input) {
+ return StringUtils.reverse(input);
+ }
+
+ public static String reverseTheOrderOfWords(String sentence) {
+ if (sentence == null) {
+ return null;
+ }
+
+ StringBuilder output = new StringBuilder();
+ String[] words = sentence.split(" ");
+
+ for (int i = words.length - 1; i >= 0; i--) {
+ output.append(words[i]);
+ output.append(" ");
+ }
+
+ return output.toString()
+ .trim();
+ }
+
+ public static String reverseTheOrderOfWordsUsingApacheCommons(String sentence) {
+ return StringUtils.reverseDelimited(sentence, ' ');
+ }
+
+}
diff --git a/java-strings-2/src/main/resources/stephenking.txt b/java-strings-2/src/main/resources/stephenking.txt
new file mode 100644
index 0000000000..f31b4a28bd
--- /dev/null
+++ b/java-strings-2/src/main/resources/stephenking.txt
@@ -0,0 +1,4 @@
+Get busy living
+or
+get busy dying.
+--Stephen King
\ No newline at end of file
diff --git a/java-strings-2/src/test/java/com/baeldung/string/MultiLineStringUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/MultiLineStringUnitTest.java
new file mode 100644
index 0000000000..b458fae79b
--- /dev/null
+++ b/java-strings-2/src/test/java/com/baeldung/string/MultiLineStringUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.string;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import com.baeldung.string.multiline.MultiLineString;
+
+public class MultiLineStringUnitTest {
+
+
+ @Test
+ public void whenCompareMultiLineStrings_thenTheyAreAllTheSame() throws IOException {
+ MultiLineString ms = new MultiLineString();
+ assertEquals(ms.stringConcatenation(), ms.stringJoin());
+ assertEquals(ms.stringJoin(), ms.stringBuilder());
+ assertEquals(ms.stringBuilder(), ms.guavaJoiner());
+ assertEquals(ms.guavaJoiner(), ms.loadFromFile());
+ }
+
+}
diff --git a/java-strings-2/src/test/java/com/baeldung/string/emptystrings/EmptyStringsUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/emptystrings/EmptyStringsUnitTest.java
new file mode 100644
index 0000000000..96b1d681dd
--- /dev/null
+++ b/java-strings-2/src/test/java/com/baeldung/string/emptystrings/EmptyStringsUnitTest.java
@@ -0,0 +1,142 @@
+package com.baeldung.string.emptystrings;
+
+import static org.hamcrest.Matchers.iterableWithSize;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import com.google.common.base.Strings;
+
+public class EmptyStringsUnitTest {
+
+ private String emptyString = "";
+ private String blankString = " \n\t ";
+ private String nonEmptyString = " someString ";
+
+ /*
+ * EmptyStringCheck
+ */
+ @Test
+ public void givenSomeEmptyString_thenEmptyStringCheckIsEmptyStringReturnsTrue() {
+ assertTrue(new EmptyStringCheck().isEmptyString(emptyString));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenEmptyStringCheckIsEmptyStringReturnsFalse() {
+ assertFalse(new EmptyStringCheck().isEmptyString(nonEmptyString));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenEmptyStringCheckIsEmptyStringReturnsFalse() {
+ assertFalse(new EmptyStringCheck().isEmptyString(blankString));
+ }
+
+ /*
+ * Java5EmptyStringCheck
+ */
+ @Test
+ public void givenSomeEmptyString_thenJava5EmptyStringCheckIsEmptyStringReturnsTrue() {
+ assertTrue(new Java5EmptyStringCheck().isEmptyString(emptyString));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenJava5EmptyStringCheckIsEmptyStringReturnsFalse() {
+ assertFalse(new Java5EmptyStringCheck().isEmptyString(nonEmptyString));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenJava5EmptyStringCheckIsEmptyStringReturnsFalse() {
+ assertFalse(new Java5EmptyStringCheck().isEmptyString(blankString));
+ }
+
+ /*
+ * PlainJavaBlankStringCheck
+ */
+ @Test
+ public void givenSomeEmptyString_thenPlainJavaBlankStringCheckIsBlankStringReturnsTrue() {
+ assertTrue(new PlainJavaBlankStringCheck().isBlankString(emptyString));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenPlainJavaBlankStringCheckIsBlankStringReturnsFalse() {
+ assertFalse(new PlainJavaBlankStringCheck().isBlankString(nonEmptyString));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenPlainJavaBlankStringCheckIsBlankStringReturnsTrue() {
+ assertTrue(new PlainJavaBlankStringCheck().isBlankString(blankString));
+ }
+
+ /*
+ * Apache Commons Lang StringUtils
+ */
+ @Test
+ public void givenSomeEmptyString_thenStringUtilsIsBlankReturnsTrue() {
+ assertTrue(StringUtils.isBlank(emptyString));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenStringUtilsIsBlankReturnsFalse() {
+ assertFalse(StringUtils.isBlank(nonEmptyString));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenStringUtilsIsBlankReturnsTrue() {
+ assertTrue(StringUtils.isBlank(blankString));
+ }
+
+ /*
+ * Google Guava Strings
+ */
+ @Test
+ public void givenSomeEmptyString_thenStringsIsNullOrEmptyStringReturnsTrue() {
+ assertTrue(Strings.isNullOrEmpty(emptyString));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenStringsIsNullOrEmptyStringReturnsFalse() {
+ assertFalse(Strings.isNullOrEmpty(nonEmptyString));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenStringsIsNullOrEmptyStringReturnsFalse() {
+ assertFalse(Strings.isNullOrEmpty(blankString));
+ }
+
+ /*
+ * Bean Validation
+ */
+ private ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+ private Validator validator = factory.getValidator();
+
+ @Test
+ public void givenSomeEmptyString_thenBeanValidationReturnsViolations() {
+ SomeClassWithValidations someClassWithValidations = new SomeClassWithValidations().setSomeString(emptyString);
+ Set> violations = validator.validate(someClassWithValidations);
+ assertThat(violations, iterableWithSize(1));
+ }
+
+ @Test
+ public void givenSomeNonEmptyString_thenBeanValidationValidatesWithoutViolations() {
+ SomeClassWithValidations someClassWithValidations = new SomeClassWithValidations().setSomeString(nonEmptyString);
+ Set> violations = validator.validate(someClassWithValidations);
+ assertThat(violations, iterableWithSize(0));
+ }
+
+ @Test
+ public void givenSomeBlankString_thenBeanValidationReturnsViolations() {
+ SomeClassWithValidations someClassWithValidations = new SomeClassWithValidations().setSomeString(blankString);
+ Set> violations = validator.validate(someClassWithValidations);
+ assertThat(violations, iterableWithSize(1));
+ }
+}
diff --git a/java-strings-2/src/test/java/com/baeldung/string/repetition/SubstringRepetitionUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/repetition/SubstringRepetitionUnitTest.java
index fbd948d2be..f382a24a7f 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/repetition/SubstringRepetitionUnitTest.java
+++ b/java-strings-2/src/test/java/com/baeldung/string/repetition/SubstringRepetitionUnitTest.java
@@ -9,11 +9,11 @@ public class SubstringRepetitionUnitTest {
private String validString = "aa";
private String validStringTwo = "ababab";
- private String validStringThree = "aabcaabcaabcaabc";
+ private String validStringThree = "baeldungbaeldung";
private String invalidString = "aca";
private String invalidStringTwo = "ababa";
- private String invalidStringThree = "abcdab";
+ private String invalidStringThree = "baeldungnonrepeatedbaeldung";
@Test
public void givenValidStrings_whenCheckIfContainsOnlySubstrings_thenReturnsTrue() {
diff --git a/java-strings-2/src/test/java/com/baeldung/string/reverse/ReverseStringExamplesUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/reverse/ReverseStringExamplesUnitTest.java
new file mode 100644
index 0000000000..020ead02db
--- /dev/null
+++ b/java-strings-2/src/test/java/com/baeldung/string/reverse/ReverseStringExamplesUnitTest.java
@@ -0,0 +1,70 @@
+package com.baeldung.string.reverse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ReverseStringExamplesUnitTest {
+
+ private static final String STRING_INPUT = "cat";
+ private static final String STRING_INPUT_REVERSED = "tac";
+ private static final String SENTENCE = "The quick brown fox jumps over the lazy dog";
+ private static final String REVERSED_WORDS_SENTENCE = "dog lazy the over jumps fox brown quick The";
+
+ @Test
+ public void whenReverseIsCalled_ThenCorrectStringIsReturned() {
+ String reversed = ReverseStringExamples.reverse(STRING_INPUT);
+ String reversedNull = ReverseStringExamples.reverse(null);
+ String reversedEmpty = ReverseStringExamples.reverse(StringUtils.EMPTY);
+
+ assertEquals(STRING_INPUT_REVERSED, reversed);
+ assertEquals(null, reversedNull);
+ assertEquals(StringUtils.EMPTY, reversedEmpty);
+ }
+
+ @Test
+ public void whenReverseUsingStringBuilderIsCalled_ThenCorrectStringIsReturned() throws Exception {
+ String reversed = ReverseStringExamples.reverseUsingStringBuilder(STRING_INPUT);
+ String reversedNull = ReverseStringExamples.reverseUsingStringBuilder(null);
+ String reversedEmpty = ReverseStringExamples.reverseUsingStringBuilder(StringUtils.EMPTY);
+
+ assertEquals(STRING_INPUT_REVERSED, reversed);
+ assertEquals(null, reversedNull);
+ assertEquals(StringUtils.EMPTY, reversedEmpty);
+ }
+
+ @Test
+ public void whenReverseUsingApacheCommonsIsCalled_ThenCorrectStringIsReturned() throws Exception {
+ String reversed = ReverseStringExamples.reverseUsingApacheCommons(STRING_INPUT);
+ String reversedNull = ReverseStringExamples.reverseUsingApacheCommons(null);
+ String reversedEmpty = ReverseStringExamples.reverseUsingApacheCommons(StringUtils.EMPTY);
+
+ assertEquals(STRING_INPUT_REVERSED, reversed);
+ assertEquals(null, reversedNull);
+ assertEquals(StringUtils.EMPTY, reversedEmpty);
+ }
+
+ @Test
+ public void whenReverseTheOrderOfWordsIsCalled_ThenCorrectStringIsReturned() {
+ String reversed = ReverseStringExamples.reverseTheOrderOfWords(SENTENCE);
+ String reversedNull = ReverseStringExamples.reverseTheOrderOfWords(null);
+ String reversedEmpty = ReverseStringExamples.reverseTheOrderOfWords(StringUtils.EMPTY);
+
+ assertEquals(REVERSED_WORDS_SENTENCE, reversed);
+ assertEquals(null, reversedNull);
+ assertEquals(StringUtils.EMPTY, reversedEmpty);
+ }
+
+ @Test
+ public void whenReverseTheOrderOfWordsUsingApacheCommonsIsCalled_ThenCorrectStringIsReturned() {
+ String reversed = ReverseStringExamples.reverseTheOrderOfWordsUsingApacheCommons(SENTENCE);
+ String reversedNull = ReverseStringExamples.reverseTheOrderOfWordsUsingApacheCommons(null);
+ String reversedEmpty = ReverseStringExamples.reverseTheOrderOfWordsUsingApacheCommons(StringUtils.EMPTY);
+
+ assertEquals(REVERSED_WORDS_SENTENCE, reversed);
+ assertEquals(null, reversedNull);
+ assertEquals(StringUtils.EMPTY, reversedEmpty);
+ }
+
+}
diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml
index 02e1da017a..7bd3f5b355 100644
--- a/libraries-2/pom.xml
+++ b/libraries-2/pom.xml
@@ -1,70 +1,71 @@
-
- 4.0.0
- libraries2
- libraries2
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
-
-
-
- jboss-public-repository-group
- JBoss Public Repository Group
- http://repository.jboss.org/nexus/content/groups/public/
-
- true
- never
-
-
- true
- daily
-
-
-
-
-
-
- com.pivovarit
- parallel-collectors
- 1.1.0
-
-
- org.assertj
- assertj-core
- ${assertj.version}
-
-
- io.github.classgraph
- classgraph
- ${classgraph.version}
-
-
- org.jbpm
- jbpm-test
- ${jbpm.version}
-
-
- info.picocli
- picocli
- ${picocli.version}
-
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
+ libraries2
+ libraries2
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+ jboss-public-repository-group
+ JBoss Public Repository Group
+ http://repository.jboss.org/nexus/content/groups/public/
+
+ true
+ never
+
+
+ true
+ daily
+
+
+
+
+
+ org.mapdb
+ mapdb
+ ${mapdb.version}
+
+
+ com.pivovarit
+ parallel-collectors
+ 1.1.0
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ io.github.classgraph
+ classgraph
+ ${classgraph.version}
+
+
+ org.jbpm
+ jbpm-test
+ ${jbpm.version}
+
+
+ info.picocli
+ picocli
+ ${picocli.version}
+
org.ejml
ejml-all
${ejml.version}
-
- org.nd4j
- nd4j-native
- ${nd4j.version}
-
+
+ org.nd4j
+ nd4j-native
+ ${nd4j.version}
+
org.la4j
la4j
@@ -75,87 +76,85 @@
colt
${colt.version}
-
- org.springframework.boot
- spring-boot-starter
- ${spring-boot-starter.version}
-
-
- net.openhft
- chronicle-map
- ${chronicle.map.version}
-
-
- com.sun.java
- tools
-
-
-
-
-
-
- com.squareup.okhttp3
- okhttp
- 3.14.2
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- 2.9.9
-
-
-
- com.google.code.gson
- gson
- 2.8.5
-
-
-
- com.squareup.okhttp3
- mockwebserver
- 3.14.2
- test
-
-
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot-starter.version}
+
+
+ net.openhft
+ chronicle-map
+ ${chronicle.map.version}
+
+
+ com.sun.java
+ tools
+
+
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 3.14.2
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.9.9
+
+
+ com.google.code.gson
+ gson
+ 2.8.5
+
+
+ com.squareup.okhttp3
+ mockwebserver
+ 3.14.2
+ test
+
edu.uci.ics
crawler4j
${crawler4j.version}
-
-
-
- com.github.jknack
- handlebars
- 4.1.2
-
-
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh.version}
-
-
-
-
-
- 3.6.2
- 4.8.28
- 6.0.0.Final
- 3.9.6
- 3.17.2
+
+
+ com.github.jknack
+ handlebars
+ 4.1.2
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+
+
+ org.apache.mesos
+ mesos
+ ${mesos.library.version}
+
+
+
+ 3.0.7
+ 3.6.2
+ 4.8.28
+ 6.0.0.Final
+ 3.9.6
+ 3.17.2
4.4.0
- 2.1.4.RELEASE
- 0.38
- 1.0.0-beta4
- 1.2.0
- 0.6.0
- 1.19
-
+ 2.1.4.RELEASE
+ 0.38
+ 1.0.0-beta4
+ 1.2.0
+ 0.6.0
+ 1.19
+ 0.28.3
+
diff --git a/libraries-2/src/main/java/com/baeldung/mesos/HelloWorldMain.java b/libraries-2/src/main/java/com/baeldung/mesos/HelloWorldMain.java
new file mode 100644
index 0000000000..e4bf593e7e
--- /dev/null
+++ b/libraries-2/src/main/java/com/baeldung/mesos/HelloWorldMain.java
@@ -0,0 +1,42 @@
+package com.baeldung.mesos;
+
+import com.baeldung.mesos.schedulers.HelloWorldScheduler;
+import org.apache.mesos.MesosSchedulerDriver;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.CommandInfo;
+import org.apache.mesos.Protos.ExecutorInfo;
+import org.apache.mesos.Protos.FrameworkInfo;
+
+public class HelloWorldMain {
+
+ public static void main(String[] args) {
+
+ String path = System.getProperty("user.dir")
+ + "/target/libraries2-1.0.0-SNAPSHOT.jar";
+
+ CommandInfo.URI uri = CommandInfo.URI.newBuilder().setValue(path).setExtract(false).build();
+
+ String helloWorldCommand = "java -cp libraries2-1.0.0-SNAPSHOT.jar com.baeldung.mesos.executors.HelloWorldExecutor";
+ CommandInfo commandInfoHelloWorld = CommandInfo.newBuilder().setValue(helloWorldCommand).addUris(uri)
+ .build();
+
+ ExecutorInfo executorHelloWorld = ExecutorInfo.newBuilder()
+ .setExecutorId(Protos.ExecutorID.newBuilder().setValue("HelloWorldExecutor"))
+ .setCommand(commandInfoHelloWorld).setName("Hello World (Java)").setSource("java").build();
+
+ FrameworkInfo.Builder frameworkBuilder = FrameworkInfo.newBuilder().setFailoverTimeout(120000)
+ .setUser("")
+ .setName("Hello World Framework (Java)");
+
+ frameworkBuilder.setPrincipal("test-framework-java");
+
+ MesosSchedulerDriver driver = new MesosSchedulerDriver(new HelloWorldScheduler(executorHelloWorld), frameworkBuilder.build(), args[0]);
+
+ int status = driver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1;
+
+ // Ensure that the driver process terminates.
+ driver.stop();
+
+ System.exit(status);
+ }
+}
diff --git a/libraries-2/src/main/java/com/baeldung/mesos/executors/HelloWorldExecutor.java b/libraries-2/src/main/java/com/baeldung/mesos/executors/HelloWorldExecutor.java
new file mode 100644
index 0000000000..a8620bbce3
--- /dev/null
+++ b/libraries-2/src/main/java/com/baeldung/mesos/executors/HelloWorldExecutor.java
@@ -0,0 +1,59 @@
+package com.baeldung.mesos.executors;
+
+import org.apache.mesos.Executor;
+import org.apache.mesos.ExecutorDriver;
+import org.apache.mesos.MesosExecutorDriver;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.TaskInfo;
+
+public class HelloWorldExecutor implements Executor {
+ @Override
+ public void registered(ExecutorDriver driver, Protos.ExecutorInfo executorInfo, Protos.FrameworkInfo frameworkInfo, Protos.SlaveInfo slaveInfo) {
+ }
+
+ @Override
+ public void reregistered(ExecutorDriver driver, Protos.SlaveInfo slaveInfo) {
+ }
+
+ @Override
+ public void disconnected(ExecutorDriver driver) {
+ }
+
+ @Override
+ public void launchTask(ExecutorDriver driver, TaskInfo task) {
+
+ Protos.TaskStatus status = Protos.TaskStatus.newBuilder().setTaskId(task.getTaskId())
+ .setState(Protos.TaskState.TASK_RUNNING).build();
+ driver.sendStatusUpdate(status);
+
+ String myStatus = "Hello Framework";
+ driver.sendFrameworkMessage(myStatus.getBytes());
+
+ System.out.println("Hello World!!!");
+
+ status = Protos.TaskStatus.newBuilder().setTaskId(task.getTaskId())
+ .setState(Protos.TaskState.TASK_FINISHED).build();
+ driver.sendStatusUpdate(status);
+ }
+
+ @Override
+ public void killTask(ExecutorDriver driver, Protos.TaskID taskId) {
+ }
+
+ @Override
+ public void frameworkMessage(ExecutorDriver driver, byte[] data) {
+ }
+
+ @Override
+ public void shutdown(ExecutorDriver driver) {
+ }
+
+ @Override
+ public void error(ExecutorDriver driver, String message) {
+ }
+
+ public static void main(String[] args) {
+ MesosExecutorDriver driver = new MesosExecutorDriver(new HelloWorldExecutor());
+ System.exit(driver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1);
+ }
+}
diff --git a/libraries-2/src/main/java/com/baeldung/mesos/schedulers/HelloWorldScheduler.java b/libraries-2/src/main/java/com/baeldung/mesos/schedulers/HelloWorldScheduler.java
new file mode 100644
index 0000000000..68808b4dd0
--- /dev/null
+++ b/libraries-2/src/main/java/com/baeldung/mesos/schedulers/HelloWorldScheduler.java
@@ -0,0 +1,100 @@
+package com.baeldung.mesos.schedulers;
+
+import com.google.protobuf.ByteString;
+import org.apache.mesos.Protos;
+import org.apache.mesos.Protos.ExecutorInfo;
+import org.apache.mesos.Protos.Offer;
+import org.apache.mesos.Protos.OfferID;
+import org.apache.mesos.Protos.TaskInfo;
+import org.apache.mesos.Scheduler;
+import org.apache.mesos.SchedulerDriver;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class HelloWorldScheduler implements Scheduler {
+
+ private int launchedTasks = 0;
+ private final ExecutorInfo helloWorldExecutor;
+
+ public HelloWorldScheduler(ExecutorInfo helloWorldExecutor) {
+ this.helloWorldExecutor = helloWorldExecutor;
+ }
+
+ @Override
+ public void registered(SchedulerDriver schedulerDriver, Protos.FrameworkID frameworkID, Protos.MasterInfo masterInfo) {
+
+ }
+
+ @Override
+ public void reregistered(SchedulerDriver schedulerDriver, Protos.MasterInfo masterInfo) {
+
+ }
+
+ @Override
+ public void resourceOffers(SchedulerDriver schedulerDriver, List list) {
+
+ for (Offer offer : list) {
+ List tasks = new ArrayList();
+ Protos.TaskID taskId = Protos.TaskID.newBuilder().setValue(Integer.toString(launchedTasks++)).build();
+
+ System.out.println("Launching printHelloWorld " + taskId.getValue() + " Hello World Java");
+ TaskInfo printHelloWorld = TaskInfo
+ .newBuilder()
+ .setName("printHelloWorld " + taskId.getValue())
+ .setTaskId(taskId)
+ .setSlaveId(offer.getSlaveId())
+ .addResources(
+ Protos.Resource.newBuilder().setName("cpus").setType(Protos.Value.Type.SCALAR)
+ .setScalar(Protos.Value.Scalar.newBuilder().setValue(1)))
+ .addResources(
+ Protos.Resource.newBuilder().setName("mem").setType(Protos.Value.Type.SCALAR)
+ .setScalar(Protos.Value.Scalar.newBuilder().setValue(128)))
+ .setExecutor(ExecutorInfo.newBuilder(helloWorldExecutor)).build();
+
+ List offerIDS = new ArrayList<>();
+ offerIDS.add(offer.getId());
+
+ tasks.add(printHelloWorld);
+
+ schedulerDriver.declineOffer(offer.getId());
+ schedulerDriver.launchTasks(offerIDS, tasks);
+ }
+
+ }
+
+ @Override
+ public void offerRescinded(SchedulerDriver schedulerDriver, OfferID offerID) {
+
+ }
+
+ @Override
+ public void statusUpdate(SchedulerDriver schedulerDriver, Protos.TaskStatus taskStatus) {
+
+ }
+
+ @Override
+ public void frameworkMessage(SchedulerDriver schedulerDriver, Protos.ExecutorID executorID, Protos.SlaveID slaveID, byte[] bytes) {
+
+ }
+
+ @Override
+ public void disconnected(SchedulerDriver schedulerDriver) {
+
+ }
+
+ @Override
+ public void slaveLost(SchedulerDriver schedulerDriver, Protos.SlaveID slaveID) {
+
+ }
+
+ @Override
+ public void executorLost(SchedulerDriver schedulerDriver, Protos.ExecutorID executorID, Protos.SlaveID slaveID, int i) {
+
+ }
+
+ @Override
+ public void error(SchedulerDriver schedulerDriver, String s) {
+
+ }
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java
new file mode 100644
index 0000000000..6f5141b054
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/CollectionsUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.mapdb;
+
+import org.junit.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.Serializer;
+
+import java.util.NavigableSet;
+
+import static junit.framework.Assert.assertEquals;
+
+public class CollectionsUnitTest {
+
+ @Test
+ public void givenSetCreatedInDB_whenMultipleElementsAdded_checkOnlyOneExists() {
+
+ DB db = DBMaker.memoryDB().make();
+
+ NavigableSet set = db.
+ treeSet("mySet")
+ .serializer(Serializer.STRING)
+ .createOrOpen();
+
+ String myString = "Baeldung!";
+
+ set.add(myString);
+ set.add(myString);
+
+ assertEquals(1, set.size());
+
+ db.close();
+ }
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java
new file mode 100644
index 0000000000..3b7cac04fb
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/HTreeMapUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.mapdb;
+
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.mapdb.*;
+
+import java.io.IOException;
+
+import static junit.framework.Assert.assertEquals;
+
+public class HTreeMapUnitTest {
+
+ @Test
+ public void givenValidDB_whenHTreeMapAddedToAndRetrieved_CheckedRetrievalCorrect() {
+
+ DB db = DBMaker.memoryDB().make();
+
+ HTreeMap hTreeMap = db
+ .hashMap("myTreMap")
+ .keySerializer(Serializer.STRING)
+ .valueSerializer(Serializer.STRING)
+ .create();
+
+ hTreeMap.put("key1", "value1");
+ hTreeMap.put("key2", "value2");
+
+ assertEquals(2, hTreeMap.size());
+
+ //add another value with the same key
+
+ hTreeMap.put("key1", "value3");
+
+ assertEquals(2, hTreeMap.size());
+ assertEquals("value3", hTreeMap.get("key1"));
+
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java
new file mode 100644
index 0000000000..952efd0639
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/HelloBaeldungUnitTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.mapdb;
+
+import org.junit.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.HTreeMap;
+
+import java.util.concurrent.ConcurrentMap;
+
+import static junit.framework.Assert.assertEquals;
+
+public class HelloBaeldungUnitTest {
+
+ @Test
+ public void givenInMemoryDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() {
+
+ DB db = DBMaker.memoryDB().make();
+
+ String welcomeMessageKey = "Welcome Message";
+ String welcomeMessageString = "Hello Baeldung!";
+
+ HTreeMap myMap = db.hashMap("myMap").createOrOpen();
+ myMap.put(welcomeMessageKey, welcomeMessageString);
+
+ String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey);
+
+ db.close();
+
+ assertEquals(welcomeMessageString, welcomeMessageFromDB);
+ }
+
+ @Test
+ public void givenInFileDBInstantiateCorrectly_whenDataSavedAndRetrieved_checkRetrievalCorrect() {
+
+ DB db = DBMaker.fileDB("file.db").make();
+
+ String welcomeMessageKey = "Welcome Message";
+ String welcomeMessageString = "Hello Baeldung!";
+
+ HTreeMap myMap = db.hashMap("myMap").createOrOpen();
+ myMap.put(welcomeMessageKey, welcomeMessageString);
+
+ String welcomeMessageFromDB = (String) myMap.get(welcomeMessageKey);
+
+ db.close();
+
+ assertEquals(welcomeMessageString, welcomeMessageFromDB);
+ }
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java
new file mode 100644
index 0000000000..9c53f9c792
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/InMemoryModesUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.mapdb;
+
+import org.junit.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.HTreeMap;
+import org.mapdb.Serializer;
+
+import static junit.framework.Assert.assertEquals;
+
+public class InMemoryModesUnitTest {
+
+ @Test
+ public void givenDBCreatedOnHeap_whenUsed_checkUsageCorrect() {
+
+ DB heapDB = DBMaker.heapDB().make();
+
+ HTreeMap map = heapDB
+ .hashMap("myMap")
+ .keySerializer(Serializer.INTEGER)
+ .valueSerializer(Serializer.STRING)
+ .createOrOpen();
+
+ map.put(1, "ONE");
+
+ assertEquals("ONE", map.get(1));
+
+ }
+
+ @Test
+ public void givenDBCreatedBaseOnByteArray_whenUsed_checkUsageCorrect() {
+
+ DB heapDB = DBMaker.memoryDB().make();
+
+ HTreeMap map = heapDB
+ .hashMap("myMap")
+ .keySerializer(Serializer.INTEGER)
+ .valueSerializer(Serializer.STRING)
+ .createOrOpen();
+
+ map.put(1, "ONE");
+
+ assertEquals("ONE", map.get(1));
+ }
+
+ @Test
+ public void givenDBCreatedBaseOnDirectByteBuffer_whenUsed_checkUsageCorrect() {
+
+ DB heapDB = DBMaker.memoryDirectDB().make();
+
+ HTreeMap map = heapDB
+ .hashMap("myMap")
+ .keySerializer(Serializer.INTEGER)
+ .valueSerializer(Serializer.STRING)
+ .createOrOpen();
+
+ map.put(1, "ONE");
+
+ assertEquals("ONE", map.get(1));
+ }
+
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java
new file mode 100644
index 0000000000..83ba917393
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/SortedTableMapUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.mapdb;
+
+import org.junit.Test;
+import org.mapdb.Serializer;
+import org.mapdb.SortedTableMap;
+import org.mapdb.volume.MappedFileVol;
+import org.mapdb.volume.Volume;
+
+import static junit.framework.Assert.assertEquals;
+
+public class SortedTableMapUnitTest {
+
+ private static final String VOLUME_LOCATION = "sortedTableMapVol.db";
+
+ @Test
+ public void givenValidSortedTableMapSetup_whenQueried_checkValuesCorrect() {
+
+ //create memory mapped volume, readonly false
+ Volume vol = MappedFileVol.FACTORY.makeVolume(VOLUME_LOCATION, false);
+
+ //create sink to feed the map with data
+ SortedTableMap.Sink sink =
+ SortedTableMap.create(
+ vol,
+ Serializer.INTEGER,
+ Serializer.STRING
+ ).createFromSink();
+
+ //add content
+ for(int i = 0; i < 100; i++){
+ sink.put(i, "Value " + Integer.toString(i));
+ }
+
+ sink.create();
+
+ //now open in read-only mode
+ Volume openVol = MappedFileVol.FACTORY.makeVolume(VOLUME_LOCATION, true);
+
+ SortedTableMap sortedTableMap = SortedTableMap.open(
+ openVol,
+ Serializer.INTEGER,
+ Serializer.STRING
+ );
+
+ assertEquals(100, sortedTableMap.size());
+ }
+}
diff --git a/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java
new file mode 100644
index 0000000000..4de9db10e8
--- /dev/null
+++ b/libraries-2/src/test/java/com/baeldung/mapdb/TransactionsUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.mapdb;
+
+import org.junit.Test;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.Serializer;
+
+import java.util.NavigableSet;
+
+import static junit.framework.Assert.assertEquals;
+
+public class TransactionsUnitTest {
+
+ @Test
+ public void givenValidDBSetup_whenTransactionCommittedAndRolledBack_checkPreviousStateAchieved() {
+
+ DB db = DBMaker.memoryDB().transactionEnable().make();
+
+ NavigableSet set = db
+ .treeSet("mySet")
+ .serializer(Serializer.STRING)
+ .createOrOpen();
+
+ set.add("One");
+ set.add("Two");
+
+ db.commit();
+
+ assertEquals(2, set.size());
+
+ set.add("Three");
+
+ assertEquals(3, set.size());
+
+ db.rollback();
+
+ assertEquals(2, set.size());
+
+ db.close();
+ }
+}
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 7823732224..886dd3c4a2 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -19,6 +19,9 @@
${typesafe-akka.version}
+
+
+
com.typesafe.akka
akka-testkit_2.12
@@ -837,6 +840,7 @@
1.4.196
1.0
+
4.5.3
2.9.7
2.92
diff --git a/pom.xml b/pom.xml
index 45b6818e66..d67622feb7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1147,7 +1147,7 @@
java-rmi
java-spi
java-streams
- java-streams-2
+
java-strings
java-strings-2
java-vavr-stream
diff --git a/spring-5/src/main/java/com/baeldung/components/AccountService.java b/spring-5/src/main/java/com/baeldung/components/AccountService.java
new file mode 100644
index 0000000000..c2f09c735e
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/components/AccountService.java
@@ -0,0 +1,8 @@
+package com.baeldung.components;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class AccountService {
+
+}
diff --git a/spring-5/src/main/java/com/baeldung/components/UserService.java b/spring-5/src/main/java/com/baeldung/components/UserService.java
new file mode 100644
index 0000000000..80e5e0c632
--- /dev/null
+++ b/spring-5/src/main/java/com/baeldung/components/UserService.java
@@ -0,0 +1,16 @@
+package com.baeldung.components;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class UserService {
+
+ @Autowired
+ private AccountService accountService;
+
+ public AccountService getAccountService() {
+ return accountService;
+ }
+
+}
diff --git a/spring-5/src/main/resources/beans.xml b/spring-5/src/main/resources/beans.xml
new file mode 100644
index 0000000000..004745b817
--- /dev/null
+++ b/spring-5/src/main/resources/beans.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-5/src/test/java/com/baeldung/SpringXMLConfigurationIntegrationTest.java b/spring-5/src/test/java/com/baeldung/SpringXMLConfigurationIntegrationTest.java
new file mode 100644
index 0000000000..4ecad9c43e
--- /dev/null
+++ b/spring-5/src/test/java/com/baeldung/SpringXMLConfigurationIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import com.baeldung.components.AccountService;
+import com.baeldung.components.UserService;
+
+public class SpringXMLConfigurationIntegrationTest {
+
+ @Test
+ public void givenContextAnnotationConfigOrContextComponentScan_whenDependenciesAndBeansAnnotated_thenNoXMLNeeded() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
+ UserService userService = context.getBean(UserService.class);
+ AccountService accountService = context.getBean(AccountService.class);
+ Assert.assertNotNull(userService);
+ Assert.assertNotNull(accountService);
+ Assert.assertNotNull(userService.getAccountService());
+ }
+
+}
diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.MD
index d303179ef6..99d7db5743 100644
--- a/spring-boot-testing/README.MD
+++ b/spring-boot-testing/README.MD
@@ -6,4 +6,3 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing)
- [Exclude Auto-Configuration Classes in Spring Boot Tests](https://www.baeldung.com/spring-boot-exclude-auto-configuration-test)
- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level)
-- [Override properties in Spring]
diff --git a/spring-boot-testing/src/test/resources/application-test.properties b/spring-boot-testing/src/test/resources/application-test.properties
index da187d8086..a2c9b6d480 100644
--- a/spring-boot-testing/src/test/resources/application-test.properties
+++ b/spring-boot-testing/src/test/resources/application-test.properties
@@ -1,5 +1,2 @@
# test properties
-spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
-
-# override properties
-example.firstProperty=profile
\ No newline at end of file
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-testing/src/test/resources/application.properties b/spring-boot-testing/src/test/resources/application.properties
index e71b24a4e1..9a8b496a8b 100644
--- a/spring-boot-testing/src/test/resources/application.properties
+++ b/spring-boot-testing/src/test/resources/application.properties
@@ -1,7 +1,3 @@
# security
spring.security.user.name=john
-spring.security.user.password=123
-
-# override properties
-example.firstProperty=file
-example.secondProperty=file
\ No newline at end of file
+spring.security.user.password=123
\ No newline at end of file
diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java b/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java
index f2da5af92c..739e4d3417 100644
--- a/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java
+++ b/spring-security-mvc-boot/src/main/java/org/baeldung/custom/config/SecurityConfig.java
@@ -1,57 +1,12 @@
package org.baeldung.custom.config;
-import org.baeldung.custom.security.MyUserDetailsService;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.builders.WebSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
-@EnableWebSecurity
-@ComponentScan("org.baeldung.security")
-public class SecurityConfig extends WebSecurityConfigurerAdapter {
-
- @Autowired
- private MyUserDetailsService userDetailsService;
-
- @Override
- protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.authenticationProvider(authenticationProvider());
- }
-
- @Override
- public void configure(WebSecurity web) throws Exception {
- web.ignoring().antMatchers("/resources/**");
- }
-
- @Override
- protected void configure(final HttpSecurity http) throws Exception {
- // @formatter:off
- http.authorizeRequests()
- .antMatchers("/login").permitAll()
- .antMatchers("/admin").hasRole("ADMIN")
- .anyRequest().authenticated()
- .and().formLogin().permitAll()
- .and().csrf().disable();
- ;
- // @formatter:on
- }
-
- @Bean
- public DaoAuthenticationProvider authenticationProvider() {
- final DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
- authProvider.setUserDetailsService(userDetailsService);
- authProvider.setPasswordEncoder(encoder());
- return authProvider;
- }
+public class SecurityConfig {
@Bean
public PasswordEncoder encoder() {
diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java b/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java
index 6572954427..74de45d1a8 100644
--- a/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java
+++ b/spring-security-mvc-boot/src/main/java/org/baeldung/custom/web/MainController.java
@@ -3,14 +3,16 @@ package org.baeldung.custom.web;
import org.baeldung.custom.persistence.dao.OrganizationRepository;
import org.baeldung.custom.persistence.model.Foo;
import org.baeldung.custom.persistence.model.Organization;
+import org.baeldung.custom.security.MyUserPrincipal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@@ -23,14 +25,14 @@ public class MainController {
// @PostAuthorize("hasPermission(returnObject, 'read')")
@PreAuthorize("hasPermission(#id, 'Foo', 'read')")
- @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")
+ @GetMapping("/foos/{id}")
@ResponseBody
public Foo findById(@PathVariable final long id) {
return new Foo("Sample");
}
@PreAuthorize("hasPermission(#foo, 'write')")
- @RequestMapping(method = RequestMethod.POST, value = "/foos")
+ @PostMapping("/foos")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public Foo create(@RequestBody final Foo foo) {
@@ -40,7 +42,7 @@ public class MainController {
//
@PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')")
- @RequestMapping(method = RequestMethod.GET, value = "/foos")
+ @GetMapping("/foos")
@ResponseBody
public Foo findFooByName(@RequestParam final String name) {
return new Foo(name);
@@ -49,10 +51,18 @@ public class MainController {
//
@PreAuthorize("isMember(#id)")
- @RequestMapping(method = RequestMethod.GET, value = "/organizations/{id}")
+ @GetMapping("/organizations/{id}")
@ResponseBody
public Organization findOrgById(@PathVariable final long id) {
- return organizationRepository.findById(id).orElse(null);
+ return organizationRepository.findById(id)
+ .orElse(null);
+ }
+
+ @PreAuthorize("hasPermission(#id, 'Foo', 'read')")
+ @GetMapping("/user")
+ @ResponseBody
+ public MyUserPrincipal retrieveUserDetails(@AuthenticationPrincipal MyUserPrincipal principal) {
+ return principal;
}
}
diff --git a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
index fb25175902..d16acc729a 100644
--- a/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
+++ b/spring-security-mvc-boot/src/test/java/org/baeldung/web/CustomUserDetailsServiceIntegrationTest.java
@@ -1,76 +1,89 @@
package org.baeldung.web;
-import static org.junit.Assert.assertEquals;
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import org.apache.http.HttpHeaders;
import org.baeldung.custom.Application;
-import org.baeldung.custom.config.MvcConfig;
-import org.baeldung.custom.config.SecurityConfig;
-import org.baeldung.custom.persistence.dao.UserRepository;
-import org.baeldung.custom.persistence.model.User;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.baeldung.custom.persistence.model.Foo;
+import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.security.test.context.support.WithAnonymousUser;
+import org.springframework.security.test.context.support.WithUserDetails;
+import org.springframework.test.web.servlet.MockMvc;
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringBootTest(classes = {Application.class})
-@WebAppConfiguration
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@SpringBootTest(classes = { Application.class })
+@AutoConfigureMockMvc
public class CustomUserDetailsServiceIntegrationTest {
- private static final String USERNAME = "user";
- private static final String PASSWORD = "pass";
- private static final String USERNAME2 = "user2";
-
@Autowired
- private UserRepository myUserRepository;
-
- @Autowired
- private AuthenticationProvider authenticationProvider;
-
- @Autowired
- private PasswordEncoder passwordEncoder;
-
- //
+ private MockMvc mvc;
@Test
- public void givenExistingUser_whenAuthenticate_thenRetrieveFromDb() {
- User user = new User();
- user.setUsername(USERNAME);
- user.setPassword(passwordEncoder.encode(PASSWORD));
-
- myUserRepository.save(user);
-
- UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME, PASSWORD);
- Authentication authentication = authenticationProvider.authenticate(auth);
-
- assertEquals(authentication.getName(), USERNAME);
+ @WithUserDetails("john")
+ public void givenUserWithReadPermissions_whenRequestUserInfo_thenRetrieveUserData() throws Exception {
+ this.mvc.perform(get("/user").with(csrf()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.user.privileges[0].name").value("FOO_READ_PRIVILEGE"))
+ .andExpect(jsonPath("$.user.organization.name").value("FirstOrg"))
+ .andExpect(jsonPath("$.user.username").value("john"));
}
- @Test(expected = BadCredentialsException.class)
- public void givenIncorrectUser_whenAuthenticate_thenBadCredentialsException() {
- User user = new User();
- user.setUsername(USERNAME);
- user.setPassword(passwordEncoder.encode(PASSWORD));
-
- myUserRepository.save(user);
-
- UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME2, PASSWORD);
- authenticationProvider.authenticate(auth);
+ @Test
+ @WithUserDetails("tom")
+ public void givenUserWithWritePermissions_whenRequestUserInfo_thenRetrieveUserData() throws Exception {
+ this.mvc.perform(get("/user").with(csrf()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.user.privileges").isArray())
+ .andExpect(jsonPath("$.user.organization.name").value("SecondOrg"))
+ .andExpect(jsonPath("$.user.username").value("tom"));
}
- //
+ @Test
+ @WithUserDetails("john")
+ public void givenUserWithReadPermissions_whenRequestFoo_thenRetrieveSampleFoo() throws Exception {
+ this.mvc.perform(get("/foos/1").with(csrf()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.name").value("Sample"));
+ }
- @After
- public void tearDown() {
- myUserRepository.removeUserByUsername(USERNAME);
+ @Test
+ @WithAnonymousUser
+ public void givenAnonymous_whenRequestFoo_thenRetrieveUnauthorized() throws Exception {
+ this.mvc.perform(get("/foos/1").with(csrf()))
+ .andExpect(status().isUnauthorized());
+ }
+
+ @Test
+ @WithUserDetails("john")
+ public void givenUserWithReadPermissions_whenCreateNewFoo_thenForbiddenStatusRetrieved() throws Exception {
+ this.mvc.perform(post("/foos").with(csrf())
+ .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+ .content(asJsonString(new Foo())))
+ .andExpect(status().isForbidden());
+ }
+
+ @Test
+ @WithUserDetails("tom")
+ public void givenUserWithWritePermissions_whenCreateNewFoo_thenOkStatusRetrieved() throws Exception {
+ this.mvc.perform(post("/foos").with(csrf())
+ .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
+ .content(asJsonString(new Foo())))
+ .andExpect(status().isCreated());
+ }
+
+ private static String asJsonString(final Object obj) throws Exception {
+ final ObjectMapper mapper = new ObjectMapper();
+ final String jsonContent = mapper.writeValueAsString(obj);
+ return jsonContent;
}
}
diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java
index d6e023cfe8..429d6bac2a 100644
--- a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java
+++ b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java
@@ -9,7 +9,7 @@ class ReplaceUnderscoresGeneratorUnitTest {
class when_doing_something {
@Test
- void then_should_happen_something() {
+ void then_something_should_happen() {
}
@Test
diff --git a/testing-modules/spring-testing/README.md b/testing-modules/spring-testing/README.md
index 12c8edfded..0970eabeff 100644
--- a/testing-modules/spring-testing/README.md
+++ b/testing-modules/spring-testing/README.md
@@ -5,3 +5,4 @@
- [Guide to ReflectionTestUtils for Unit Testing](https://www.baeldung.com/spring-reflection-test-utils)
- [How to Test the @Scheduled Annotation](https://www.baeldung.com/spring-testing-scheduled-annotation)
- [Using SpringJUnit4ClassRunner with Parameterized](https://www.baeldung.com/springjunit4classrunner-parameterized)
+- [Override properties in Spring]()
diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml
index 10d34f169b..0eca9b6a7e 100644
--- a/testing-modules/spring-testing/pom.xml
+++ b/testing-modules/spring-testing/pom.xml
@@ -26,7 +26,6 @@
org.springframework.boot
spring-boot-starter
LATEST
- test
org.springframework.boot
diff --git a/spring-boot-testing/src/main/java/com/baeldung/overrideproperties/Application.java b/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java
similarity index 100%
rename from spring-boot-testing/src/main/java/com/baeldung/overrideproperties/Application.java
rename to testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java
diff --git a/spring-boot-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java b/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java
similarity index 100%
rename from spring-boot-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java
rename to testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java
diff --git a/spring-boot-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
similarity index 100%
rename from spring-boot-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java
diff --git a/spring-boot-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
similarity index 100%
rename from spring-boot-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
diff --git a/spring-boot-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
similarity index 100%
rename from spring-boot-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java
diff --git a/spring-boot-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
similarity index 100%
rename from spring-boot-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
diff --git a/spring-boot-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
similarity index 100%
rename from spring-boot-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
diff --git a/testing-modules/spring-testing/src/test/resources/application-test.properties b/testing-modules/spring-testing/src/test/resources/application-test.properties
new file mode 100644
index 0000000000..54c5bda7e8
--- /dev/null
+++ b/testing-modules/spring-testing/src/test/resources/application-test.properties
@@ -0,0 +1,2 @@
+# override properties
+example.firstProperty=profile
\ No newline at end of file
diff --git a/testing-modules/spring-testing/src/test/resources/application.properties b/testing-modules/spring-testing/src/test/resources/application.properties
new file mode 100644
index 0000000000..6c74aa2995
--- /dev/null
+++ b/testing-modules/spring-testing/src/test/resources/application.properties
@@ -0,0 +1,3 @@
+# override properties
+example.firstProperty=file
+example.secondProperty=file
\ No newline at end of file
diff --git a/spring-boot-testing/src/test/resources/context-override-application.properties b/testing-modules/spring-testing/src/test/resources/context-override-application.properties
similarity index 100%
rename from spring-boot-testing/src/test/resources/context-override-application.properties
rename to testing-modules/spring-testing/src/test/resources/context-override-application.properties