Merge branch 'master' into master
This commit is contained in:
commit
3d5931b0ab
@ -22,6 +22,7 @@
|
|||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<icu.version>64.2</icu.version>
|
<icu.version>64.2</icu.version>
|
||||||
|
<assertj.version>3.12.2</assertj.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -30,6 +31,12 @@
|
|||||||
<artifactId>icu4j</artifactId>
|
<artifactId>icu4j</artifactId>
|
||||||
<version>${icu.version}</version>
|
<version>${icu.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.assertj</groupId>
|
||||||
|
<artifactId>assertj-core</artifactId>
|
||||||
|
<version>${assertj.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -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<String> 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<String> list1 = Arrays.asList("a", "b", "c");
|
||||||
|
List<Integer> list2 = Arrays.asList(1, 2, 3);
|
||||||
|
|
||||||
|
List<String> 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<String> list1 = Arrays.asList("a", "b", "c");
|
||||||
|
List<Integer> list2 = Arrays.asList(1, 2, 3);
|
||||||
|
|
||||||
|
List<String> result = listCombiner(list1, list2, (a, b) -> a + b);
|
||||||
|
|
||||||
|
assertThat(result).containsExactly("a1", "b2", "c3");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T, U, R> List<R> listCombiner(List<T> list1,
|
||||||
|
List<U> list2,
|
||||||
|
BiFunction<T, U, R> combiner) {
|
||||||
|
List<R> 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<Double> list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
|
||||||
|
List<Float> list2 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
|
||||||
|
// algorithm to determine if the value in list1 > value in list 2
|
||||||
|
List<Boolean> result = listCombiner(list1, list2, (a, b) -> a > b);
|
||||||
|
|
||||||
|
assertThat(result).containsExactly(true, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoLists_whenComparedWithCombiningFunctionByMethodReference() {
|
||||||
|
List<Double> list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
|
||||||
|
List<Float> list2 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
|
||||||
|
// algorithm to determine if the value in list1 > value in list 2
|
||||||
|
List<Boolean> 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<Float> list1 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
List<Float> list2 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
|
||||||
|
List<Boolean> result = listCombiner(list1, list2, (a, b) -> a.equals(b));
|
||||||
|
|
||||||
|
assertThat(result).containsExactly(true, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoLists_whenComparedForEqualityByCombiningFunctionWithMethodReference() {
|
||||||
|
List<Float> list1 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
List<Float> list2 = Arrays.asList(0.1f, 0.2f, 4f);
|
||||||
|
|
||||||
|
List<Boolean> result = listCombiner(list1, list2, Float::equals);
|
||||||
|
|
||||||
|
assertThat(result).containsExactly(true, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoLists_whenComparedWithCombiningFunctionWithCompareTo() {
|
||||||
|
List<Double> list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
|
||||||
|
List<Double> list2 = Arrays.asList(0.1d, 0.2d, 4d);
|
||||||
|
|
||||||
|
List<Integer> 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 <T, U, R> BiFunction<T, U, R> asBiFunction(BiFunction<T, U, R> function) {
|
||||||
|
return function;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenTwoLists_whenComparedWithCombiningFunctionWithComposedBiFunction() {
|
||||||
|
List<Double> list1 = Arrays.asList(1.0d, 2.1d, 3.3d);
|
||||||
|
List<Double> list2 = Arrays.asList(0.1d, 0.2d, 4d);
|
||||||
|
|
||||||
|
List<Boolean> result = listCombiner(list1, list2,
|
||||||
|
asBiFunction(Double::compareTo)
|
||||||
|
.andThen(i -> i > 0));
|
||||||
|
|
||||||
|
assertThat(result).containsExactly(true, true, false);
|
||||||
|
}
|
||||||
|
}
|
@ -389,7 +389,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
|
|
||||||
<!-- util -->
|
<!-- util -->
|
||||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
<commons-lang3.version>3.9</commons-lang3.version>
|
||||||
|
|
||||||
<jmh-core.version>1.19</jmh-core.version>
|
<jmh-core.version>1.19</jmh-core.version>
|
||||||
<jmh-generator-annprocess.version>1.19</jmh-generator-annprocess.version>
|
<jmh-generator-annprocess.version>1.19</jmh-generator-annprocess.version>
|
||||||
|
@ -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];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -21,6 +21,13 @@
|
|||||||
<version>${joda-time.version}</version>
|
<version>${joda-time.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-validator</groupId>
|
||||||
|
<artifactId>commons-validator</artifactId>
|
||||||
|
<version>1.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<!-- test scoped -->
|
<!-- test scoped -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.assertj</groupId>
|
<groupId>org.assertj</groupId>
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.baeldung.date.validation;
|
||||||
|
|
||||||
|
public interface DateValidator {
|
||||||
|
boolean isValid(String dateStr);
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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"));
|
||||||
|
}
|
||||||
|
}
|
@ -3,3 +3,4 @@
|
|||||||
- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
|
- [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)
|
- [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)
|
- [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)
|
||||||
|
@ -57,6 +57,26 @@
|
|||||||
<artifactId>commons-text</artifactId>
|
<artifactId>commons-text</artifactId>
|
||||||
<version>${commons-text.version}</version>
|
<version>${commons-text.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.validation</groupId>
|
||||||
|
<artifactId>validation-api</artifactId>
|
||||||
|
<version>2.0.0.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hibernate.validator</groupId>
|
||||||
|
<artifactId>hibernate-validator</artifactId>
|
||||||
|
<version>6.0.2.Final</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.el</groupId>
|
||||||
|
<artifactId>javax.el-api</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish.web</groupId>
|
||||||
|
<artifactId>javax.el</artifactId>
|
||||||
|
<version>2.2.6</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
@ -86,7 +106,7 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<commons-lang3.version>3.8.1</commons-lang3.version>
|
<commons-lang3.version>3.8.1</commons-lang3.version>
|
||||||
<icu4j.version>61.1</icu4j.version>
|
<icu4j.version>61.1</icu4j.version>
|
||||||
<guava.version>27.0.1-jre</guava.version>
|
<guava.version>28.0-jre</guava.version>
|
||||||
<commons-text.version>1.4</commons-text.version>
|
<commons-text.version>1.4</commons-text.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.string.emptystrings;
|
||||||
|
|
||||||
|
class EmptyStringCheck {
|
||||||
|
|
||||||
|
boolean isEmptyString(String string) {
|
||||||
|
return string == null || string.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.string.emptystrings;
|
||||||
|
|
||||||
|
class Java5EmptyStringCheck {
|
||||||
|
|
||||||
|
boolean isEmptyString(String string) {
|
||||||
|
return string == null || string.length() == 0;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.string.emptystrings;
|
||||||
|
|
||||||
|
class PlainJavaBlankStringCheck {
|
||||||
|
|
||||||
|
boolean isBlankString(String string) {
|
||||||
|
return string == null || string.trim().isEmpty();
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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")));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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, ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
java-strings-2/src/main/resources/stephenking.txt
Normal file
4
java-strings-2/src/main/resources/stephenking.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
Get busy living
|
||||||
|
or
|
||||||
|
get busy dying.
|
||||||
|
--Stephen King
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<ConstraintViolation<SomeClassWithValidations>> violations = validator.validate(someClassWithValidations);
|
||||||
|
assertThat(violations, iterableWithSize(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSomeNonEmptyString_thenBeanValidationValidatesWithoutViolations() {
|
||||||
|
SomeClassWithValidations someClassWithValidations = new SomeClassWithValidations().setSomeString(nonEmptyString);
|
||||||
|
Set<ConstraintViolation<SomeClassWithValidations>> violations = validator.validate(someClassWithValidations);
|
||||||
|
assertThat(violations, iterableWithSize(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSomeBlankString_thenBeanValidationReturnsViolations() {
|
||||||
|
SomeClassWithValidations someClassWithValidations = new SomeClassWithValidations().setSomeString(blankString);
|
||||||
|
Set<ConstraintViolation<SomeClassWithValidations>> violations = validator.validate(someClassWithValidations);
|
||||||
|
assertThat(violations, iterableWithSize(1));
|
||||||
|
}
|
||||||
|
}
|
@ -9,11 +9,11 @@ public class SubstringRepetitionUnitTest {
|
|||||||
|
|
||||||
private String validString = "aa";
|
private String validString = "aa";
|
||||||
private String validStringTwo = "ababab";
|
private String validStringTwo = "ababab";
|
||||||
private String validStringThree = "aabcaabcaabcaabc";
|
private String validStringThree = "baeldungbaeldung";
|
||||||
|
|
||||||
private String invalidString = "aca";
|
private String invalidString = "aca";
|
||||||
private String invalidStringTwo = "ababa";
|
private String invalidStringTwo = "ababa";
|
||||||
private String invalidStringThree = "abcdab";
|
private String invalidStringThree = "baeldungnonrepeatedbaeldung";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenValidStrings_whenCheckIfContainsOnlySubstrings_thenReturnsTrue() {
|
public void givenValidStrings_whenCheckIfContainsOnlySubstrings_thenReturnsTrue() {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -2,17 +2,14 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
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">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>libraries2</artifactId>
|
<artifactId>libraries2</artifactId>
|
||||||
<name>libraries2</name>
|
<name>libraries2</name>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
<artifactId>parent-modules</artifactId>
|
<artifactId>parent-modules</artifactId>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>jboss-public-repository-group</id>
|
<id>jboss-public-repository-group</id>
|
||||||
@ -28,8 +25,12 @@
|
|||||||
</snapshots>
|
</snapshots>
|
||||||
</repository>
|
</repository>
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mapdb</groupId>
|
||||||
|
<artifactId>mapdb</artifactId>
|
||||||
|
<version>${mapdb.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.pivovarit</groupId>
|
<groupId>com.pivovarit</groupId>
|
||||||
<artifactId>parallel-collectors</artifactId>
|
<artifactId>parallel-collectors</artifactId>
|
||||||
@ -91,45 +92,38 @@
|
|||||||
</exclusion>
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Dependencies for response decoder with okhttp -->
|
<!-- Dependencies for response decoder with okhttp -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
<artifactId>okhttp</artifactId>
|
<artifactId>okhttp</artifactId>
|
||||||
<version>3.14.2</version>
|
<version>3.14.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
<version>2.9.9</version>
|
<version>2.9.9</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.code.gson</groupId>
|
<groupId>com.google.code.gson</groupId>
|
||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>2.8.5</version>
|
<version>2.8.5</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
<artifactId>mockwebserver</artifactId>
|
<artifactId>mockwebserver</artifactId>
|
||||||
<version>3.14.2</version>
|
<version>3.14.2</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>edu.uci.ics</groupId>
|
<groupId>edu.uci.ics</groupId>
|
||||||
<artifactId>crawler4j</artifactId>
|
<artifactId>crawler4j</artifactId>
|
||||||
<version>${crawler4j.version}</version>
|
<version>${crawler4j.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.jknack</groupId>
|
<groupId>com.github.jknack</groupId>
|
||||||
<artifactId>handlebars</artifactId>
|
<artifactId>handlebars</artifactId>
|
||||||
<version>4.1.2</version>
|
<version>4.1.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Benchmarking -->
|
<!-- Benchmarking -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.openjdk.jmh</groupId>
|
<groupId>org.openjdk.jmh</groupId>
|
||||||
@ -141,10 +135,14 @@
|
|||||||
<artifactId>jmh-generator-annprocess</artifactId>
|
<artifactId>jmh-generator-annprocess</artifactId>
|
||||||
<version>${jmh.version}</version>
|
<version>${jmh.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.mesos</groupId>
|
||||||
|
<artifactId>mesos</artifactId>
|
||||||
|
<version>${mesos.library.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
<mapdb.version>3.0.7</mapdb.version>
|
||||||
<assertj.version>3.6.2</assertj.version>
|
<assertj.version>3.6.2</assertj.version>
|
||||||
<classgraph.version>4.8.28</classgraph.version>
|
<classgraph.version>4.8.28</classgraph.version>
|
||||||
<jbpm.version>6.0.0.Final</jbpm.version>
|
<jbpm.version>6.0.0.Final</jbpm.version>
|
||||||
@ -157,5 +155,6 @@
|
|||||||
<colt.version>1.2.0</colt.version>
|
<colt.version>1.2.0</colt.version>
|
||||||
<la4j.version>0.6.0</la4j.version>
|
<la4j.version>0.6.0</la4j.version>
|
||||||
<jmh.version>1.19</jmh.version>
|
<jmh.version>1.19</jmh.version>
|
||||||
|
<mesos.library.version>0.28.3</mesos.library.version>
|
||||||
</properties>
|
</properties>
|
||||||
</project>
|
</project>
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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<Offer> list) {
|
||||||
|
|
||||||
|
for (Offer offer : list) {
|
||||||
|
List<TaskInfo> tasks = new ArrayList<TaskInfo>();
|
||||||
|
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<OfferID> 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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -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<String> set = db.
|
||||||
|
treeSet("mySet")
|
||||||
|
.serializer(Serializer.STRING)
|
||||||
|
.createOrOpen();
|
||||||
|
|
||||||
|
String myString = "Baeldung!";
|
||||||
|
|
||||||
|
set.add(myString);
|
||||||
|
set.add(myString);
|
||||||
|
|
||||||
|
assertEquals(1, set.size());
|
||||||
|
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
}
|
@ -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<String, String> 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"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -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<Integer, String> 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<Integer, String> 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<Integer, String> map = heapDB
|
||||||
|
.hashMap("myMap")
|
||||||
|
.keySerializer(Serializer.INTEGER)
|
||||||
|
.valueSerializer(Serializer.STRING)
|
||||||
|
.createOrOpen();
|
||||||
|
|
||||||
|
map.put(1, "ONE");
|
||||||
|
|
||||||
|
assertEquals("ONE", map.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<Integer, String> 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<Integer, String> sortedTableMap = SortedTableMap.open(
|
||||||
|
openVol,
|
||||||
|
Serializer.INTEGER,
|
||||||
|
Serializer.STRING
|
||||||
|
);
|
||||||
|
|
||||||
|
assertEquals(100, sortedTableMap.size());
|
||||||
|
}
|
||||||
|
}
|
@ -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<String> 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();
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,9 @@
|
|||||||
<version>${typesafe-akka.version}</version>
|
<version>${typesafe-akka.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.typesafe.akka</groupId>
|
<groupId>com.typesafe.akka</groupId>
|
||||||
<artifactId>akka-testkit_2.12</artifactId>
|
<artifactId>akka-testkit_2.12</artifactId>
|
||||||
@ -837,6 +840,7 @@
|
|||||||
<h2.version>1.4.196</h2.version>
|
<h2.version>1.4.196</h2.version>
|
||||||
<jnats.version>1.0</jnats.version>
|
<jnats.version>1.0</jnats.version>
|
||||||
|
|
||||||
|
|
||||||
<httpclient.version>4.5.3</httpclient.version>
|
<httpclient.version>4.5.3</httpclient.version>
|
||||||
<jackson.version>2.9.7</jackson.version>
|
<jackson.version>2.9.7</jackson.version>
|
||||||
<neuroph.version>2.92</neuroph.version>
|
<neuroph.version>2.92</neuroph.version>
|
||||||
|
2
pom.xml
2
pom.xml
@ -1147,7 +1147,7 @@
|
|||||||
<module>java-rmi</module>
|
<module>java-rmi</module>
|
||||||
<module>java-spi</module>
|
<module>java-spi</module>
|
||||||
<module>java-streams</module>
|
<module>java-streams</module>
|
||||||
<module>java-streams-2</module>
|
<!-- <module>java-streams-2</module> --> <!-- We haven't upgraded to java 9. Fixing in BAEL-10841 -->
|
||||||
<module>java-strings</module>
|
<module>java-strings</module>
|
||||||
<module>java-strings-2</module>
|
<module>java-strings-2</module>
|
||||||
<module>java-vavr-stream</module>
|
<module>java-vavr-stream</module>
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.components;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class AccountService {
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
spring-5/src/main/resources/beans.xml
Normal file
15
spring-5/src/main/resources/beans.xml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
|
||||||
|
|
||||||
|
<context:annotation-config />
|
||||||
|
|
||||||
|
<context:component-scan base-package="com.baeldung.components" />
|
||||||
|
|
||||||
|
<bean id="accountService" class="com.baeldung.components.AccountService"></bean>
|
||||||
|
|
||||||
|
<bean id="userService" class="com.baeldung.components.UserService">
|
||||||
|
<!-- If we have <context:annotation-config/> on top, then we don't need to set the properties(dependencies) in XML. -->
|
||||||
|
<!-- <property name="accountService" ref="accountService"></property> -->
|
||||||
|
</bean>
|
||||||
|
</beans>
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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)
|
- [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)
|
- [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)
|
- [Setting the Log Level in Spring Boot when Testing](https://www.baeldung.com/spring-boot-testing-log-level)
|
||||||
- [Override properties in Spring]
|
|
||||||
|
@ -1,5 +1,2 @@
|
|||||||
# test properties
|
# test properties
|
||||||
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
|
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
|
||||||
|
|
||||||
# override properties
|
|
||||||
example.firstProperty=profile
|
|
@ -1,7 +1,3 @@
|
|||||||
# security
|
# security
|
||||||
spring.security.user.name=john
|
spring.security.user.name=john
|
||||||
spring.security.user.password=123
|
spring.security.user.password=123
|
||||||
|
|
||||||
# override properties
|
|
||||||
example.firstProperty=file
|
|
||||||
example.secondProperty=file
|
|
@ -1,57 +1,12 @@
|
|||||||
package org.baeldung.custom.config;
|
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.Bean;
|
||||||
import org.springframework.context.annotation.ComponentScan;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
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.bcrypt.BCryptPasswordEncoder;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableWebSecurity
|
public class SecurityConfig {
|
||||||
@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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public PasswordEncoder encoder() {
|
public PasswordEncoder encoder() {
|
||||||
|
@ -3,14 +3,16 @@ package org.baeldung.custom.web;
|
|||||||
import org.baeldung.custom.persistence.dao.OrganizationRepository;
|
import org.baeldung.custom.persistence.dao.OrganizationRepository;
|
||||||
import org.baeldung.custom.persistence.model.Foo;
|
import org.baeldung.custom.persistence.model.Foo;
|
||||||
import org.baeldung.custom.persistence.model.Organization;
|
import org.baeldung.custom.persistence.model.Organization;
|
||||||
|
import org.baeldung.custom.security.MyUserPrincipal;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
import org.springframework.stereotype.Controller;
|
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.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
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.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
@ -23,14 +25,14 @@ public class MainController {
|
|||||||
|
|
||||||
// @PostAuthorize("hasPermission(returnObject, 'read')")
|
// @PostAuthorize("hasPermission(returnObject, 'read')")
|
||||||
@PreAuthorize("hasPermission(#id, 'Foo', 'read')")
|
@PreAuthorize("hasPermission(#id, 'Foo', 'read')")
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")
|
@GetMapping("/foos/{id}")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Foo findById(@PathVariable final long id) {
|
public Foo findById(@PathVariable final long id) {
|
||||||
return new Foo("Sample");
|
return new Foo("Sample");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PreAuthorize("hasPermission(#foo, 'write')")
|
@PreAuthorize("hasPermission(#foo, 'write')")
|
||||||
@RequestMapping(method = RequestMethod.POST, value = "/foos")
|
@PostMapping("/foos")
|
||||||
@ResponseStatus(HttpStatus.CREATED)
|
@ResponseStatus(HttpStatus.CREATED)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Foo create(@RequestBody final Foo foo) {
|
public Foo create(@RequestBody final Foo foo) {
|
||||||
@ -40,7 +42,7 @@ public class MainController {
|
|||||||
//
|
//
|
||||||
|
|
||||||
@PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')")
|
@PreAuthorize("hasAuthority('FOO_READ_PRIVILEGE')")
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/foos")
|
@GetMapping("/foos")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Foo findFooByName(@RequestParam final String name) {
|
public Foo findFooByName(@RequestParam final String name) {
|
||||||
return new Foo(name);
|
return new Foo(name);
|
||||||
@ -49,10 +51,18 @@ public class MainController {
|
|||||||
//
|
//
|
||||||
|
|
||||||
@PreAuthorize("isMember(#id)")
|
@PreAuthorize("isMember(#id)")
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/organizations/{id}")
|
@GetMapping("/organizations/{id}")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Organization findOrgById(@PathVariable final long id) {
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,76 +1,89 @@
|
|||||||
package org.baeldung.web;
|
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.Application;
|
||||||
import org.baeldung.custom.config.MvcConfig;
|
import org.baeldung.custom.persistence.model.Foo;
|
||||||
import org.baeldung.custom.config.SecurityConfig;
|
import org.junit.jupiter.api.Test;
|
||||||
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.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.authentication.AuthenticationProvider;
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
||||||
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.context.SpringBootTest;
|
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)
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
@SpringBootTest(classes = {Application.class})
|
|
||||||
@WebAppConfiguration
|
@SpringBootTest(classes = { Application.class })
|
||||||
|
@AutoConfigureMockMvc
|
||||||
public class CustomUserDetailsServiceIntegrationTest {
|
public class CustomUserDetailsServiceIntegrationTest {
|
||||||
|
|
||||||
private static final String USERNAME = "user";
|
|
||||||
private static final String PASSWORD = "pass";
|
|
||||||
private static final String USERNAME2 = "user2";
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserRepository myUserRepository;
|
private MockMvc mvc;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthenticationProvider authenticationProvider;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private PasswordEncoder passwordEncoder;
|
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void givenExistingUser_whenAuthenticate_thenRetrieveFromDb() {
|
@WithUserDetails("john")
|
||||||
User user = new User();
|
public void givenUserWithReadPermissions_whenRequestUserInfo_thenRetrieveUserData() throws Exception {
|
||||||
user.setUsername(USERNAME);
|
this.mvc.perform(get("/user").with(csrf()))
|
||||||
user.setPassword(passwordEncoder.encode(PASSWORD));
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$.user.privileges[0].name").value("FOO_READ_PRIVILEGE"))
|
||||||
myUserRepository.save(user);
|
.andExpect(jsonPath("$.user.organization.name").value("FirstOrg"))
|
||||||
|
.andExpect(jsonPath("$.user.username").value("john"));
|
||||||
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME, PASSWORD);
|
|
||||||
Authentication authentication = authenticationProvider.authenticate(auth);
|
|
||||||
|
|
||||||
assertEquals(authentication.getName(), USERNAME);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = BadCredentialsException.class)
|
@Test
|
||||||
public void givenIncorrectUser_whenAuthenticate_thenBadCredentialsException() {
|
@WithUserDetails("tom")
|
||||||
User user = new User();
|
public void givenUserWithWritePermissions_whenRequestUserInfo_thenRetrieveUserData() throws Exception {
|
||||||
user.setUsername(USERNAME);
|
this.mvc.perform(get("/user").with(csrf()))
|
||||||
user.setPassword(passwordEncoder.encode(PASSWORD));
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$.user.privileges").isArray())
|
||||||
myUserRepository.save(user);
|
.andExpect(jsonPath("$.user.organization.name").value("SecondOrg"))
|
||||||
|
.andExpect(jsonPath("$.user.username").value("tom"));
|
||||||
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(USERNAME2, PASSWORD);
|
|
||||||
authenticationProvider.authenticate(auth);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
@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
|
@Test
|
||||||
public void tearDown() {
|
@WithAnonymousUser
|
||||||
myUserRepository.removeUserByUsername(USERNAME);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ class ReplaceUnderscoresGeneratorUnitTest {
|
|||||||
class when_doing_something {
|
class when_doing_something {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void then_should_happen_something() {
|
void then_something_should_happen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -5,3 +5,4 @@
|
|||||||
- [Guide to ReflectionTestUtils for Unit Testing](https://www.baeldung.com/spring-reflection-test-utils)
|
- [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)
|
- [How to Test the @Scheduled Annotation](https://www.baeldung.com/spring-testing-scheduled-annotation)
|
||||||
- [Using SpringJUnit4ClassRunner with Parameterized](https://www.baeldung.com/springjunit4classrunner-parameterized)
|
- [Using SpringJUnit4ClassRunner with Parameterized](https://www.baeldung.com/springjunit4classrunner-parameterized)
|
||||||
|
- [Override properties in Spring]()
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
<artifactId>spring-boot-starter</artifactId>
|
||||||
<version>LATEST</version>
|
<version>LATEST</version>
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
# override properties
|
||||||
|
example.firstProperty=profile
|
@ -0,0 +1,3 @@
|
|||||||
|
# override properties
|
||||||
|
example.firstProperty=file
|
||||||
|
example.secondProperty=file
|
Loading…
x
Reference in New Issue
Block a user