diff --git a/akka-http/README.md b/akka-http/README.md
index 3831b5079f..ebe6581ff6 100644
--- a/akka-http/README.md
+++ b/akka-http/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Akka HTTP
+
+This module contains articles about Akka HTTP.
+
+### Relevant articles:
- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http)
diff --git a/akka-streams/README.md b/akka-streams/README.md
index 5f71991def..a59b7fde5c 100644
--- a/akka-streams/README.md
+++ b/akka-streams/README.md
@@ -1,3 +1,7 @@
+## Akka Streams
+
+This module contains articles about Akka Streams.
+
### Relevant articles
- [Guide to Akka Streams](https://www.baeldung.com/akka-streams)
diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md
index 124e9c09e5..1c9e831ac2 100644
--- a/algorithms-genetic/README.md
+++ b/algorithms-genetic/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Genetic Algorithms
+
+This module contains articles about genetic algorithms.
+
+### Relevant articles:
- [Introduction to Jenetics Library](https://www.baeldung.com/jenetics)
- [Ant Colony Optimization](https://www.baeldung.com/java-ant-colony-optimization)
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index 57f5a5d478..6a25f8cac8 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
@@ -6,4 +11,5 @@
- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
-- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
\ No newline at end of file
+- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
+- More articles: [[next -->]](/../algorithms-miscellaneous-2)
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 76727a1d4f..7560fc4fe7 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Dijkstra Shortest Path Algorithm in Java](https://www.baeldung.com/java-dijkstra)
- [Introduction to Cobertura](https://www.baeldung.com/cobertura)
@@ -8,3 +13,4 @@
- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-miscellaneous-4/README.md
index fabb4d29b8..6aad9a43e4 100644
--- a/algorithms-miscellaneous-4/README.md
+++ b/algorithms-miscellaneous-4/README.md
@@ -1,4 +1,9 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
@@ -6,4 +11,5 @@
- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
-- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
\ No newline at end of file
+- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-3) [[next -->]](/../algorithms-miscellaneous-5)
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
index 7ed71e61cc..7a8f2e0a36 100644
--- a/algorithms-miscellaneous-5/README.md
+++ b/algorithms-miscellaneous-5/README.md
@@ -1,5 +1,11 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
-- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
\ No newline at end of file
+- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
new file mode 100644
index 0000000000..61c3f05a95
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
@@ -0,0 +1,36 @@
+package com.baeldung.algorithms.knapsack;
+
+public class Knapsack {
+
+ public int knapsackRec(int[] w, int[] v, int n, int W) {
+ if (n <= 0) {
+ return 0;
+ } else if (w[n - 1] > W) {
+ return knapsackRec(w, v, n - 1, W);
+ } else {
+ return Math.max(knapsackRec(w, v, n - 1, W), v[n - 1] + knapsackRec(w, v, n - 1, W - w[n - 1]));
+ }
+ }
+
+ public int knapsackDP(int[] w, int[] v, int n, int W) {
+ if (n <= 0 || W <= 0) {
+ return 0;
+ }
+
+ int[][] m = new int[n + 1][W + 1];
+ for (int j = 0; j <= W; j++) {
+ m[0][j] = 0;
+ }
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= W; j++) {
+ if (w[i - 1] > j) {
+ m[i][j] = m[i - 1][j];
+ } else {
+ m[i][j] = Math.max(m[i - 1][j], m[i - 1][j - w[i - 1]] + v[i - 1]);
+ }
+ }
+ }
+ return m[n][W];
+ }
+}
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
new file mode 100644
index 0000000000..b168e6b1eb
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.algorithms.knapsack;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class KnapsackUnitTest {
+
+ @Test
+ public void givenWeightsandValues_whenCalculateMax_thenOutputCorrectResult() {
+ final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 };
+ final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 };
+ final int n = 10;
+ final int W = 67;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(1270, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(1270, knapsack.knapsackDP(w, v, n, W));
+ }
+
+ @Test
+ public void givenZeroItems_whenCalculateMax_thenOutputZero() {
+ final int[] w = new int[] {};
+ final int[] v = new int[] {};
+ final int n = 0;
+ final int W = 67;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(0, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(0, knapsack.knapsackDP(w, v, n, W));
+ }
+
+ @Test
+ public void givenZeroWeightLimit_whenCalculateMax_thenOutputZero() {
+ final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 };
+ final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 };
+ final int n = 10;
+ final int W = 0;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(0, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(0, knapsack.knapsackDP(w, v, n, W));
+ }
+}
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index 4fd9d5e0c6..3f27cfea49 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -16,3 +16,4 @@ This module contains articles about sorting algorithms.
- [Selection Sort in Java](https://www.baeldung.com/java-selection-sort)
- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
- [Radix Sort in Java](https://www.baeldung.com/java-radix-sort)
+- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index b25adf05a8..5bb19a8069 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -28,6 +28,12 @@
${lombok.version}
provided
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter-api.version}
+ test
+
org.assertj
assertj-core
@@ -52,6 +58,7 @@
3.6.1
3.9.0
1.11
+ 5.3.1
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
similarity index 93%
rename from java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
rename to algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
index c4f684383d..67b5e5facc 100644
--- a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
import java.util.Arrays;
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
similarity index 86%
rename from java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
index 07d31c7187..25fc274dd8 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
@@ -1,12 +1,10 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
import org.junit.jupiter.api.Test;
-import com.baeldung.string.sorting.AnagramValidator;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class AnagramValidatorUnitTest {
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
similarity index 94%
rename from java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
index 90d1dad554..226de64f07 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.sorting;
-
-import java.util.Arrays;
+package com.baeldung.algorithms.stringsort;
import org.junit.jupiter.api.Test;
+import java.util.Arrays;
+
import static org.assertj.core.api.Assertions.assertThat;
class SortStringUnitTest {
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
index 7a9f62341e..82a84bb2d6 100644
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
+++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
@@ -1,12 +1,12 @@
package com.baeldung.java_8_features.groupingby;
-public class Tuple {
+import java.util.Objects;
+
+public class Tuple {
+ private final BlogPostType type;
+ private final String author;
- private BlogPostType type;
- private String author;
-
public Tuple(BlogPostType type, String author) {
- super();
this.type = type;
this.author = author;
}
@@ -15,20 +15,27 @@ public class Tuple {
return type;
}
- public void setType(BlogPostType type) {
- this.type = type;
- }
-
public String getAuthor() {
return author;
}
- public void setAuthor(String author) {
- this.author = author;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Tuple tuple = (Tuple) o;
+ return type == tuple.type && author.equals(tuple.author);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, author);
}
@Override
public String toString() {
- return "Tuple [type=" + type + ", author=" + author + ", getType()=" + getType() + ", getAuthor()=" + getAuthor() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
+ return "Tuple{" + "type=" + type + ", author='" + author + '\'' + '}';
}
}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
index 323586b85f..1da705294e 100644
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
+++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
@@ -1,15 +1,32 @@
package com.baeldung.java_8_features.groupingby;
-import com.baeldung.java_8_features.groupingby.BlogPost;
-import com.baeldung.java_8_features.groupingby.BlogPostType;
-import org.junit.Test;
+import static java.util.Comparator.comparingInt;
+import static java.util.stream.Collectors.averagingInt;
+import static java.util.stream.Collectors.counting;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.groupingByConcurrent;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.maxBy;
+import static java.util.stream.Collectors.summarizingInt;
+import static java.util.stream.Collectors.summingInt;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
-import java.util.*;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.IntSummaryStatistics;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.ConcurrentMap;
-import static java.util.Comparator.comparingInt;
-import static java.util.stream.Collectors.*;
-import static org.junit.Assert.*;
+import org.junit.Test;
public class Java8GroupingByCollectorUnitTest {
@@ -180,4 +197,19 @@ public class Java8GroupingByCollectorUnitTest {
assertEquals(15, newsLikeStatistics.getMin());
}
+ @Test
+ public void givenAListOfPosts_whenGroupedByComplexMapKeyType_thenGetAMapBetweenTupleAndList() {
+ Map> postsPerTypeAndAuthor = posts.stream()
+ .collect(groupingBy(post -> new Tuple(post.getType(), post.getAuthor())));
+
+ List result = postsPerTypeAndAuthor.get(new Tuple(BlogPostType.GUIDE, "Author 1"));
+
+ assertThat(result.size()).isEqualTo(1);
+
+ BlogPost blogPost = result.get(0);
+
+ assertThat(blogPost.getTitle()).isEqualTo("Programming guide");
+ assertThat(blogPost.getType()).isEqualTo(BlogPostType.GUIDE);
+ assertThat(blogPost.getAuthor()).isEqualTo("Author 1");
+ }
}
diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
index 94a00f7aba..4513dbf899 100644
--- a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
@@ -192,15 +192,48 @@ public class ArrayOperations {
return array[new Random().nextInt(array.length)];
}
- public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(Arrays.asList(b)::contains).toArray(Integer[]::new);
+ public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(Arrays.asList(b)::contains)
+ .toArray(Integer[]::new);
}
- public static Integer[] intersectionSet(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(Arrays.asList(b)::contains).distinct().toArray(Integer[]::new);
+ public static Integer[] intersectionSet(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(Arrays.asList(b)::contains)
+ .distinct()
+ .toArray(Integer[]::new);
}
- public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(new LinkedList<>(Arrays.asList(b))::remove).toArray(Integer[]::new);
+ public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(new LinkedList<>(Arrays.asList(b))::remove)
+ .toArray(Integer[]::new);
+ }
+
+ public static Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) {
+ Integer[] destArray = new Integer[srcArray.length + 1];
+
+ for (int i = 0; i < srcArray.length; i++) {
+ destArray[i] = srcArray[i];
+ }
+
+ destArray[destArray.length - 1] = elementToAdd;
+ return destArray;
+ }
+
+ public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) {
+ int[] destArray = new int[srcArray.length + 1];
+ int j = 0;
+ for (int i = 0; i < destArray.length - 1; i++) {
+
+ if (i == index) {
+ destArray[i] = newElement;
+ } else {
+ destArray[i] = srcArray[j];
+ j++;
+ }
+ }
+ return destArray;
}
}
diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java
new file mode 100644
index 0000000000..b2aed553da
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java
@@ -0,0 +1,23 @@
+package com.baeldung.arraylist.operations;
+
+import java.util.ArrayList;
+
+public class ArrayListOperations {
+
+ public static Integer getAnIntegerElement(ArrayList anArrayList, int index) {
+ return anArrayList.get(index);
+ }
+
+ public static void modifyAnIntegerElement(ArrayList anArrayList, int index, Integer newElement) {
+ anArrayList.set(index, newElement);
+ }
+
+ public static void appendAnIntegerElement(ArrayList anArrayList, Integer newElement) {
+ anArrayList.add(newElement);
+ }
+
+ public static void insertAnIntegerElementAtIndex(ArrayList anArrayList, int index, Integer newElement) {
+ anArrayList.add(index, newElement);
+ }
+
+}
diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
index d72681ca05..ea9bf2c5a9 100644
--- a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
@@ -1,12 +1,11 @@
package com.baeldung.array.operations;
+import java.util.Arrays;
import org.assertj.core.api.Condition;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-
import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertArrayEquals;
public class ArrayOperationsUnitTest {
@@ -262,8 +261,7 @@ public class ArrayOperationsUnitTest {
@Test
public void whenMapIntArrayToString_thenReturnArray() {
- String[] expectedArray = new String[] { "Value: 3", "Value: 5", "Value: 2", "Value: 5", "Value: 14",
- "Value: 4" };
+ String[] expectedArray = new String[] { "Value: 3", "Value: 5", "Value: 2", "Value: 5", "Value: 14", "Value: 4" };
String[] output = ArrayOperations.mapIntArrayToString(defaultIntArray);
assertThat(output).containsExactly(expectedArray);
@@ -313,13 +311,10 @@ public class ArrayOperationsUnitTest {
int[] output5 = ArrayOperations.shuffleIntArray(defaultIntArray);
int[] output6 = ArrayOperations.shuffleIntArray(defaultIntArray);
- Condition atLeastOneArraysIsNotEqual = new Condition(
- "at least one output should be different (order-wise)") {
+ Condition atLeastOneArraysIsNotEqual = new Condition("at least one output should be different (order-wise)") {
@Override
public boolean matches(int[] value) {
- return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
- || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
- || !Arrays.equals(value, output6);
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3) || !Arrays.equals(value, output4) || !Arrays.equals(value, output5) || !Arrays.equals(value, output6);
}
};
@@ -335,13 +330,10 @@ public class ArrayOperationsUnitTest {
Integer[] output5 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
Integer[] output6 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
- Condition atLeastOneArraysIsNotEqual = new Condition(
- "at least one output should be different (order-wise)") {
+ Condition atLeastOneArraysIsNotEqual = new Condition("at least one output should be different (order-wise)") {
@Override
public boolean matches(Integer[] value) {
- return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
- || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
- || !Arrays.equals(value, output6);
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3) || !Arrays.equals(value, output4) || !Arrays.equals(value, output5) || !Arrays.equals(value, output6);
}
};
@@ -362,4 +354,27 @@ public class ArrayOperationsUnitTest {
assertThat(defaultObjectArray).contains(output);
}
+
+ @Test
+ public void givenSourceArrayAndElement_whenAddElementUsingPureJavaIsInvoked_thenNewElementMustBeAdded() {
+ Integer[] sourceArray = { 1, 2, 3, 4 };
+ int elementToAdd = 5;
+
+ Integer[] destArray = ArrayOperations.addElementUsingPureJava(sourceArray, elementToAdd);
+
+ Integer[] expectedArray = { 1, 2, 3, 4, 5 };
+ assertArrayEquals(expectedArray, destArray);
+ }
+
+ @Test
+ public void whenInsertAnElementAtAGivenIndexCalled_thenShiftTheFollowingElementsAndInsertTheElementInArray() {
+ int[] expectedArray = { 1, 4, 2, 3, 0 };
+ int[] anArray = new int[4];
+ anArray[0] = 1;
+ anArray[1] = 2;
+ anArray[2] = 3;
+ int[] outputArray = ArrayOperations.insertAnElementAtAGivenIndex(anArray, 1, 4);
+
+ assertThat(outputArray).containsExactly(expectedArray);
+ }
}
diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java
new file mode 100644
index 0000000000..1ec7645d8f
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.arraylist.operations;
+
+import java.util.ArrayList;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ArrayListOperationsUnitTest {
+
+ private ArrayList anArrayList;
+
+ @BeforeEach
+ public void setupDefaults() {
+ anArrayList = new ArrayList<>();
+ anArrayList.add(2);
+ anArrayList.add(3);
+ anArrayList.add(4);
+ }
+
+ @Test
+ public void whenGetAnIntegerElementCalled_thenReturnTheIntegerElement() {
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 1);
+
+ assertThat(output).isEqualTo(3);
+ }
+
+ @Test
+ public void whenModifyAnIntegerElementCalled_thenModifyTheIntegerElement() {
+ ArrayListOperations.modifyAnIntegerElement(anArrayList, 2, 5);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 2);
+
+ assertThat(output).isEqualTo(5);
+ }
+
+ @Test
+ public void whenAppendAnIntegerElementCalled_thenTheIntegerElementIsAppendedToArrayList() {
+ ArrayListOperations.appendAnIntegerElement(anArrayList, 6);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, anArrayList.size() - 1);
+
+ assertThat(output).isEqualTo(6);
+ }
+
+ @Test
+ public void whenInsertAnIntegerAtIndexCalled_thenTheIntegerElementIsInseredToArrayList() {
+ ArrayListOperations.insertAnIntegerElementAtIndex(anArrayList, 1, 10);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 1);
+
+ assertThat(output).isEqualTo(10);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java
new file mode 100644
index 0000000000..04e24e5fa1
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java
@@ -0,0 +1,42 @@
+package com.baeldung.list;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Demo different approaches to get count of duplicated elements in an
+ * arrayList
+ */
+public class DuplicatesCounter {
+
+ public static Map countByClassicalLoop(List inputList) {
+ Map resultMap = new HashMap<>();
+ for (T element : inputList) {
+ if (resultMap.containsKey(element)) {
+ resultMap.put(element, resultMap.get(element) + 1L);
+ } else {
+ resultMap.put(element, 1L);
+ }
+ }
+ return resultMap;
+ }
+
+ public static Map countByClassicalLoopWithMapCompute(List inputList) {
+ Map resultMap = new HashMap<>();
+ for (T element : inputList) {
+ resultMap.compute(element, (k, v) -> v == null ? 1 : v + 1);
+ }
+ return resultMap;
+ }
+
+ public static Map countByStreamToMap(List inputList) {
+ return inputList.stream().collect(Collectors.toMap(Function.identity(), v -> 1L, Long::sum));
+ }
+
+ public static Map countByStreamGroupBy(List inputList) {
+ return inputList.stream().collect(Collectors.groupingBy(k -> k, Collectors.counting()));
+ }
+}
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java
new file mode 100644
index 0000000000..4b6a03aaef
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.list;
+
+import org.assertj.core.util.Lists;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.data.MapEntry.entry;
+
+class DuplicatesCounterUnitTest {
+
+
+ private static List INPUT_LIST = Lists.list(
+ "expect1",
+ "expect2", "expect2",
+ "expect3", "expect3", "expect3",
+ "expect4", "expect4", "expect4", "expect4");
+
+ @Test
+ void givenInput_whenCountByClassicalLoop_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByClassicalLoop(INPUT_LIST);
+ verifyResult(result);
+ }
+
+
+ @Test
+ void givenInput_whenCountByClassicalLoopWithMapCompute_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByClassicalLoopWithMapCompute(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ @Test
+ void givenInput_whenCountByStreamToMap_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByStreamToMap(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ @Test
+ void givenInput_whenCountByStreamGroupBy_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByStreamGroupBy(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ private void verifyResult(Map resultMap) {
+ assertThat(resultMap)
+ .isNotEmpty().hasSize(4)
+ .containsExactly(
+ entry("expect1", 1L),
+ entry("expect2", 2L),
+ entry("expect3", 3L),
+ entry("expect4", 4L));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md
new file mode 100644
index 0000000000..2503459f50
--- /dev/null
+++ b/core-java-modules/core-java-datetime-conversion/README.md
@@ -0,0 +1,9 @@
+## Java Date/time conversion Cookbooks and Examples
+
+This module contains articles about converting between Java date and time objects.
+
+### Relevant Articles:
+- [Converting Between LocalDate and XMLGregorianCalendar](https://www.baeldung.com/java-localdate-to-xmlgregoriancalendar)
+- [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds)
+- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime)
+- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml
new file mode 100644
index 0000000000..a93eca00af
--- /dev/null
+++ b/core-java-modules/core-java-datetime-conversion/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+ core-java-datetime-conversion
+ ${project.parent.version}
+ core-java-datetime-conversion
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-datetime-conversion
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 2.10
+
+ 3.6.1
+ 1.9
+ 1.9
+
+
diff --git a/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
diff --git a/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
diff --git a/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
diff --git a/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
diff --git a/java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
index 3ba01a591a..e5fd80285c 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
@@ -1,15 +1,14 @@
package com.baeldung.datetime;
-import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Instant;
-import java.time.ZoneId;
import java.util.TimeZone;
-import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
public class ConvertInstantToTimestampUnitTest {
diff --git a/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
diff --git a/core-java-modules/core-java-datetime-string/README.md b/core-java-modules/core-java-datetime-string/README.md
new file mode 100644
index 0000000000..cf00bdeb1f
--- /dev/null
+++ b/core-java-modules/core-java-datetime-string/README.md
@@ -0,0 +1,13 @@
+## Java Dates Parsing and Formatting Cookbooks and Examples
+
+This module contains articles about parsing and formatting Java date and time objects.
+
+### Relevant Articles:
+- [Check If a String Is a Valid Date in Java](https://www.baeldung.com/java-string-valid-date)
+- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions)
+- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
+- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
+- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
+- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
+- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp)
+- [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date)
diff --git a/java-dates-2/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml
similarity index 77%
rename from java-dates-2/pom.xml
rename to core-java-modules/core-java-datetime-string/pom.xml
index 08b2076d03..b4e7aff524 100644
--- a/java-dates-2/pom.xml
+++ b/core-java-modules/core-java-datetime-string/pom.xml
@@ -1,39 +1,35 @@
4.0.0
- com.baeldung
- java-dates-2
- 0.1.0-SNAPSHOT
+ core-java-datetime-string
+ ${project.parent.version}
+ core-java-datetime-string
jar
- java-dates-2
com.baeldung
parent-java
0.0.1-SNAPSHOT
- ../parent-java
+ ../../parent-java
-
- joda-time
- joda-time
- ${joda-time.version}
-
-
org.apache.commons
commons-lang3
${commons-lang3.version}
-
commons-validator
commons-validator
${commons-validator.version}
-
+
+ log4j
+ log4j
+ ${log4j.version}
+
org.assertj
@@ -41,10 +37,21 @@
${assertj.version}
test
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ com.darwinsys
+ hirondelle-date4j
+ RELEASE
+ test
+
- java-dates-2
+ core-java-datetime-string
src/main/resources
@@ -66,12 +73,11 @@
+ 1.6
+ 2.10
3.6.1
- 2.10
- 3.9
- 1.6
- 1.9
+ 1.9
1.9
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidator.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidator.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
similarity index 89%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
index fb92eb8d0d..90077795f0 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
similarity index 89%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
index 58e2d4d5ad..e280d365c2 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.OffsetTime;
import java.time.ZoneOffset;
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
similarity index 93%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
index b54b8c5225..a0dd304876 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
diff --git a/java-dates/src/test/java/com/baeldung/date/StringToDateUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/StringToDateUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/date/StringToDateUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/StringToDateUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
diff --git a/java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
index a08d3737cd..7634ff1572 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
index 488f934179..6134e48f70 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
index e78ff3e3fd..cc19055beb 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
similarity index 98%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
index 65f63bc787..150983c61b 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/core-java-modules/core-java-datetime/README.md b/core-java-modules/core-java-datetime/README.md
deleted file mode 100644
index 71aea2e9db..0000000000
--- a/core-java-modules/core-java-datetime/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-=========
-
-## Core Java 8 Cookbooks and Examples
-
-### Relevant Articles:
-- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone)
-- [Overriding System Time for Testing in Java](https://www.baeldung.com/java-override-system-time)
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime/pom.xml b/core-java-modules/core-java-datetime/pom.xml
deleted file mode 100644
index 800c29ef99..0000000000
--- a/core-java-modules/core-java-datetime/pom.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-
- 4.0.0
- core-java-datetime
- 0.1.0-SNAPSHOT
- core-java-datetime
- jar
-
-
- com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../../parent-java
-
-
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- joda-time
- joda-time
- ${joda.version}
-
-
- org.powermock
- powermock-module-junit4
- ${powermock.version}
- test
-
-
- org.powermock
- powermock-api-mockito2
- ${powermock.version}
- test
-
-
- org.jmockit
- jmockit
- ${jmockit.version}
- test
-
-
-
-
- core-java-datetime
-
-
- src/main/resources
- true
-
-
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
-
- true
-
-
-
-
-
-
-
- 2.10
-
- 3.6.1
- 2.0.0-RC.4
- 1.44
-
- 2.22.1
-
-
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
index 757d9229df..09ca44d9be 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
@@ -3,7 +3,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
-
com.baeldung.consumermodule
consumermodule
1.0
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
index 4de3df8c01..861f06f089 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
@@ -3,16 +3,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
+ com.baeldung.servicemodule
+ servicemodule
+ 1.0
+
>com.baeldung.decoupling-pattern2
decoupling-pattern2
1.0-SNAPSHOT
- com.baeldung.servicemodule
- servicemodule
- 1.0
-
diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml
index 6e67c76d20..5bca2f0dbf 100644
--- a/core-java-modules/core-java-lang-oop-2/pom.xml
+++ b/core-java-modules/core-java-lang-oop-2/pom.xml
@@ -28,12 +28,6 @@
test
-
-
-
- 3.10.0
- 3.0.3
-
core-java-lang-oop-2
@@ -45,4 +39,10 @@
+
+
+ 3.10.0
+ 3.0.3
+
+
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java
new file mode 100644
index 0000000000..a80387d61a
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java
@@ -0,0 +1,18 @@
+package com.baeldung.core.modifiers;
+
+public class FirstClass {
+
+ protected String name;
+
+ protected FirstClass(String name) {
+ this.name = name;
+ }
+
+ protected String getName() {
+ return name;
+ }
+
+ protected static class InnerClass {
+ public InnerClass() {}
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java
new file mode 100644
index 0000000000..83381931d0
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java
@@ -0,0 +1,15 @@
+package com.baeldung.core.modifiers;
+
+public class GenericClass {
+
+ public static void main(String[] args) {
+ // accessing protected constructor
+ FirstClass first = new FirstClass("random name");
+ // using protected method
+ System.out.println("FirstClass name is " + first.getName());
+ // accessing a protected field
+ first.name = "new name";
+ // instantiating protected inner class
+ FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java
new file mode 100644
index 0000000000..528f97539a
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java
@@ -0,0 +1,18 @@
+package com.baeldung.core.modifiers.otherpackage;
+
+import com.baeldung.core.modifiers.FirstClass;
+
+public class SecondClass extends FirstClass {
+
+ public SecondClass(String name) {
+ // accessing protected constructor
+ super(name);
+ // using protected method
+ System.out.println("SecondClass name is " + this.getName());
+ // accessing a protected field
+ this.name = "new name";
+ // instantiating protected inner class -> add public constructor to InnerClass
+ FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java
new file mode 100644
index 0000000000..d29533edef
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java
@@ -0,0 +1,20 @@
+package com.baeldung.core.modifiers.otherpackage;
+
+import com.baeldung.core.modifiers.FirstClass;
+//import com.baeldung.core.modifiers.FirstClass.InnerClass;
+
+public class SecondGenericClass {
+
+ // uncomment the following lines to see the errors
+ public static void main(String[] args) {
+ // accessing protected constructor
+ // FirstClass first = new FirstClass("random name");
+ // using protected method
+ // System.out.println("FirstClass name is " + first.getName());
+ // accessing a protected field
+ // first.name = "new name";
+ // instantiating protected inner class
+ // FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+
+}
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index f6c5ef04a5..8c5f7fe1e9 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -54,7 +54,7 @@
-
+
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
diff --git a/core-java-modules/core-java-string-apis/README.md b/core-java-modules/core-java-string-apis/README.md
new file mode 100644
index 0000000000..fc36ba8640
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/README.md
@@ -0,0 +1,12 @@
+## Java String APIs
+
+This module contains articles about string APIs.
+
+### Relevant Articles:
+- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
+- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
+- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
+- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
+- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
+- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
+- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
new file mode 100644
index 0000000000..7d9d888fa1
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -0,0 +1,55 @@
+
+ 4.0.0
+ core-java-string-apis
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-string-apis
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+ org.passay
+ passay
+ ${passay.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+
+
+ core-java-string-apis
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.3.1
+ 1.4
+
+
+
diff --git a/java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
similarity index 99%
rename from java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
index 46af4d7c51..d49b13c9c9 100644
--- a/java-strings-2/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
@@ -1,4 +1,11 @@
-package com.baeldung.string.password;
+package com.baeldung.password;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.text.RandomStringGenerator;
+import org.passay.CharacterRule;
+import org.passay.EnglishCharacterData;
+import org.passay.CharacterData;
+import org.passay.PasswordGenerator;
import java.security.SecureRandom;
import java.util.Collections;
@@ -8,13 +15,6 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.text.RandomStringGenerator;
-import org.passay.CharacterData;
-import org.passay.CharacterRule;
-import org.passay.EnglishCharacterData;
-import org.passay.PasswordGenerator;
-
public class RandomPasswordGenerator {
/**
diff --git a/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
similarity index 98%
rename from java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
index 3bb0ff5b77..5ab506f259 100644
--- a/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.streamtokenizer;
+package com.baeldung.streamtokenizer;
import java.io.*;
import java.util.ArrayList;
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
similarity index 89%
rename from java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
index 72af4a9aee..50c139e2d3 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/StringBufferStringBuilder.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.stringbuilderstringbuffer;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
@@ -8,12 +8,12 @@ import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
-public class StringBufferStringBuilder {
+public class StringBuilderStringBuffer {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
- .include(StringBufferStringBuilder.class.getSimpleName())
+ .include(StringBuilderStringBuffer.class.getSimpleName())
.build();
new Runner(opt).run();
diff --git a/java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
similarity index 97%
rename from java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
index 916a3c79ff..aa15345bcb 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.charsequence;
import org.junit.Test;
diff --git a/java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
similarity index 96%
rename from java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
index 648fdaf65a..549c889028 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
@@ -1,12 +1,12 @@
-package com.baeldung.string.formatter;
+package com.baeldung.formatter;
+
+import org.junit.Test;
import java.util.Calendar;
import java.util.Formatter;
import java.util.GregorianCalendar;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
+
+import static org.junit.Assert.*;
public class StringFormatterExampleUnitTest {
diff --git a/java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
similarity index 98%
rename from java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
index bfd4b0fe8e..7fb55ad1cb 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.password;
-
-import static org.junit.Assert.assertTrue;
+package com.baeldung.password;
import org.junit.Test;
+import static org.junit.Assert.assertTrue;
+
/**
* Examples of passwords conforming to various specifications, using different libraries.
*
diff --git a/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
similarity index 96%
rename from java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
index 01091ec629..29214167be 100644
--- a/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.streamtokenizer;
+package com.baeldung.streamtokenizer;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
index a72f811336..89f91acd6e 100644
--- a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.stringjoiner;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
@@ -8,7 +8,7 @@ import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class StringJoinerUnitTest {
private final String DELIMITER_COMMA = ",";
diff --git a/java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
diff --git a/core-java-modules/core-java-string-apis/src/test/resources/data.csv b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
new file mode 100644
index 0000000000..ec4ac10443
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
@@ -0,0 +1,3 @@
+1|IND|India
+2|MY|Malaysia
+3|AU|Australia
diff --git a/java-strings-2/src/main/resources/stream-tokenizer-example.txt b/core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
similarity index 100%
rename from java-strings-2/src/main/resources/stream-tokenizer-example.txt
rename to core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
diff --git a/ddd/pom.xml b/ddd/pom.xml
index 4ac65ea841..c249007ba4 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -3,7 +3,6 @@
4.0.0
com.baeldung.ddd
ddd
- 0.0.1-SNAPSHOT
ddd
jar
DDD series examples
@@ -35,7 +34,6 @@
org.junit.platform
junit-platform-launcher
- ${junit-platform.version}
test
@@ -85,8 +83,6 @@
1.0.1
- 2.22.0
- 2.0.6.RELEASE
\ No newline at end of file
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index e1d78e7ed6..213331f25c 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
disruptor
0.1.0-SNAPSHOT
disruptor
@@ -116,10 +115,7 @@
3.3.6
-
- 6.10
- 3.6.1
-
+
2.4.3
3.0.2
1.4.4
diff --git a/dozer/pom.xml b/dozer/pom.xml
index 8234eb4c79..c781962d83 100644
--- a/dozer/pom.xml
+++ b/dozer/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
dozer
1.0
dozer
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index 9fe228bf89..947175b6a0 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -32,7 +32,6 @@
2.5.7
3.4.11
0.10
- 2.19.1
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index 1086b09833..d9712e53e0 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -3,7 +3,6 @@
4.0.0
com.baeldung.ethereum
ethereum
- 0.0.1-SNAPSHOT
ethereum
@@ -182,8 +181,6 @@
- UTF-8
- 8.5.4
1.5.0-RELEASE
3.3.1
5.1.9.RELEASE
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index e8b327e35f..49bd6bd9fd 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -3,7 +3,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
flyway-cdi-extension
1.0-SNAPSHOT
flyway-cdi-extension
@@ -51,8 +50,6 @@
- 1.8
- 1.8
2.0.SP1
3.0.5.Final
5.1.4
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index 0723cd3be2..8a7cb87701 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -5,7 +5,6 @@
4.0.0
- com.baeldung
google-web-toolkit
1.0-SNAPSHOT
google-web-toolkit
diff --git a/gradle-5/README.md b/gradle-5/README.md
new file mode 100644
index 0000000000..73b6b7e12a
--- /dev/null
+++ b/gradle-5/README.md
@@ -0,0 +1,5 @@
+
+### Relevant Articles:
+
+- [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main)
+
diff --git a/gson/pom.xml b/gson/pom.xml
index 9d2cf630d0..4aa6c00458 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -2,7 +2,6 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
gson
0.1-SNAPSHOT
gson
diff --git a/guava-collections-map/pom.xml b/guava-collections-map/pom.xml
index 45bb6b8caa..21597d0e28 100644
--- a/guava-collections-map/pom.xml
+++ b/guava-collections-map/pom.xml
@@ -13,9 +13,6 @@
../parent-java
-
-
-
guava-collections-map
@@ -26,7 +23,4 @@
-
-
-
\ No newline at end of file
diff --git a/guava-collections-set/pom.xml b/guava-collections-set/pom.xml
index 46dcae492d..640a28c4c1 100644
--- a/guava-collections-set/pom.xml
+++ b/guava-collections-set/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava-collections-set
0.1.0-SNAPSHOT
guava-collections-set
@@ -28,8 +27,6 @@
-
- 27.1-jre
3.6.1
diff --git a/guava-collections/pom.xml b/guava-collections/pom.xml
index 8cdb086029..9dfcceaab8 100644
--- a/guava-collections/pom.xml
+++ b/guava-collections/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava-collections
0.1.0-SNAPSHOT
guava-collections
@@ -54,7 +53,6 @@
- 24.0-jre
4.1
diff --git a/guava-io/pom.xml b/guava-io/pom.xml
index 2a66baba80..aaaf7edd4e 100644
--- a/guava-io/pom.xml
+++ b/guava-io/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava-io
0.1.0-SNAPSHOT
guava-io
diff --git a/guava/pom.xml b/guava/pom.xml
index 3a19901a02..4ca9918455 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava
0.1.0-SNAPSHOT
guava
@@ -26,8 +25,6 @@
${assertj.version}
test
-
-
@@ -41,9 +38,6 @@
-
- 24.0-jre
-
3.6.1
diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml
index 705792ad05..9e0b0671d0 100644
--- a/hazelcast/pom.xml
+++ b/hazelcast/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
hazelcast
0.0.1-SNAPSHOT
hazelcast
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index b2b0f98dd1..183c4438de 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
httpclient-simple
0.1-SNAPSHOT
httpclient-simple
diff --git a/httpclient/pom.xml b/httpclient/pom.xml
index 8cd483cfc6..6316ee4eed 100644
--- a/httpclient/pom.xml
+++ b/httpclient/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
httpclient
0.1-SNAPSHOT
httpclient
@@ -48,11 +47,6 @@
httpmime
${httpclient.version}
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
org.apache.httpcomponents
httpasyncclient
@@ -82,51 +76,12 @@
-
-
- live
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
-
-
- **/*LiveTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
-
- 19.0
- 1.10
4.1.4
2.5.1
4.5.8
-
- 1.6.1
\ No newline at end of file
diff --git a/hystrix/pom.xml b/hystrix/pom.xml
index e08af2c40f..4aeb47f095 100644
--- a/hystrix/pom.xml
+++ b/hystrix/pom.xml
@@ -41,23 +41,11 @@
hystrix-metrics-event-stream
${hystrix-metrics-event-stream.version}
-
com.netflix.rxjava
rxjava-core
${rxjava-core.version}
-
- org.hamcrest
- hamcrest-all
- ${hamcrest-all.version}
- test
-
-
- org.springframework
- spring-test
- test
-
@@ -65,9 +53,7 @@
1.5.8
0.20.7
- 2.7
1.5.8
- 1.5.8
diff --git a/jackson-simple/README.md b/jackson-simple/README.md
index 302fcb5b05..9d24a20e4a 100644
--- a/jackson-simple/README.md
+++ b/jackson-simple/README.md
@@ -2,7 +2,8 @@
This module contains articles about Jackson that are also part of the Jackson Ebook.
-###The Course
+### The Course
+
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
index 2745e4f767..a339ddf2c5 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
@@ -1,20 +1,29 @@
package com.baeldung.jackson.objectmapper;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
import com.baeldung.jackson.objectmapper.dto.Car;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
public class JavaReadWriteJsonExampleUnitTest {
+ @Rule
+ public TemporaryFolder folder = new TemporaryFolder();
+
final String EXAMPLE_JSON = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
final String LOCAL_JSON = "[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"BMW\" }]";
@@ -27,6 +36,19 @@ public class JavaReadWriteJsonExampleUnitTest {
assertThat(carAsString, containsString("renault"));
}
+ @Test
+ public void whenWriteToFile_thanCorrect() throws Exception {
+ File resultFile = folder.newFile("car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car car = new Car("yellow", "renault");
+ objectMapper.writeValue(resultFile, car);
+
+ Car fromFile = objectMapper.readValue(resultFile, Car.class);
+ assertEquals(car.getType(), fromFile.getType());
+ assertEquals(car.getColor(), fromFile.getColor());
+ }
+
@Test
public void whenReadJsonToJava_thanCorrect() throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
@@ -66,4 +88,26 @@ public class JavaReadWriteJsonExampleUnitTest {
assertNotNull(key);
}
}
+
+ @Test
+ public void wheReadFromFile_thanCorrect() throws Exception {
+ File resource = new File("src/test/resources/json_car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car fromFile = objectMapper.readValue(resource, Car.class);
+
+ assertEquals("BMW", fromFile.getType());
+ assertEquals("Black", fromFile.getColor());
+ }
+
+ @Test
+ public void wheReadFromUrl_thanCorrect() throws Exception {
+ URL resource = new URL("file:src/test/resources/json_car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car fromFile = objectMapper.readValue(resource, Car.class);
+
+ assertEquals("BMW", fromFile.getType());
+ assertEquals("Black", fromFile.getColor());
+ }
}
diff --git a/jackson-simple/src/test/resources/.gitignore b/jackson-simple/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/jackson-simple/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file
diff --git a/jackson-simple/src/test/resources/json_car.json b/jackson-simple/src/test/resources/json_car.json
new file mode 100644
index 0000000000..2f6b35b523
--- /dev/null
+++ b/jackson-simple/src/test/resources/json_car.json
@@ -0,0 +1,4 @@
+{
+ "color": "Black",
+ "type": "BMW"
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java
new file mode 100644
index 0000000000..2bbef534c3
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java
new file mode 100644
index 0000000000..2c96b6eb80
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java
@@ -0,0 +1,31 @@
+package com.baeldung.jackson.deserialization.enums;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+}
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java
new file mode 100644
index 0000000000..36ef7e244a
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java
new file mode 100644
index 0000000000..bae0c0df34
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java
@@ -0,0 +1,42 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import java.io.IOException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+public class CustomEnumDeserializer extends StdDeserializer {
+
+ private static final long serialVersionUID = -1166032307856492833L;
+
+ public CustomEnumDeserializer() {
+ this(null);
+ }
+
+ public CustomEnumDeserializer(Class> c) {
+ super(c);
+ }
+
+ @Override
+ public Distance deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+
+ JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+
+ String unit = node.get("unit").asText();
+ double meters = node.get("meters").asDouble();
+
+ for (Distance distance : Distance.values()) {
+
+ if (distance.getUnit().equals(unit) &&
+ Double.compare(distance.getMeters(), meters) == 0) {
+
+ return distance;
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java
new file mode 100644
index 0000000000..9cb3a0c391
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java
@@ -0,0 +1,33 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+@JsonDeserialize(using = CustomEnumDeserializer.class)
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java
new file mode 100644
index 0000000000..6a478dd263
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java
new file mode 100644
index 0000000000..18235fb5c6
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java
@@ -0,0 +1,48 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+ @JsonCreator
+ public static Distance forValues(@JsonProperty("unit") String unit, @JsonProperty("meters") double meters) {
+
+ for (Distance distance : Distance.values()) {
+ if (distance.unit.equals(unit) && Double.compare(distance.meters, meters) == 0) {
+
+ return distance;
+ }
+ }
+
+ return null;
+
+ }
+}
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java
new file mode 100644
index 0000000000..7f763f97c4
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java
new file mode 100644
index 0000000000..e671a9ae5b
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java
@@ -0,0 +1,51 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum Distance {
+
+ @JsonProperty("distance-in-km")
+ KILOMETER("km", 1000),
+
+ @JsonProperty("distance-in-miles")
+ MILE("miles", 1609.34),
+
+ @JsonProperty("distance-in-meters")
+ METER("meters", 1),
+
+ @JsonProperty("distance-in-inches")
+ INCH("inches", 0.0254),
+
+ @JsonProperty("distance-in-cm")
+ CENTIMETER("cm", 0.01),
+
+ @JsonProperty("distance-in-mm")
+ MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+}
+
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java
new file mode 100644
index 0000000000..014668ea8c
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java
new file mode 100644
index 0000000000..44bb5f20c3
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java
@@ -0,0 +1,35 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ @JsonValue
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+}
+
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java
new file mode 100644
index 0000000000..c7ce96e013
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class DefaultEnumDeserializationUnitTest {
+
+ @Test
+ public void givenEnum_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\":\"KILOMETER\"}";
+ City city = new ObjectMapper().readValue(json, City.class);
+
+ assertEquals(Distance.KILOMETER, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java
new file mode 100644
index 0000000000..e8dbfa8df8
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumCustomDeserializationUnitTest {
+
+ @Test
+ public void givenEnumWithCustomDeserializer_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.MILE, city.getDistance());
+ }
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java
new file mode 100644
index 0000000000..d778cbe26b
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonCreatorUnitTest {
+
+ @Test
+ public void givenEnumWithJsonCreator_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.MILE, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java
new file mode 100644
index 0000000000..134f4a29cc
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonPropertyUnitTest {
+
+ @Test
+ public void givenEnumWithJsonProperty_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": \"distance-in-km\"}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.KILOMETER, city.getDistance());
+
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java
new file mode 100644
index 0000000000..85afcb9a69
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonValueUnitTest {
+
+ @Test
+ public void givenEnumWithJsonValue_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": \"0.0254\"}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.INCH, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
index 45c0ba1382..d4fb2401ed 100644
--- a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
@@ -2,11 +2,8 @@ package com.baeldung.jackson.enums;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertThat;
-
import java.io.IOException;
-
import org.junit.Test;
-
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -18,5 +15,5 @@ public class JacksonEnumSerializationUnitTest {
assertThat(dtoAsString, containsString("1609.34"));
}
-
+
}
diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml
index 2f9e011aa7..4c5d0f31d5 100644
--- a/java-blockchain/pom.xml
+++ b/java-blockchain/pom.xml
@@ -7,12 +7,14 @@
0.1.0-SNAPSHOT
java-blockchain
jar
+
com.baeldung
parent-java
0.0.1-SNAPSHOT
../parent-java
+
java-blockchain
@@ -33,8 +35,10 @@
+
1.8
1.8
+
\ No newline at end of file
diff --git a/java-dates-2/.gitignore b/java-dates-2/.gitignore
deleted file mode 100644
index 6471aabbcf..0000000000
--- a/java-dates-2/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-*.class
-
-0.*
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-.resourceCache
-
-# Packaged files #
-*.jar
-*.war
-*.ear
-
-# Files generated by integration tests
-*.txt
-backup-pom.xml
-/bin/
-/temp
-
-#IntelliJ specific
-.idea/
-*.iml
-
-#jenv
-.java-version
\ No newline at end of file
diff --git a/java-dates-2/README.md b/java-dates-2/README.md
deleted file mode 100644
index b2f8319e58..0000000000
--- a/java-dates-2/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-## Relevant Articles:
-- [Converting Between LocalDate and XMLGregorianCalendar](https://www.baeldung.com/java-localdate-to-xmlgregoriancalendar)
-- [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds)
-- [Check If a String Is a Valid Date in Java](https://www.baeldung.com/java-string-valid-date)
diff --git a/java-dates/README.md b/java-dates/README.md
index 2c962ece64..d4657a3057 100644
--- a/java-dates/README.md
+++ b/java-dates/README.md
@@ -3,31 +3,22 @@
## Java Dates Cookbooks and Examples
### Relevant Articles:
-- [TemporalAdjuster in Java](https://www.baeldung.com/java-temporal-adjuster)
-- [Handling Daylight Savings Time in Java](https://www.baeldung.com/java-daylight-savings)
-- [Period and Duration in Java](https://www.baeldung.com/java-period-duration)
-- [Difference Between Two Dates in Java](https://www.baeldung.com/java-date-difference)
-- [RegEx for matching Date Pattern in Java](https://www.baeldung.com/java-date-regular-expressions)
-- [Migrating to the New Java 8 Date Time API](https://www.baeldung.com/migrating-to-java-8-date-time-api)
-- [Introduction to the Java 8 Date/Time API](https://www.baeldung.com/java-8-date-time-intro)
-- [Get the Current Date, Time and Timestamp in Java 8](https://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
-- [Get Date Without Time in Java](https://www.baeldung.com/java-date-without-time)
-- [How to Get All Dates Between Two Dates?](https://www.baeldung.com/java-between-dates)
-- [Convert Date to LocalDate or LocalDateTime and Back](https://www.baeldung.com/java-date-to-localdate-and-localdatetime)
-- [Display All Time Zones With GMT And UTC in Java](https://www.baeldung.com/java-time-zones)
-- [Extracting Year, Month and Day from Date in Java](https://www.baeldung.com/java-year-month-day)
-- [Guide to java.util.GregorianCalendar](https://www.baeldung.com/java-gregorian-calendar)
-- [Measure Elapsed Time in Java](https://www.baeldung.com/java-measure-elapsed-time)
-- [How to Get the Start and the End of a Day using Java](https://www.baeldung.com/java-day-start-end)
-- [Calculate Age in Java](https://www.baeldung.com/java-get-age)
-- [Increment Date in Java](https://www.baeldung.com/java-increment-date)
-- [Add Hours To a Date In Java](https://www.baeldung.com/java-add-hours-date)
-- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
-- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
-- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
-- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp)
-- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
+- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster)
+- [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings)
+- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
+- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
+- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
+- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
+- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
+- [Get Date Without Time in Java](http://www.baeldung.com/java-date-without-time)
+- [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates)
+- [Extracting Year, Month and Day from Date in Java](http://www.baeldung.com/java-year-month-day)
+- [Guide to java.util.GregorianCalendar](http://www.baeldung.com/java-gregorian-calendar)
+- [Measure Elapsed Time in Java](http://www.baeldung.com/java-measure-elapsed-time)
+- [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end)
+- [Calculate Age in Java](http://www.baeldung.com/java-get-age)
+- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
+- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
- [Differences Between ZonedDateTime and OffsetDateTime](https://www.baeldung.com/java-zoneddatetime-offsetdatetime)
- [Introduction to Joda-Time](https://www.baeldung.com/joda-time)
-- [Convert String to Date in Java](https://www.baeldung.com/java-string-to-date)
diff --git a/java-dates/pom.xml b/java-dates/pom.xml
index 3fddf3f0f8..761ebd71a6 100644
--- a/java-dates/pom.xml
+++ b/java-dates/pom.xml
@@ -25,12 +25,6 @@
log4j
${log4j.version}
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java b/java-dates/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
rename to java-dates/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java b/java-dates/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
rename to java-dates/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java b/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java
new file mode 100644
index 0000000000..13a2ba6a1a
--- /dev/null
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java
@@ -0,0 +1,21 @@
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+public class UseDateTimeFormatter {
+ public String formatAsIsoDate(LocalDateTime localDateTime) {
+ return localDateTime.format(DateTimeFormatter.ISO_DATE);
+ }
+
+ public String formatCustom(LocalDateTime localDateTime, String pattern) {
+ return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
+ }
+
+ public String formatWithStyleAndLocale(LocalDateTime localDateTime, FormatStyle formatStyle, Locale locale) {
+ return localDateTime.format(DateTimeFormatter.ofLocalizedDateTime(formatStyle)
+ .withLocale(locale));
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java b/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java
index b380c04fc2..ec8dfa2fc4 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java
@@ -36,10 +36,15 @@ class UseLocalDate {
}
LocalDate getFirstDayOfMonth() {
- LocalDate firstDayOfMonth = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+ LocalDate firstDayOfMonth = LocalDate.now()
+ .with(TemporalAdjusters.firstDayOfMonth());
return firstDayOfMonth;
}
+ boolean isLeapYear(LocalDate localDate) {
+ return localDate.isLeapYear();
+ }
+
LocalDateTime getStartOfDay(LocalDate localDate) {
LocalDateTime startofDay = localDate.atStartOfDay();
return startofDay;
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java b/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
index b2ff11ba16..267a9412eb 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
@@ -2,6 +2,7 @@ package com.baeldung.datetime;
import java.time.LocalDateTime;
import java.time.LocalTime;
+import java.time.ZoneOffset;
import java.time.temporal.ChronoField;
public class UseLocalDateTime {
@@ -21,4 +22,7 @@ public class UseLocalDateTime {
return endOfDate;
}
+ LocalDateTime ofEpochSecond(int epochSecond, ZoneOffset zoneOffset) {
+ return LocalDateTime.ofEpochSecond(epochSecond, 0, zoneOffset);
+ }
}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java b/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java
index 8d166c413f..876516e365 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java
@@ -9,6 +9,10 @@ public class UseLocalTime {
return LocalTime.of(hour, min, seconds);
}
+ LocalTime getLocalTimeUsingFactoryOfMethod(int hour, int min) {
+ return LocalTime.of(hour, min);
+ }
+
LocalTime getLocalTimeUsingParseMethod(String timeRepresentation) {
return LocalTime.parse(timeRepresentation);
}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java b/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java
new file mode 100644
index 0000000000..ed8499d6e0
--- /dev/null
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java
@@ -0,0 +1,11 @@
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+public class UseOffsetDateTime {
+ public OffsetDateTime offsetOfLocalDateTimeAndOffset(LocalDateTime localDateTime, ZoneOffset offset) {
+ return OffsetDateTime.of(localDateTime, offset);
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java b/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
index 505bfa741f..a8948e5ce1 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
@@ -12,31 +12,35 @@ class UseZonedDateTime {
return ZonedDateTime.of(localDateTime, zoneId);
}
+ ZonedDateTime getZonedDateTimeUsingParseMethod(String parsableString) {
+ return ZonedDateTime.parse(parsableString);
+ }
+
ZonedDateTime getStartOfDay(LocalDate localDate, ZoneId zone) {
- ZonedDateTime startofDay = localDate.atStartOfDay()
+ ZonedDateTime startOfDay = localDate.atStartOfDay()
.atZone(zone);
- return startofDay;
+ return startOfDay;
}
ZonedDateTime getStartOfDayShorthand(LocalDate localDate, ZoneId zone) {
- ZonedDateTime startofDay = localDate.atStartOfDay(zone);
- return startofDay;
+ ZonedDateTime startOfDay = localDate.atStartOfDay(zone);
+ return startOfDay;
}
ZonedDateTime getStartOfDayFromZonedDateTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.toLocalDateTime()
+ ZonedDateTime startOfDay = zonedDateTime.toLocalDateTime()
.toLocalDate()
.atStartOfDay(zonedDateTime.getZone());
- return startofDay;
+ return startOfDay;
}
ZonedDateTime getStartOfDayAtMinTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
- return startofDay;
+ ZonedDateTime startOfDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
+ return startOfDay;
}
ZonedDateTime getStartOfDayAtMidnightTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.with(ChronoField.NANO_OF_DAY, 0);
- return startofDay;
+ ZonedDateTime startOfDay = zonedDateTime.with(ChronoField.NANO_OF_DAY, 0);
+ return startOfDay;
}
}
diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
index a35699e469..226556d4bb 100644
--- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.date;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -16,7 +16,7 @@ import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
public class DateDiffUnitTest {
@@ -31,14 +31,14 @@ public class DateDiffUnitTest {
assertEquals(diff, 6);
}
-
+
@Test
public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDate now = LocalDate.now();
LocalDate sixDaysBehind = now.minusDays(6);
Period period = Period.between(now, sixDaysBehind);
- int diff = period.getDays();
+ int diff = Math.abs(period.getDays());
assertEquals(diff, 6);
}
@@ -68,7 +68,8 @@ public class DateDiffUnitTest {
public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime now = ldt.atZone(ZoneId.of("America/Montreal"));
- ZonedDateTime sixDaysBehind = now.withZoneSameInstant(ZoneId.of("Asia/Singapore")).minusDays(6);
+ ZonedDateTime sixDaysBehind = now.withZoneSameInstant(ZoneId.of("Asia/Singapore"))
+ .minusDays(6);
long diff = ChronoUnit.DAYS.between(sixDaysBehind, now);
assertEquals(diff, 6);
}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java b/java-dates/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
rename to java-dates/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java b/java-dates/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
similarity index 85%
rename from java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
rename to java-dates/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
index ff51476e7c..af72f9e58a 100644
--- a/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
@@ -1,12 +1,16 @@
package com.baeldung.date.comparison;
-import org.junit.Test;
-
-import java.time.*;
-
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import org.junit.Test;
+
public class Java8DateTimeApiGeneralComparisonsUnitTest {
@Test
@@ -54,10 +58,8 @@ public class Java8DateTimeApiGeneralComparisonsUnitTest {
@Test
public void givenZonedDateTimes_whenComparing_thenAssertsPass() {
- ZonedDateTime timeInNewYork = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0,
- ZoneId.of("America/New_York"));
- ZonedDateTime timeInBerlin = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0,
- ZoneId.of("Europe/Berlin"));
+ ZonedDateTime timeInNewYork = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0, ZoneId.of("America/New_York"));
+ ZonedDateTime timeInBerlin = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, ZoneId.of("Europe/Berlin"));
assertThat(timeInNewYork.isAfter(timeInBerlin), is(false));
assertThat(timeInNewYork.isBefore(timeInBerlin), is(false));
@@ -80,4 +82,14 @@ public class Java8DateTimeApiGeneralComparisonsUnitTest {
assertThat(firstTime.compareTo(secondTime), is(-1));
}
+
+ @Test
+ public void givenMinMaxLocalTimes_whenComparing_thenAssertsPass() {
+ LocalTime minTime = LocalTime.MIN;
+ LocalTime time = LocalTime.of(8, 30);
+ LocalTime maxTime = LocalTime.MAX;
+
+ assertThat(minTime.isBefore(time), is(true));
+ assertThat(time.isBefore(maxTime), is(true));
+ }
}
\ No newline at end of file
diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java b/java-dates/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
rename to java-dates/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java b/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
index db6b353ba6..be43fb609a 100644
--- a/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
@@ -1,16 +1,39 @@
package com.baeldung.dateapi;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.time.Duration;
import java.time.Instant;
+import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import org.junit.Test;
public class JavaDurationUnitTest {
+ @Test
+ public void givenATimePlus30Seconds_whenRequestingDuration_thenExpect30() {
+ LocalTime initialTime = LocalTime.of(6, 30, 0);
+ LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
+
+ long seconds = Duration.between(initialTime, finalTime)
+ .getSeconds();
+
+ assertThat(seconds).isEqualTo(30);
+ }
+
+ @Test
+ public void givenATimePlus30Seconds_whenRequestingSecondsBetween_thenExpect30() {
+ LocalTime initialTime = LocalTime.of(6, 30, 0);
+ LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
+
+ long seconds = ChronoUnit.SECONDS.between(initialTime, finalTime);
+
+ assertThat(seconds).isEqualTo(30);
+ }
+
@Test
public void test2() {
Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
@@ -29,11 +52,15 @@ public class JavaDurationUnitTest {
Duration fromMinutes = Duration.ofMinutes(60);
assertEquals(1, fromMinutes.toHours());
- assertEquals(120, duration.plusSeconds(60).getSeconds());
- assertEquals(30, duration.minusSeconds(30).getSeconds());
+ assertEquals(120, duration.plusSeconds(60)
+ .getSeconds());
+ assertEquals(30, duration.minusSeconds(30)
+ .getSeconds());
- assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());
- assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());
+ assertEquals(120, duration.plus(60, ChronoUnit.SECONDS)
+ .getSeconds());
+ assertEquals(30, duration.minus(30, ChronoUnit.SECONDS)
+ .getSeconds());
Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
Duration fromChar2 = Duration.parse("PT10M");
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java b/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
index 81e9153a51..6dfbbe8c24 100644
--- a/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
@@ -1,18 +1,41 @@
package com.baeldung.dateapi;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.temporal.ChronoUnit;
+
import org.apache.log4j.Logger;
import org.junit.Test;
-import java.time.LocalDate;
-import java.time.Period;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
public class JavaPeriodUnitTest {
private static final Logger LOG = Logger.getLogger(JavaPeriodUnitTest.class);
+ @Test
+ public void givenADatePlus5Days_whenRequestingPeriod_thenExpectFive() {
+ LocalDate initialDate = LocalDate.parse("2007-05-10");
+ LocalDate finalDate = initialDate.plus(Period.ofDays(5));
+
+ int days = Period.between(initialDate, finalDate)
+ .getDays();
+
+ assertThat(days).isEqualTo(5);
+ }
+
+ @Test
+ public void givenADatePlus5Days_whenRequestingDaysBetween_thenExpectFive() {
+ LocalDate initialDate = LocalDate.parse("2007-05-10");
+ LocalDate finalDate = initialDate.plus(Period.ofDays(5));
+
+ long days = ChronoUnit.DAYS.between(initialDate, finalDate);
+
+ assertThat(days).isEqualTo(5);
+ }
+
@Test
public void whenTestPeriod_thenOk() {
@@ -24,8 +47,10 @@ public class JavaPeriodUnitTest {
LOG.info(String.format("Years:%d months:%d days:%d", period.getYears(), period.getMonths(), period.getDays()));
assertFalse(period.isNegative());
- assertEquals(56, period.plusDays(50).getDays());
- assertEquals(9, period.minusMonths(2).getMonths());
+ assertEquals(56, period.plusDays(50)
+ .getDays());
+ assertEquals(9, period.minusMonths(2)
+ .getMonths());
Period fromUnits = Period.of(3, 10, 10);
Period fromDays = Period.ofDays(50);
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java
new file mode 100644
index 0000000000..797e0b954a
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class UseDateTimeFormatterUnitTest {
+ private final UseDateTimeFormatter subject = new UseDateTimeFormatter();
+ private final LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
+
+ @Test
+ public void givenALocalDate_whenFormattingAsIso_thenPass() {
+ String result = subject.formatAsIsoDate(localDateTime);
+
+ assertThat(result).isEqualTo("2015-01-25");
+ }
+
+ @Test
+ public void givenALocalDate_whenFormattingWithPattern_thenPass() {
+ String result = subject.formatCustom(localDateTime, "yyyy/MM/dd");
+
+ assertThat(result).isEqualTo("2015/01/25");
+ }
+
+ @Test
+ public void givenALocalDate_whenFormattingWithStyleAndLocale_thenPass() {
+ String result = subject.formatWithStyleAndLocale(localDateTime, FormatStyle.MEDIUM, Locale.UK);
+
+ assertThat(result).isEqualTo("25 Jan 2015, 06:30:00");
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
index 5709fc7209..2bbee16e25 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
@@ -7,12 +7,13 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
+import java.time.ZoneOffset;
import org.junit.Test;
public class UseLocalDateTimeUnitTest {
- UseLocalDateTime useLocalDateTime = new UseLocalDateTime();
+ private UseLocalDateTime useLocalDateTime = new UseLocalDateTime();
@Test
public void givenString_whenUsingParse_thenLocalDateTime() {
@@ -33,4 +34,28 @@ public class UseLocalDateTimeUnitTest {
assertThat(endOfDayFromGivenDirectly.toLocalTime()).isEqualTo(LocalTime.MAX);
assertThat(endOfDayFromGivenDirectly.toString()).isEqualTo("2018-06-23T23:59:59.999999999");
}
+
+ @Test
+ public void givenLocalDateTimeInFebruary_whenRequestingMonth_thenMonthIsFebruary() {
+ LocalDateTime givenLocalDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 6, 30);
+
+ assertThat(givenLocalDateTime.getMonth()).isEqualTo(Month.FEBRUARY);
+ }
+
+ @Test
+ public void givenLocalDateTime_whenManipulating_thenResultIsAsExpected() {
+ LocalDateTime givenLocalDateTime = LocalDateTime.parse("2015-02-20T06:30:00");
+
+ LocalDateTime manipulatedLocalDateTime = givenLocalDateTime.plusDays(1);
+ manipulatedLocalDateTime = manipulatedLocalDateTime.minusHours(2);
+
+ assertThat(manipulatedLocalDateTime).isEqualTo(LocalDateTime.of(2015, Month.FEBRUARY, 21, 4, 30));
+ }
+
+ @Test
+ public void whenRequestTimeFromEpoch_thenResultIsAsExpected() {
+ LocalDateTime result = useLocalDateTime.ofEpochSecond(1465817690, ZoneOffset.UTC);
+
+ assertThat(result.toString()).isEqualTo("2016-06-13T11:34:50");
+ }
}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
index bb9b60956d..fd22be9260 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
@@ -12,7 +12,7 @@ import org.junit.Test;
public class UseLocalDateUnitTest {
- UseLocalDate useLocalDate = new UseLocalDate();
+ private UseLocalDate useLocalDate = new UseLocalDate();
@Test
public void givenValues_whenUsingFactoryOf_thenLocalDate() {
@@ -88,4 +88,31 @@ public class UseLocalDateUnitTest {
assertThat(endOfDayWithMax.toString()).isEqualTo("2018-06-23T23:59:59.999999999");
}
+ @Test
+ public void givenTheYear2000_whenCheckingForLeapYear_thenReturnTrue() {
+ LocalDate given = LocalDate.parse("2000-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(true);
+ }
+
+ @Test
+ public void givenTheYear2004_whenCheckingForLeapYear_thenReturnTrue() {
+ LocalDate given = LocalDate.parse("2004-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(true);
+ }
+
+ @Test
+ public void givenTheYear2019_whenCheckingForLeapYear_thenReturnFalse() {
+ LocalDate given = LocalDate.parse("2019-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(false);
+ }
+
}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
index 996e200ae9..afee9126f9 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
@@ -7,21 +7,30 @@ import org.junit.Test;
public class UseLocalTimeUnitTest {
- UseLocalTime useLocalTime = new UseLocalTime();
+ private UseLocalTime useLocalTime = new UseLocalTime();
@Test
public void givenValues_whenUsingFactoryOf_thenLocalTime() {
- Assert.assertEquals("07:07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7, 7).toString());
+ Assert.assertEquals("07:07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7, 7)
+ .toString());
+ }
+
+ @Test
+ public void givenValues_whenUsingFactoryOfWithoutSeconds_thenLocalTime() {
+ Assert.assertEquals("07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7)
+ .toString());
}
@Test
public void givenString_whenUsingParse_thenLocalTime() {
- Assert.assertEquals("06:30", useLocalTime.getLocalTimeUsingParseMethod("06:30").toString());
+ Assert.assertEquals("06:30", useLocalTime.getLocalTimeUsingParseMethod("06:30")
+ .toString());
}
@Test
public void givenTime_whenAddHour_thenLocalTime() {
- Assert.assertEquals("07:30", useLocalTime.addAnHour(LocalTime.of(6, 30)).toString());
+ Assert.assertEquals("07:30", useLocalTime.addAnHour(LocalTime.of(6, 30))
+ .toString());
}
@Test
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java
new file mode 100644
index 0000000000..5b58dd3848
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+import org.junit.Test;
+
+public class UseOffsetDateTimeUnitTest {
+ private final UseOffsetDateTime subject = new UseOffsetDateTime();
+
+ @Test
+ public void givenAZoneOffSetAndLocalDateTime_whenCombing_thenValidResult() {
+ ZoneOffset offset = ZoneOffset.of("+02:00");
+ LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 6, 30);
+
+ OffsetDateTime result = subject.offsetOfLocalDateTimeAndOffset(localDateTime, offset);
+
+ assertThat(result.toString()).isEqualTo("2015-02-20T06:30+02:00");
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java
new file mode 100644
index 0000000000..78d9a647fe
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.junit.Test;
+
+public class UseToInstantUnitTest {
+
+ private UseToInstant subject = new UseToInstant();
+
+ @Test
+ public void givenAGregorianCalenderDate_whenConvertingToLocalDate_thenAsExpected() {
+ GregorianCalendar givenCalender = new GregorianCalendar(2018, Calendar.JULY, 28);
+
+ LocalDateTime localDateTime = subject.convertDateToLocalDate(givenCalender);
+
+ assertThat(localDateTime).isEqualTo("2018-07-28T00:00:00");
+ }
+
+ @Test
+ public void givenADate_whenConvertingToLocalDate_thenAsExpected() {
+ Date givenDate = new Date(1465817690000L);
+
+ LocalDateTime localDateTime = subject.convertDateToLocalDate(givenDate);
+
+ assertThat(localDateTime).isEqualTo("2016-06-13T13:34:50");
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
index f9b4008888..4a39f6056e 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
@@ -7,13 +7,14 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
+import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
public class UseZonedDateTimeUnitTest {
- UseZonedDateTime zonedDateTime = new UseZonedDateTime();
+ private UseZonedDateTime zonedDateTime = new UseZonedDateTime();
@Test
public void givenZoneId_thenZonedDateTime() {
@@ -22,6 +23,13 @@ public class UseZonedDateTimeUnitTest {
Assert.assertEquals(zoneId, ZoneId.from(zonedDatetime));
}
+ @Test
+ public void whenRequestingZones_thenAtLeastOneIsReturned() {
+ Set allZoneIds = ZoneId.getAvailableZoneIds();
+
+ assertThat(allZoneIds.size()).isGreaterThan(1);
+ }
+
@Test
public void givenLocalDateOrZoned_whenSettingStartOfDay_thenReturnMidnightInAllCases() {
LocalDate given = LocalDate.parse("2018-06-23");
@@ -42,4 +50,15 @@ public class UseZonedDateTimeUnitTest {
assertThat(startOfOfDayWithMethod.toLocalTime()
.toString()).isEqualTo("00:00");
}
+
+ @Test
+ public void givenAStringWithTimeZone_whenParsing_thenEqualsExpected() {
+ ZonedDateTime resultFromString = zonedDateTime.getZonedDateTimeUsingParseMethod("2015-05-03T10:15:30+01:00[Europe/Paris]");
+ ZonedDateTime resultFromLocalDateTime = ZonedDateTime.of(2015, 5, 3, 11, 15, 30, 0, ZoneId.of("Europe/Paris"));
+
+ assertThat(resultFromString.getZone()).isEqualTo(ZoneId.of("Europe/Paris"));
+ assertThat(resultFromLocalDateTime.getZone()).isEqualTo(ZoneId.of("Europe/Paris"));
+
+ assertThat(resultFromString).isEqualTo(resultFromLocalDateTime);
+ }
}
diff --git a/java-math/README.md b/java-math/README.md
index 49ff5afde1..d80a07258a 100644
--- a/java-math/README.md
+++ b/java-math/README.md
@@ -14,3 +14,5 @@ This module contains articles about math in Java.
- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging)
- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication)
+- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms)
+- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor)
diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md
index 48f9acd32d..e200c4aa03 100644
--- a/java-numbers-2/README.md
+++ b/java-numbers-2/README.md
@@ -13,4 +13,6 @@ This module contains articles about numbers in Java.
- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple)
- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
+- [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers)
+- [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range)
- More articles: [[<-- prev]](/../java-numbers)
diff --git a/java-strings-2/README.md b/java-strings-2/README.md
index 9865019f74..ced813163d 100644
--- a/java-strings-2/README.md
+++ b/java-strings-2/README.md
@@ -9,12 +9,10 @@ This module contains articles about strings in Java.
- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
- [Java – Generate Random String](https://www.baeldung.com/java-random-string)
- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
-- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array)
- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string)
- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
-- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
@@ -26,5 +24,4 @@ This module contains articles about strings in Java.
- [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring)
- [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string)
- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
-- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
- More articles: [[<-- prev>]](/java-strings) [[next -->]](/java-strings-3)
diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md
index 3b00cd11ed..1300cf028e 100644
--- a/java-strings-ops/README.md
+++ b/java-strings-ops/README.md
@@ -14,5 +14,3 @@ This module contains articles about operations on strings in Java.
- [Split a String in Java](https://www.baeldung.com/java-split-string)
- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
- [Java toString() Method](https://www.baeldung.com/java-tostring)
-- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
-- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java b/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
index bebffe52f1..ad203ab348 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
@@ -8,7 +8,7 @@ package com.baeldung.string;
*
*/
public class AppendCharAtPositionX {
-
+
public String addCharUsingCharArray(String str, char ch, int position) {
validate(str, position);
int len = str.length();
@@ -30,15 +30,14 @@ public class AppendCharAtPositionX {
sb.insert(position, ch);
return sb.toString();
}
-
+
private void validate(String str, int position) {
if (str == null) {
throw new IllegalArgumentException("Str should not be null");
}
int len = str.length();
if (position < 0 || position > len) {
- throw new IllegalArgumentException("position[" + position + "] should be "
- + "in the range 0.." + len + " for string " + str);
+ throw new IllegalArgumentException("position[" + position + "] should be " + "in the range 0.." + len + " for string " + str);
}
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java b/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
index a9cc71d36a..dac0d1272e 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
@@ -12,10 +12,15 @@ class StringHelper {
}
static String removeLastCharOptional(String s) {
- return Optional.ofNullable(s).filter(str -> str.length() != 0).map(str -> str.substring(0, str.length() - 1)).orElse(s);
+ return Optional.ofNullable(s)
+ .filter(str -> str.length() != 0)
+ .map(str -> str.substring(0, str.length() - 1))
+ .orElse(s);
}
static String removeLastCharRegexOptional(String s) {
- return Optional.ofNullable(s).map(str -> str.replaceAll(".$", "")).orElse(s);
+ return Optional.ofNullable(s)
+ .map(str -> str.replaceAll(".$", ""))
+ .orElse(s);
}
}
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
similarity index 85%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
index 4ae1f5aa83..c4e2742da6 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import java.util.concurrent.TimeUnit;
@@ -13,13 +13,11 @@ import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
-
public class Benchmarking {
public static void main(String[] args) throws RunnerException {
- Options opt = new OptionsBuilder()
- .include(Benchmarking.class.getSimpleName())
- .forks(1)
- .build();
+ Options opt = new OptionsBuilder().include(Benchmarking.class.getSimpleName())
+ .forks(1)
+ .build();
new Runner(opt).run();
}
@@ -28,45 +26,45 @@ public class Benchmarking {
public static class ExecutionPlan {
public String number = Integer.toString(Integer.MAX_VALUE);
public boolean isNumber = false;
- public IsNumeric isNumeric= new IsNumeric();
+ public IsNumeric isNumeric = new IsNumeric();
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingCoreJava(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingCoreJava(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingRegularExpressions(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingRegularExpressions(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingNumberUtils_isCreatable(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingNumberUtils_isCreatable(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingNumberUtils_isParsable(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingNumberUtils_isParsable(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingStringUtils_isNumeric(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingStringUtils_isNumeric(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingStringUtils_isNumericSpace(ExecutionPlan plan) {
diff --git a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
similarity index 89%
rename from java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
index 9462244bbb..2785df0c9b 100644
--- a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
@@ -1,14 +1,13 @@
-package com.baeldung.string.checkinputs;
+package com.baeldung.string.isnumeric;
import java.util.Scanner;
public class CheckIntegerInput {
public static void main(String[] args) {
-
try (Scanner scanner = new Scanner(System.in)) {
System.out.println("Enter an integer : ");
-
+
if (scanner.hasNextInt()) {
System.out.println("You entered : " + scanner.nextInt());
} else {
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
similarity index 88%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
index c438071e42..508cedd168 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
@@ -6,29 +6,29 @@ import org.apache.commons.lang3.math.NumberUtils;
public class IsNumeric {
public boolean usingCoreJava(String strNum) {
try {
- double d = Double.parseDouble(strNum);
+ Double.parseDouble(strNum);
} catch (NumberFormatException | NullPointerException nfe) {
return false;
}
return true;
}
-
+
public boolean usingRegularExpressions(String strNum) {
return strNum.matches("-?\\d+(\\.\\d+)?");
}
-
+
public boolean usingNumberUtils_isCreatable(String strNum) {
return NumberUtils.isCreatable(strNum);
}
-
+
public boolean usingNumberUtils_isParsable(String strNum) {
return NumberUtils.isParsable(strNum);
}
-
+
public boolean usingStringUtils_isNumeric(String strNum) {
return StringUtils.isNumeric(strNum);
}
-
+
public boolean usingStringUtils_isNumericSpace(String strNum) {
return StringUtils.isNumericSpace(strNum);
}
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
similarity index 60%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
index c0a6edae50..bb3c96c06e 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
@@ -1,34 +1,31 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import org.apache.log4j.Logger;
public class IsNumericDriver {
- private static IsNumeric isNumeric;
private static Logger LOG = Logger.getLogger(IsNumericDriver.class);
- static {
- isNumeric =new IsNumeric();
-
- }
-
+
+ private static IsNumeric isNumeric = new IsNumeric();
+
public static void main(String[] args) {
LOG.info("Testing all methods...");
-
+
boolean res = isNumeric.usingCoreJava("1001");
LOG.info("Using Core Java : " + res);
-
+
res = isNumeric.usingRegularExpressions("1001");
LOG.info("Using Regular Expressions : " + res);
-
- res =isNumeric.usingNumberUtils_isCreatable("1001");
+
+ res = isNumeric.usingNumberUtils_isCreatable("1001");
LOG.info("Using NumberUtils.isCreatable : " + res);
-
- res =isNumeric.usingNumberUtils_isParsable("1001");
+
+ res = isNumeric.usingNumberUtils_isParsable("1001");
LOG.info("Using NumberUtils.isParsable : " + res);
-
- res =isNumeric.usingStringUtils_isNumeric("1001");
+
+ res = isNumeric.usingStringUtils_isNumeric("1001");
LOG.info("Using StringUtils.isNumeric : " + res);
-
- res =isNumeric.usingStringUtils_isNumericSpace("1001");
+
+ res = isNumeric.usingStringUtils_isNumericSpace("1001");
LOG.info("Using StringUtils.isNumericSpace : " + res);
}
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
index e914a83f0e..7ab3936cb9 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
@@ -3,17 +3,20 @@ package com.baeldung.string.tostring;
public class Customer {
private String firstName;
private String lastName;
-
+
public String getFirstName() {
- return firstName;
+ return firstName;
}
+
public void setFirstName(String firstName) {
- this.firstName = firstName;
+ this.firstName = firstName;
}
+
public String getLastName() {
- return lastName;
+ return lastName;
}
+
public void setLastName(String lastName) {
- this.lastName = lastName;
+ this.lastName = lastName;
}
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
index 1736657276..391ced61d3 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
@@ -4,16 +4,17 @@ import java.util.Arrays;
public class CustomerArrayToString extends Customer {
private Order[] orders;
-
+
public Order[] getOrders() {
return orders;
}
+
public void setOrders(Order[] orders) {
this.orders = orders;
}
+
@Override
public String toString() {
- return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
- }
+ return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ }
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
index 9bede1b3fc..ae3d999b12 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
@@ -2,7 +2,7 @@ package com.baeldung.string.tostring;
public class CustomerComplexObjectToString extends Customer {
private Order order;
-
+
public Order getOrder() {
return order;
}
@@ -13,7 +13,6 @@ public class CustomerComplexObjectToString extends Customer {
@Override
public String toString() {
- return "Customer [order=" + order + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
- }
+ return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ }
}
\ No newline at end of file
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
index 86e08ca447..01fe4c8b09 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
@@ -2,18 +2,17 @@ package com.baeldung.string.tostring;
public class CustomerPrimitiveToString extends Customer {
private long balance;
-
+
public long getBalance() {
return balance;
}
-
+
public void setBalance(long balance) {
this.balance = balance;
}
-
+
@Override
public String toString() {
- return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
+ return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
}
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
index 2da1163c63..2a9e3700ec 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
@@ -4,36 +4,36 @@ import java.util.List;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-public class CustomerReflectionToString extends Customer{
+public class CustomerReflectionToString extends Customer {
private Integer score;
private List orders;
private StringBuffer fullname;
-
+
public Integer getScore() {
return score;
}
-
+
public void setScore(Integer score) {
this.score = score;
}
-
+
public List getOrders() {
return orders;
}
-
+
public void setOrders(List orders) {
this.orders = orders;
}
-
+
public StringBuffer getFullname() {
return fullname;
}
-
+
public void setFullname(StringBuffer fullname) {
this.fullname = fullname;
}
-
+
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
index 6c7b999045..b3ff97dc07 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
@@ -6,34 +6,33 @@ public class CustomerWrapperCollectionToString extends Customer {
private Integer score;
private List orders;
private StringBuffer fullname;
-
+
public Integer getScore() {
return score;
}
-
+
public void setScore(Integer score) {
this.score = score;
}
-
+
public List getOrders() {
return orders;
}
-
+
public void setOrders(List orders) {
this.orders = orders;
}
-
+
public StringBuffer getFullname() {
return fullname;
}
-
+
public void setFullname(StringBuffer fullname) {
this.fullname = fullname;
}
-
+
@Override
public String toString() {
- return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname
- + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
}
}
diff --git a/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
index 017e2d9bc8..58e0fcce5a 100644
--- a/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
@@ -1,7 +1,7 @@
package com.baeldung.string.tostring;
public class Order {
-
+
private String orderId;
private String desc;
private long value;
@@ -38,9 +38,10 @@ public class Order {
public void setStatus(String status) {
this.status = status;
}
+
@Override
public String toString() {
- return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
+ return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
}
}
diff --git a/java-strings-ops/src/main/resources/log4j.properties b/java-strings-ops/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..2ea9fa9209
--- /dev/null
+++ b/java-strings-ops/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+# Root logger option
+log4j.rootLogger=DEBUG, stdout
+
+# Redirect log messages to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
index e2dd0ac1db..d58684445b 100644
--- a/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
@@ -10,7 +10,6 @@ import org.junit.Test;
import com.google.common.base.CharMatcher;
-
/***
* Example of counting chars in a String.
*/
@@ -78,16 +77,21 @@ public class CountCharsExampleUnitTest {
@Test
public void givenString_whenUsingJava8Features_thenCountChars() {
String someString = "elephant";
- long count = someString.chars().filter(ch -> ch == 'e').count();
+ long count = someString.chars()
+ .filter(ch -> ch == 'e')
+ .count();
assertEquals(2, count);
- long count2 = someString.codePoints().filter(ch -> ch == 'e').count();
+ long count2 = someString.codePoints()
+ .filter(ch -> ch == 'e')
+ .count();
assertEquals(2, count2);
}
@Test
public void givenString_whenUsingGuavaCharMatcher_thenCountChars() {
- int count = CharMatcher.is('e').countIn("elephant");
+ int count = CharMatcher.is('e')
+ .countIn("elephant");
assertEquals(2, count);
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
index 2cdf6145d3..7c5409fe29 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
@@ -12,99 +12,99 @@ import org.junit.Test;
*
*/
public class AppendCharAtPositionXUnitTest {
-
+
private AppendCharAtPositionX appendCharAtPosition = new AppendCharAtPositionX();
private String word = "Titanc";
private char letter = 'i';
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingCharArray(word, letter, 0));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingSubstring(word, letter, 0));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 0));
}
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingCharArray(word, letter, 3));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingSubstring(word, letter, 3));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 3));
}
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingCharArray(word, letter, word.length()));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingSubstring(word, letter, word.length()));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length()));
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
}
-
+
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
index 49f2542f39..8dea72d8ca 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
@@ -1,6 +1,7 @@
package com.baeldung.string;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
+
import org.junit.Test;
public class PalindromeUnitTest {
@@ -20,9 +21,9 @@ public class PalindromeUnitTest {
"No mists or frost Simon",
"Stella won no wallets"
};
-
+
private Palindrome palindrome = new Palindrome();
-
+
@Test
public void whenWord_shouldBePalindrome() {
for (String word : words)
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java
index 6157640a4a..1936bfb6fb 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java
@@ -14,59 +14,52 @@ public class SplitUnitTest {
@Test
public void givenString_whenSplit_thenReturnsArray_through_JavaLangString() {
- assertThat("peter,james,thomas".split(","))
- .containsExactly("peter", "james", "thomas");
+ assertThat("peter,james,thomas".split(",")).containsExactly("peter", "james", "thomas");
- assertThat("car jeep scooter".split(" "))
- .containsExactly("car", "jeep", "scooter");
+ assertThat("car jeep scooter".split(" ")).containsExactly("car", "jeep", "scooter");
- assertThat("1-120-232323".split("-"))
- .containsExactly("1", "120", "232323");
+ assertThat("1-120-232323".split("-")).containsExactly("1", "120", "232323");
- assertThat("192.168.1.178".split("\\."))
- .containsExactly("192", "168", "1", "178");
+ assertThat("192.168.1.178".split("\\.")).containsExactly("192", "168", "1", "178");
- assertThat("b a, e, l.d u, n g".split("\\s+|,\\s*|\\.\\s*"))
- .containsExactly("b", "a", "e", "l", "d", "u", "n", "g");
+ assertThat("b a, e, l.d u, n g".split("\\s+|,\\s*|\\.\\s*")).containsExactly("b", "a", "e", "l", "d", "u", "n", "g");
}
@Test
public void givenString_whenSplit_thenReturnsArray_through_StringUtils() {
StringUtils.split("car jeep scooter");
- assertThat(StringUtils.split("car jeep scooter"))
- .containsExactly("car", "jeep", "scooter");
+ assertThat(StringUtils.split("car jeep scooter")).containsExactly("car", "jeep", "scooter");
- assertThat(StringUtils.split("car jeep scooter"))
- .containsExactly("car", "jeep", "scooter");
+ assertThat(StringUtils.split("car jeep scooter")).containsExactly("car", "jeep", "scooter");
- assertThat(StringUtils.split("car:jeep:scooter", ":"))
- .containsExactly("car", "jeep", "scooter");
+ assertThat(StringUtils.split("car:jeep:scooter", ":")).containsExactly("car", "jeep", "scooter");
- assertThat(StringUtils.split("car.jeep.scooter", "."))
- .containsExactly("car", "jeep", "scooter");
+ assertThat(StringUtils.split("car.jeep.scooter", ".")).containsExactly("car", "jeep", "scooter");
}
@Test
public void givenString_whenSplit_thenReturnsList_Splitter() {
- //given
- List resultList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList("car,jeep,, scooter");
+ // given
+ List resultList = Splitter.on(',')
+ .trimResults()
+ .omitEmptyStrings()
+ .splitToList("car,jeep,, scooter");
- assertThat(resultList)
- .containsExactly("car", "jeep", "scooter");
+ assertThat(resultList).containsExactly("car", "jeep", "scooter");
}
-
+
@Test
public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_Regex() {
assertThat(" car , jeep, scooter ".trim()
- .split("\\s*,\\s*")).containsExactly("car", "jeep", "scooter");
+ .split("\\s*,\\s*")).containsExactly("car", "jeep", "scooter");
}
-
+
@Test
public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_java_8() {
assertThat(Arrays.stream(" car , jeep, scooter ".split(","))
- .map(String::trim)
- .toArray(String[]::new)).containsExactly("car", "jeep", "scooter");
- }
+ .map(String::trim)
+ .toArray(String[]::new)).containsExactly("car", "jeep", "scooter");
+ }
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
index 539f66d9b4..5339a0c72e 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
@@ -1,16 +1,16 @@
package com.baeldung.string;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Objects;
+
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import java.util.Objects;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
public class StringComparisonUnitTest {
@Test
- public void whenUsingComparisonOperator_ThenComparingStrings(){
+ public void whenUsingComparisonOperator_ThenComparingStrings() {
String string1 = "using comparison operator";
String string2 = "using comparison operator";
@@ -21,7 +21,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsMethod_ThenComparingStrings(){
+ public void whenUsingEqualsMethod_ThenComparingStrings() {
String string1 = "using equals method";
String string2 = "using equals method";
@@ -37,7 +37,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsIgnoreCase_ThenComparingStrings(){
+ public void whenUsingEqualsIgnoreCase_ThenComparingStrings() {
String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";
@@ -46,7 +46,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareTo_ThenComparingStrings(){
+ public void whenUsingCompareTo_ThenComparingStrings() {
String author = "author";
String book = "book";
@@ -58,7 +58,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareToIgnoreCase_ThenComparingStrings(){
+ public void whenUsingCompareToIgnoreCase_ThenComparingStrings() {
String author = "Author";
String book = "book";
@@ -70,7 +70,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingObjectsEqualsMethod_ThenComparingStrings(){
+ public void whenUsingObjectsEqualsMethod_ThenComparingStrings() {
String string1 = "using objects equals";
String string2 = "using objects equals";
@@ -84,7 +84,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsOfApacheCommons_ThenComparingStrings(){
+ public void whenUsingEqualsOfApacheCommons_ThenComparingStrings() {
assertThat(StringUtils.equals(null, null)).isTrue();
assertThat(StringUtils.equals(null, "equals method")).isFalse();
@@ -93,7 +93,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsIgnoreCaseOfApacheCommons_ThenComparingStrings(){
+ public void whenUsingEqualsIgnoreCaseOfApacheCommons_ThenComparingStrings() {
assertThat(StringUtils.equalsIgnoreCase(null, null)).isTrue();
assertThat(StringUtils.equalsIgnoreCase(null, "equals method")).isFalse();
@@ -102,7 +102,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsAnyOf_ThenComparingStrings(){
+ public void whenUsingEqualsAnyOf_ThenComparingStrings() {
assertThat(StringUtils.equalsAny(null, null, null)).isTrue();
assertThat(StringUtils.equalsAny("equals any", "equals any", "any")).isTrue();
@@ -112,18 +112,17 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsAnyIgnoreCase_ThenComparingStrings(){
+ public void whenUsingEqualsAnyIgnoreCase_ThenComparingStrings() {
assertThat(StringUtils.equalsAnyIgnoreCase(null, null, null)).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase("equals any", "equals any", "any")).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase("equals any", null, "equals any")).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase(null, "equals", "any")).isFalse();
- assertThat(StringUtils.equalsAnyIgnoreCase(
- "equals any ignore case", "EQUALS ANY IGNORE CASE", "any")).isTrue();
+ assertThat(StringUtils.equalsAnyIgnoreCase("equals any ignore case", "EQUALS ANY IGNORE CASE", "any")).isTrue();
}
@Test
- public void whenUsingCompare_thenComparingStringsWithNulls(){
+ public void whenUsingCompare_thenComparingStringsWithNulls() {
assertThat(StringUtils.compare(null, null)).isEqualTo(0);
assertThat(StringUtils.compare(null, "abc")).isEqualTo(-1);
@@ -134,7 +133,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareIgnoreCase_ThenComparingStringsWithNulls(){
+ public void whenUsingCompareIgnoreCase_ThenComparingStringsWithNulls() {
assertThat(StringUtils.compareIgnoreCase(null, null)).isEqualTo(0);
assertThat(StringUtils.compareIgnoreCase(null, "abc")).isEqualTo(-1);
@@ -145,7 +144,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareWithNullIsLessOption_ThenComparingStrings(){
+ public void whenUsingCompareWithNullIsLessOption_ThenComparingStrings() {
assertThat(StringUtils.compare(null, "abc", true)).isEqualTo(-1);
assertThat(StringUtils.compare(null, "abc", false)).isEqualTo(1);
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
index 917ed1c937..eb86e84905 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.string;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
public class StringHelperUnitTest {
public static final String TEST_STRING = "abcdef";
diff --git a/java-strings-ops/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
similarity index 89%
rename from java-strings-ops/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
index 808d3c45b0..6228fdb5af 100644
--- a/java-strings-ops/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -13,16 +13,16 @@ public class CoreJavaIsNumericUnitTest {
}
return true;
}
-
+
@Test
public void whenUsingCoreJava_thenTrue() {
// Valid Numbers
assertThat(isNumeric("22")).isTrue();
assertThat(isNumeric("5.05")).isTrue();
- assertThat(isNumeric("-200")).isTrue();
+ assertThat(isNumeric("-200")).isTrue();
assertThat(isNumeric("10.0d")).isTrue();
assertThat(isNumeric(" 22 ")).isTrue();
-
+
// Invalid Numbers
assertThat(isNumeric(null)).isFalse();
assertThat(isNumeric("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
index 467d58837a..346248cb40 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -17,7 +17,7 @@ public class NumberUtilsIsCreatableUnitTest {
assertThat(NumberUtils.isCreatable("0xFF")).isTrue();
assertThat(NumberUtils.isCreatable("07")).isTrue();
assertThat(NumberUtils.isCreatable("2.99e+8")).isTrue();
-
+
// Invalid Numbers
assertThat(NumberUtils.isCreatable(null)).isFalse();
assertThat(NumberUtils.isCreatable("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
index 141a761158..fa2f2aec6d 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -13,7 +13,7 @@ public class NumberUtilsIsParsableUnitTest {
assertThat(NumberUtils.isParsable("-23")).isTrue();
assertThat(NumberUtils.isParsable("2.2")).isTrue();
assertThat(NumberUtils.isParsable("09")).isTrue();
-
+
// Invalid Numbers
assertThat(NumberUtils.isParsable(null)).isFalse();
assertThat(NumberUtils.isParsable("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
similarity index 91%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
index c3aa43ac94..0f7f0eb081 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -8,14 +8,14 @@ public class RegularExpressionsUnitTest {
public static boolean isNumeric(String strNum) {
return strNum.matches("-?\\d+(\\.\\d+)?");
}
-
+
@Test
public void whenUsingRegularExpressions_thenTrue() {
// Valid Numbers
assertThat(isNumeric("22")).isTrue();
assertThat(isNumeric("5.05")).isTrue();
assertThat(isNumeric("-200")).isTrue();
-
+
// Invalid Numbers
assertThat(isNumeric("abc")).isFalse();
}
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
similarity index 94%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
index 135780d9ad..05651cc567 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
+
+import static org.assertj.core.api.Assertions.assertThat;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
public class StringUtilsIsNumericSpaceUnitTest {
@Test
@@ -13,7 +14,7 @@ public class StringUtilsIsNumericSpaceUnitTest {
assertThat(StringUtils.isNumericSpace("")).isTrue();
assertThat(StringUtils.isNumericSpace(" ")).isTrue();
assertThat(StringUtils.isNumericSpace("12 3")).isTrue();
-
+
// Invalid Numbers
assertThat(StringUtils.isNumericSpace(null)).isFalse();
assertThat(StringUtils.isNumericSpace("ab2c")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
index b667dda906..cae08874da 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
+
+import static org.assertj.core.api.Assertions.assertThat;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
public class StringUtilsIsNumericUnitTest {
@Test
@@ -11,7 +12,7 @@ public class StringUtilsIsNumericUnitTest {
assertThat(StringUtils.isNumeric("123")).isTrue();
assertThat(StringUtils.isNumeric("١٢٣")).isTrue();
assertThat(StringUtils.isNumeric("१२३")).isTrue();
-
+
// Invalid Numbers
assertThat(StringUtils.isNumeric(null)).isFalse();
assertThat(StringUtils.isNumeric("")).isFalse();
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
index 9a88416179..ced8b15f2e 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
@@ -5,21 +5,20 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class CustomerArrayToStringUnitTest {
- private static final String CUSTOMER_ARRAY_TO_STRING
- = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
+ private static final String CUSTOMER_ARRAY_TO_STRING = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
@Test
public void givenArray_whenToString_thenCustomerDetails() {
- CustomerArrayToString customer = new CustomerArrayToString();
- customer.setFirstName("Rajesh");
- customer.setLastName("Bhojwani");
- Order[] orders = new Order[1];
- orders[0] = new Order();
- orders[0].setOrderId("A1111");
- orders[0].setDesc("Game");
- orders[0].setStatus("In-Shiping");
- customer.setOrders(orders);
-
+ CustomerArrayToString customer = new CustomerArrayToString();
+ customer.setFirstName("Rajesh");
+ customer.setLastName("Bhojwani");
+ Order[] orders = new Order[1];
+ orders[0] = new Order();
+ orders[0].setOrderId("A1111");
+ orders[0].setDesc("Game");
+ orders[0].setStatus("In-Shiping");
+ customer.setOrders(orders);
+
assertEquals(CUSTOMER_ARRAY_TO_STRING, customer.toString());
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
index 5ffb0d0e58..564fde8766 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
@@ -5,20 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class CustomerComplexObjectToStringUnitTest {
- private static final String CUSTOMER_COMPLEX_TO_STRING
- = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
+ private static final String CUSTOMER_COMPLEX_TO_STRING = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
@Test
public void givenComplex_whenToString_thenCustomerDetails() {
CustomerComplexObjectToString customer = new CustomerComplexObjectToString();
customer.setFirstName("Rajesh");
customer.setLastName("Bhojwani");
- Order order = new Order();
+ Order order = new Order();
order.setOrderId("A1111");
order.setDesc("Game");
order.setStatus("In-Shiping");
customer.setOrder(order);
-
+
assertEquals(CUSTOMER_COMPLEX_TO_STRING, customer.toString());
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
index d43733bc60..f585a8a26c 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
@@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test;
public class CustomerPrimitiveToStringUnitTest {
- private static final String CUSTOMER_PRIMITIVE_TO_STRING
- = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]";
+ private static final String CUSTOMER_PRIMITIVE_TO_STRING = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]";
@Test
public void givenPrimitive_whenToString_thenCustomerDetails() {
@@ -15,8 +14,7 @@ public class CustomerPrimitiveToStringUnitTest {
customer.setFirstName("Rajesh");
customer.setLastName("Bhojwani");
customer.setBalance(110);
-
+
assertEquals(CUSTOMER_PRIMITIVE_TO_STRING, customer.toString());
}
}
-
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
index e04512ff75..9b3f8a1a6f 100644
--- a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
@@ -8,26 +8,25 @@ import java.util.List;
import org.junit.jupiter.api.Test;
public class CustomerWrapperCollectionToStringUnitTest {
- private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING
- = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
+ private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
@Test
public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() {
- CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
- customer.setFirstName("Rajesh");
- customer.setLastName("Bhojwani");
- customer.setScore(8);
-
- List orders = new ArrayList();
- orders.add("Book");
- orders.add("Pen");
- customer.setOrders(orders);
-
- StringBuffer fullname = new StringBuffer();
- fullname.append(customer.getLastName()+", "+ customer.getFirstName());
- customer.setFullname(fullname);
-
- assertEquals(CUSTOMER_WRAPPER_COLLECTION_TO_STRING, customer.toString());
+ CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
+ customer.setFirstName("Rajesh");
+ customer.setLastName("Bhojwani");
+ customer.setScore(8);
+
+ List orders = new ArrayList();
+ orders.add("Book");
+ orders.add("Pen");
+ customer.setOrders(orders);
+
+ StringBuffer fullname = new StringBuffer();
+ fullname.append(customer.getLastName() + ", " + customer.getFirstName());
+ customer.setFullname(fullname);
+
+ assertEquals(CUSTOMER_WRAPPER_COLLECTION_TO_STRING, customer.toString());
}
}
diff --git a/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
index 4bbf63f87e..ca56d5aab5 100644
--- a/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
@@ -1,7 +1,8 @@
package com.baeldung.stringpool;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.Test;
-import static org.assertj.core.api.Assertions.*;
public class StringPoolUnitTest {
diff --git a/java-strings/README.md b/java-strings/README.md
index 3146b54fa8..17b74231a4 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -4,12 +4,9 @@ This module contains articles about strings in Java.
### Relevant Articles:
- [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings)
-- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
-- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
- [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords)
- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
-- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
diff --git a/jaxb/README.md b/jaxb/README.md
index aca078af15..d9d16ab70b 100644
--- a/jaxb/README.md
+++ b/jaxb/README.md
@@ -4,3 +4,5 @@ This module contains articles about JAXB.
### Relevant Articles:
- [Guide to JAXB](https://www.baeldung.com/jaxb)
+- [Unmarshalling Dates Using JAXB](https://www.baeldung.com/jaxb-unmarshalling-dates)
+
diff --git a/jersey/README.md b/jersey/README.md
index 09de7051ca..8537e07358 100644
--- a/jersey/README.md
+++ b/jersey/README.md
@@ -9,3 +9,5 @@ This module contains articles about Jersey.
- [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response)
- [Exploring the Jersey Test Framework](https://www.baeldung.com/jersey-test)
- [Explore Jersey Request Parameters](https://www.baeldung.com/jersey-request-parameters)
+- [Add a Header to a Jersey SSE Client Request](https://www.baeldung.com/jersey-sse-client-request-headers)
+
diff --git a/jhipster-5/bookstore-monolith/README.md b/jhipster-5/bookstore-monolith/README.md
index 0537f5b1a5..e4e69b83ac 100644
--- a/jhipster-5/bookstore-monolith/README.md
+++ b/jhipster-5/bookstore-monolith/README.md
@@ -1,3 +1,5 @@
## Relevant articles:
- [Creating New APIs and Views in JHipster](https://www.baeldung.com/jhipster-new-apis-and-views)
+- [JHipster Authentication with an External Service](https://www.baeldung.com/jhipster-authentication-external-service)
+
diff --git a/kotlin-libraries-2/README.md b/kotlin-libraries-2/README.md
index 188f99dc16..4064ef67d8 100644
--- a/kotlin-libraries-2/README.md
+++ b/kotlin-libraries-2/README.md
@@ -6,4 +6,6 @@ This module contains articles about Kotlin Libraries.
- [Jackson Support for Kotlin](https://www.baeldung.com/jackson-kotlin)
- [Introduction to RxKotlin](https://www.baeldung.com/rxkotlin)
+- [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk)
+- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
- More articles: [[<-- prev]](/kotlin-libraries)
diff --git a/kotlin-libraries-2/pom.xml b/kotlin-libraries-2/pom.xml
index 14ac61a093..518142403e 100644
--- a/kotlin-libraries-2/pom.xml
+++ b/kotlin-libraries-2/pom.xml
@@ -28,9 +28,30 @@
junit
test
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.jetbrains.kotlinx
+ kotlinx-collections-immutable
+ ${kotlinx-collections-immutable.version}
+
+
+
+ io.mockk
+ mockk
+ ${mockk.version}
+ test
+
+ 27.1-jre
+ 1.9.3
+ 0.1
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/KotlinxImmutablesUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/kotlin/immutable/ReadOnlyUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/AnnotationMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/BasicMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/HierarchicalMockKUnitTest.kt
diff --git a/kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt b/kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/TestableService.kt
similarity index 100%
rename from kotlin-libraries/src/test/kotlin/com/baeldung/mockk/TestableService.kt
rename to kotlin-libraries-2/src/test/kotlin/com/baeldung/mockk/TestableService.kt
diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md
index e4b0a35d28..99a57c8293 100644
--- a/kotlin-libraries/README.md
+++ b/kotlin-libraries/README.md
@@ -14,6 +14,4 @@ This module contains articles about Kotlin Libraries.
- [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow)
- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor)
- [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert)
-- [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk)
-- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections)
- More articles: [[next -->]](/kotlin-libraries-2)
diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml
index 5299b5029e..7099166674 100644
--- a/kotlin-libraries/pom.xml
+++ b/kotlin-libraries/pom.xml
@@ -129,25 +129,7 @@
test
-
- com.google.guava
- guava
- ${guava.version}
-
-
-
- org.jetbrains.kotlinx
- kotlinx-collections-immutable
- ${kotlinx-collections-immutable.version}
-
-
-
- io.mockk
- mockk
- ${mockk.version}
- test
-
net.bytebuddy
byte-buddy
@@ -185,13 +167,10 @@
5.2.0
3.10.0
0.10.4
- 1.9.3
- 27.1-jre
3.3.0
1.8.13
2.6
2.3.0
- 0.1
0.7.3
diff --git a/libraries-primitive/README.MD b/libraries-primitive/README.MD
index f27fb73dd6..086cdc0d2d 100644
--- a/libraries-primitive/README.MD
+++ b/libraries-primitive/README.MD
@@ -1,3 +1,5 @@
### Relevant Articles
- [Guide to FastUtil](https://www.baeldung.com/fastutil)
+- [Primitive Collections in Eclipse Collections](https://www.baeldung.com/java-eclipse-primitive-collections)
+
diff --git a/mapstruct/README.md b/mapstruct/README.md
index b784820b98..be02c1186b 100644
--- a/mapstruct/README.md
+++ b/mapstruct/README.md
@@ -4,3 +4,5 @@ This module contains articles about MapStruct.
###Relevant Articles:
- [Quick Guide to MapStruct](https://www.baeldung.com/mapstruct)
+- [Custom Mapper with MapStruct](https://www.baeldung.com/mapstruct-custom-mapper)
+
diff --git a/metrics/README.md b/metrics/README.md
index f27f5fb795..b8a1bf026f 100644
--- a/metrics/README.md
+++ b/metrics/README.md
@@ -7,3 +7,5 @@ This module contains articles about metrics.
- [Intro to Dropwizard Metrics](https://www.baeldung.com/dropwizard-metrics)
- [Introduction to Netflix Servo](https://www.baeldung.com/netflix-servo)
- [Quick Guide to Micrometer](https://www.baeldung.com/micrometer)
+- [@Timed Annotation Using Metrics and AspectJ](https://www.baeldung.com/timed-metrics-aspectj)
+
diff --git a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Position.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Position.java
new file mode 100644
index 0000000000..dd7694feb6
--- /dev/null
+++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Position.java
@@ -0,0 +1,51 @@
+package com.baeldung.prototype;
+
+public final class Position {
+
+ private final int x;
+ private final int y;
+
+ public Position(int x, int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + x;
+ result = prime * result + y;
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Position other = (Position) obj;
+ if (x != other.x)
+ return false;
+ if (y != other.y)
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Position [x=" + x + ", y=" + y + "]";
+ }
+
+}
diff --git a/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java
new file mode 100644
index 0000000000..f95d568647
--- /dev/null
+++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/prototype/Tree.java
@@ -0,0 +1,54 @@
+package com.baeldung.prototype;
+
+public class Tree implements Cloneable {
+
+ private double mass;
+ private double height;
+ private Position position;
+
+ public Tree(double mass, double height) {
+ this.mass = mass;
+ this.height = height;
+ }
+
+ public void setMass(double mass) {
+ this.mass = mass;
+ }
+
+ public void setHeight(double height) {
+ this.height = height;
+ }
+
+ public void setPosition(Position position) {
+ this.position = position;
+ }
+
+ public double getMass() {
+ return mass;
+ }
+
+ public double getHeight() {
+ return height;
+ }
+
+ public Position getPosition() {
+ return position;
+ }
+
+ @Override
+ public Tree clone() {
+ Tree tree = null;
+ try {
+ tree = (Tree) super.clone();
+ } catch (CloneNotSupportedException e) {
+ e.printStackTrace();
+ }
+ return tree;
+ }
+
+ @Override
+ public String toString() {
+ return "Tree [mass=" + mass + ", height=" + height + ", position=" + position + "]";
+ }
+
+}
diff --git a/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java
new file mode 100644
index 0000000000..0d06da53d6
--- /dev/null
+++ b/patterns/design-patterns-creational/src/test/java/com/baeldung/prototype/TreePrototypeUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.prototype;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class TreePrototypeUnitTest {
+
+ @Test
+ public void givenATreePrototypeWhenClonedThenCreateA_Clone() {
+ double mass = 10.0;
+ double height = 3.7;
+ Position position = new Position(3, 7);
+ Position otherPosition = new Position(4, 8);
+
+ Tree tree = new Tree(mass, height);
+ tree.setPosition(position);
+ Tree anotherTree = tree.clone();
+ anotherTree.setPosition(otherPosition);
+
+ assertEquals(position, tree.getPosition());
+ assertEquals(otherPosition, anotherTree.getPosition());
+ }
+}
diff --git a/persistence-modules/hibernate5-2/pom.xml b/persistence-modules/hibernate5-2/pom.xml
new file mode 100644
index 0000000000..ef091c331e
--- /dev/null
+++ b/persistence-modules/hibernate5-2/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+ com.baeldung
+ hibernate5-2
+ 0.1-SNAPSHOT
+ hibernate5-2
+ jar
+ Hibernate tutorial illustrating the use of named parameters
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.hibernate
+ hibernate-core
+ 5.4.7.Final
+
+
+
+ com.h2database
+ h2
+ 1.4.200
+
+
+
+
+ true
+
+
+
diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java
new file mode 100644
index 0000000000..7912659a09
--- /dev/null
+++ b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernateparameters/Event.java
@@ -0,0 +1,30 @@
+package com.baeldung.hibernateparameters;
+
+public class Event {
+ private Long id;
+
+ private String title;
+
+ public Event() {
+ }
+
+ public Event(String title) {
+ this.title = title;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ private void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml b/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml
new file mode 100644
index 0000000000..c485080879
--- /dev/null
+++ b/persistence-modules/hibernate5-2/src/main/resources/com/baeldung/hibernateparameters/Event.hbm.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml b/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml
new file mode 100644
index 0000000000..be564aaf5a
--- /dev/null
+++ b/persistence-modules/hibernate5-2/src/main/resources/hibernate.cfg.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ org.h2.Driver
+ jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1
+ sa
+
+
+ 1
+
+ org.hibernate.dialect.H2Dialect
+
+ org.hibernate.cache.internal.NoCacheProvider
+
+ true
+
+ create
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java
new file mode 100644
index 0000000000..4efa1e1f68
--- /dev/null
+++ b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernateparameters/NamedParameterUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.hibernateparameters;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistry;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.query.Query;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+public class NamedParameterUnitTest {
+ private SessionFactory sessionFactory;
+
+ @Before
+ public void setUp() throws Exception {
+ final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
+ .configure()
+ .build();
+ try {
+ sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ session.save(new Event("Event 1"));
+ session.save(new Event("Event 2"));
+ session.getTransaction().commit();
+ session.close();
+ } catch (Exception e) {
+ fail(e);
+ StandardServiceRegistryBuilder.destroy(registry);
+ }
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ if (sessionFactory != null) {
+ sessionFactory.close();
+ }
+ }
+
+ @Test
+ public void whenNamedParameterProvided_thenCorrect() {
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
+
+ // This binds the value "Event1" to the parameter :eventTitle
+ query.setParameter("eventTitle", "Event 1");
+
+ assertEquals(1, query.list().size());
+ session.getTransaction().commit();
+ session.close();
+ }
+
+ @Test(expected = org.hibernate.QueryException.class)
+ public void whenNamedParameterMissing_thenThrowsQueryException() {
+ Session session = sessionFactory.openSession();
+ session.beginTransaction();
+ Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class);
+
+ try {
+ query.list();
+ fail("We are expecting an exception!");
+ } finally {
+ session.getTransaction().commit();
+ session.close();
+ }
+ }
+}
diff --git a/persistence-modules/java-jpa-2/pom.xml b/persistence-modules/java-jpa-2/pom.xml
index 790c4a07df..2488c5ccdf 100644
--- a/persistence-modules/java-jpa-2/pom.xml
+++ b/persistence-modules/java-jpa-2/pom.xml
@@ -1,5 +1,4 @@
-
4.0.0
java-jpa-2
@@ -49,6 +48,13 @@
${postgres.version}
runtime
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
@@ -108,6 +114,7 @@
2.7.4-RC1
42.2.5
2.2
+ 3.11.1
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/AllergensAsEntity.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/AllergensAsEntity.java
new file mode 100644
index 0000000000..e5e228d013
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/AllergensAsEntity.java
@@ -0,0 +1,73 @@
+package com.baeldung.jpa.multipletables.multipleentities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+import com.baeldung.jpa.multipletables.secondarytable.MealAsSingleEntity;
+
+@Entity
+@Table(name = "allergens")
+public class AllergensAsEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "meal_id")
+ private Long mealId;
+
+ @OneToOne
+ @PrimaryKeyJoinColumn(name = "meal_id")
+ private MealAsSingleEntity meal;
+
+ @Column(name = "peanuts")
+ private boolean peanuts;
+
+ @Column(name = "celery")
+ private boolean celery;
+
+ @Column(name = "sesame_seeds")
+ private boolean sesameSeeds;
+
+ public MealAsSingleEntity getMeal() {
+ return meal;
+ }
+
+ public void setMeal(MealAsSingleEntity meal) {
+ this.meal = meal;
+ }
+
+ public boolean isPeanuts() {
+ return peanuts;
+ }
+
+ public void setPeanuts(boolean peanuts) {
+ this.peanuts = peanuts;
+ }
+
+ public boolean isCelery() {
+ return celery;
+ }
+
+ public void setCelery(boolean celery) {
+ this.celery = celery;
+ }
+
+ public boolean isSesameSeeds() {
+ return sesameSeeds;
+ }
+
+ public void setSesameSeeds(boolean sesameSeeds) {
+ this.sesameSeeds = sesameSeeds;
+ }
+
+ @Override
+ public String toString() {
+ return "AllergensAsEntity [peanuts=" + peanuts + ", celery=" + celery + ", sesameSeeds=" + sesameSeeds + "]";
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/MealWithMultipleEntities.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/MealWithMultipleEntities.java
new file mode 100644
index 0000000000..74105f8f1f
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/multipleentities/MealWithMultipleEntities.java
@@ -0,0 +1,75 @@
+package com.baeldung.jpa.multipletables.multipleentities;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "meal")
+public class MealWithMultipleEntities {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "description")
+ private String description;
+
+ @Column(name = "price")
+ private BigDecimal price;
+
+ @OneToOne(mappedBy = "meal")
+ private AllergensAsEntity allergens;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public AllergensAsEntity getAllergens() {
+ return allergens;
+ }
+
+ public void setAllergens(AllergensAsEntity allergens) {
+ this.allergens = allergens;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "MealWithMultipleEntities [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", allergens=" + allergens + "]";
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/MealAsSingleEntity.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/MealAsSingleEntity.java
new file mode 100644
index 0000000000..2929f391a4
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/MealAsSingleEntity.java
@@ -0,0 +1,99 @@
+package com.baeldung.jpa.multipletables.secondarytable;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "meal")
+@SecondaryTable(name = "allergens", pkJoinColumns = @PrimaryKeyJoinColumn(name = "meal_id"))
+public class MealAsSingleEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "description")
+ private String description;
+
+ @Column(name = "price")
+ private BigDecimal price;
+
+ @Column(name = "peanuts", table = "allergens")
+ private boolean peanuts;
+
+ @Column(name = "celery", table = "allergens")
+ private boolean celery;
+
+ @Column(name = "sesame_seeds", table = "allergens")
+ private boolean sesameSeeds;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public boolean isPeanuts() {
+ return peanuts;
+ }
+
+ public void setPeanuts(boolean peanuts) {
+ this.peanuts = peanuts;
+ }
+
+ public boolean isCelery() {
+ return celery;
+ }
+
+ public void setCelery(boolean celery) {
+ this.celery = celery;
+ }
+
+ public boolean isSesameSeeds() {
+ return sesameSeeds;
+ }
+
+ public void setSesameSeeds(boolean sesameSeeds) {
+ this.sesameSeeds = sesameSeeds;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "MealAsSingleEntity [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", peanuts=" + peanuts + ", celery=" + celery + ", sesameSeeds=" + sesameSeeds + "]";
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/AllergensAsEmbeddable.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/AllergensAsEmbeddable.java
new file mode 100644
index 0000000000..1c1f05890b
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/AllergensAsEmbeddable.java
@@ -0,0 +1,47 @@
+package com.baeldung.jpa.multipletables.secondarytable.embeddable;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class AllergensAsEmbeddable {
+
+ @Column(name = "peanuts", table = "allergens")
+ private boolean peanuts;
+
+ @Column(name = "celery", table = "allergens")
+ private boolean celery;
+
+ @Column(name = "sesame_seeds", table = "allergens")
+ private boolean sesameSeeds;
+
+ public boolean isPeanuts() {
+ return peanuts;
+ }
+
+ public void setPeanuts(boolean peanuts) {
+ this.peanuts = peanuts;
+ }
+
+ public boolean isCelery() {
+ return celery;
+ }
+
+ public void setCelery(boolean celery) {
+ this.celery = celery;
+ }
+
+ public boolean isSesameSeeds() {
+ return sesameSeeds;
+ }
+
+ public void setSesameSeeds(boolean sesameSeeds) {
+ this.sesameSeeds = sesameSeeds;
+ }
+
+ @Override
+ public String toString() {
+ return "AllergensAsEmbeddable [peanuts=" + peanuts + ", celery=" + celery + ", sesameSeeds=" + sesameSeeds + "]";
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/MealWithEmbeddedAllergens.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/MealWithEmbeddedAllergens.java
new file mode 100644
index 0000000000..87a83157d7
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/multipletables/secondarytable/embeddable/MealWithEmbeddedAllergens.java
@@ -0,0 +1,78 @@
+package com.baeldung.jpa.multipletables.secondarytable.embeddable;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "meal")
+@SecondaryTable(name = "allergens", pkJoinColumns = @PrimaryKeyJoinColumn(name = "meal_id"))
+public class MealWithEmbeddedAllergens {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+
+ @Column(name = "name")
+ private String name;
+
+ @Column(name = "description")
+ private String description;
+
+ @Column(name = "price")
+ private BigDecimal price;
+
+ @Embedded
+ private AllergensAsEmbeddable allergens;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public AllergensAsEmbeddable getAllergens() {
+ return allergens;
+ }
+
+ public void setAllergens(AllergensAsEmbeddable allergens) {
+ this.allergens = allergens;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "MealWithEmbeddedAllergens [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", allergens=" + allergens + "]";
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java
new file mode 100644
index 0000000000..8bea8e0121
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/Exam.java
@@ -0,0 +1,103 @@
+package com.baeldung.jpa.text;
+
+import javax.persistence.*;
+
+@Entity
+public class Exam {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+ @Lob
+ private String description;
+ @Column(columnDefinition = "text")
+ private String text;
+ @Column(length = 20)
+ private String shortText;
+
+ public Exam() {
+
+ }
+
+ public Exam(String description, String text, String shortText) {
+ this.description = description;
+ this.text = text;
+ this.shortText = shortText;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getShortText() {
+ return shortText;
+ }
+
+ public void setShortText(String shortText) {
+ this.shortText = shortText;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((description == null) ? 0 : description.hashCode());
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ result = prime * result + ((shortText == null) ? 0 : shortText.hashCode());
+ result = prime * result + ((text == null) ? 0 : text.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Exam other = (Exam) obj;
+ if (description == null) {
+ if (other.description != null)
+ return false;
+ } else if (!description.equals(other.description))
+ return false;
+ if (id == null) {
+ if (other.id != null)
+ return false;
+ } else if (!id.equals(other.id))
+ return false;
+ if (shortText == null) {
+ if (other.shortText != null)
+ return false;
+ } else if (!shortText.equals(other.shortText))
+ return false;
+ if (text == null) {
+ if (other.text != null)
+ return false;
+ } else if (!text.equals(other.text))
+ return false;
+ return true;
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java
new file mode 100644
index 0000000000..2ee502bf4c
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/text/ExamRepository.java
@@ -0,0 +1,39 @@
+package com.baeldung.jpa.text;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+public class ExamRepository {
+
+ private EntityManagerFactory emf = null;
+
+ public ExamRepository() {
+ emf = Persistence.createEntityManagerFactory("jpa-h2-text");
+ }
+
+ public Exam find(Long id) {
+ EntityManager entityManager = emf.createEntityManager();
+ Exam exam = entityManager.find(Exam.class, id);
+ entityManager.close();
+ return exam;
+ }
+
+ public Exam save(Exam exam) {
+
+ EntityManager entityManager = emf.createEntityManager();
+ entityManager.getTransaction()
+ .begin();
+ exam = entityManager.merge(exam);
+ entityManager.getTransaction()
+ .commit();
+ entityManager.close();
+
+ return exam;
+ }
+
+ public void clean() {
+ emf.close();
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
index 62d7ce0f5e..11e007973f 100644
--- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
+++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml
@@ -1,41 +1,150 @@
+ version="2.2">
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.queryparams.Employee
- true
-
-
-
-
-
-
-
-
-
-
-
-
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.queryparams.Employee
+ true
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.text.Exam
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.defaultvalues.User
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.querytypes.UserEntity
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.projections.Product
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.criteria.Item
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.defaultvalues.User
+ com.baeldung.jpa.multipletables.multipleentities.MealWithMultipleEntities
+ com.baeldung.jpa.multipletables.multipleentities.AllergensAsEntity
+
+ com.baeldung.jpa.multipletables.secondarytable.MealAsSingleEntity
+
+ com.baeldung.jpa.multipletables.secondarytable.embeddable.MealWithEmbeddedAllergens
+ com.baeldung.jpa.multipletables.secondarytable.embeddable.AllergensAsEmbeddable
+
true
-
+
+
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.querytypes.UserEntity
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.projections.Product
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.jpa.criteria.Item
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/multipletables/MultipleTablesIntegrationTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/multipletables/MultipleTablesIntegrationTest.java
new file mode 100644
index 0000000000..99b2cd69ee
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/multipletables/MultipleTablesIntegrationTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.jpa.multipletables;
+
+import static org.assertj.core.api.Assertions.*;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.baeldung.jpa.multipletables.multipleentities.MealWithMultipleEntities;
+import com.baeldung.jpa.multipletables.secondarytable.MealAsSingleEntity;
+import com.baeldung.jpa.multipletables.secondarytable.embeddable.MealWithEmbeddedAllergens;
+
+public class MultipleTablesIntegrationTest {
+
+ private static EntityManagerFactory emf;
+ private static EntityManager em;
+
+ @BeforeClass
+ public static void setup() {
+ emf = Persistence.createEntityManagerFactory("jpa-h2-multipltables");
+ em = emf.createEntityManager();
+ }
+
+ @Test
+ public void entityManager_shouldLoadMealAsSingleEntity() {
+ // given
+
+ // when
+ MealAsSingleEntity meal = em.find(MealAsSingleEntity.class, 1L);
+
+ // then
+ assertThat(meal).isNotNull();
+ assertThat(meal.getId()).isEqualTo(1L);
+ assertThat(meal.isPeanuts()).isFalse();
+ assertThat(meal.isCelery()).isTrue();
+ }
+
+ @Test
+ public void entityManager_shouldLoadMealWithEmbeddedAllergens() {
+ // given
+
+ // when
+ MealWithEmbeddedAllergens meal = em.find(MealWithEmbeddedAllergens.class, 1L);
+
+ // then
+ assertThat(meal).isNotNull();
+ assertThat(meal.getId()).isEqualTo(1L);
+ assertThat(meal.getAllergens()).isNotNull();
+ assertThat(meal.getAllergens().isPeanuts()).isFalse();
+ assertThat(meal.getAllergens().isCelery()).isTrue();
+ }
+
+ @Test
+ public void entityManager_shouldLoadMealWithAllergensEntity() {
+ // given
+
+ // when
+ MealWithMultipleEntities meal = em.find(MealWithMultipleEntities.class, 1L);
+
+ // then
+ assertThat(meal).isNotNull();
+ assertThat(meal.getId()).isEqualTo(1L);
+ assertThat(meal.getAllergens()).isNotNull();
+ assertThat(meal.getAllergens().isPeanuts()).isFalse();
+ assertThat(meal.getAllergens().isCelery()).isTrue();
+ }
+
+ @AfterClass
+ public static void teardown() {
+ if (emf != null) {
+ emf.close();
+ }
+ }
+
+}
diff --git a/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java
new file mode 100644
index 0000000000..f9f355c464
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/text/JPATextUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.jpa.text;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.persistence.PersistenceException;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class JPATextUnitTest {
+
+ private static ExamRepository examRepository = null;
+
+ @BeforeClass
+ public static void once() {
+ examRepository = new ExamRepository();
+ }
+
+ @Test
+ public void givenExam_whenSaveExam_thenReturnExpectedExam() {
+ Exam exam = new Exam();
+ exam.setDescription("This is a description. Sometimes the description can be very very long! ");
+ exam.setText("This is a text. Sometimes the text can be very very long!");
+ exam.setShortText("A short text");
+
+ exam = examRepository.save(exam);
+
+ assertEquals(examRepository.find(exam.getId()), exam);
+ }
+
+ @Test(expected = PersistenceException.class)
+ public void givenExamWithVeryLongShortText_whenSaveExam_thenThrowPersistenceException() {
+ Exam exam = new Exam();
+ exam.setDescription("This is a very long text");
+ exam.setText("This is a long text");
+ exam.setShortText("This is a very long long short text. Maybe this can cause problems!!");
+
+ examRepository.save(exam);
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-2/src/test/resources/multipletables.sql b/persistence-modules/java-jpa-2/src/test/resources/multipletables.sql
new file mode 100644
index 0000000000..226e63258b
--- /dev/null
+++ b/persistence-modules/java-jpa-2/src/test/resources/multipletables.sql
@@ -0,0 +1,8 @@
+drop table if exists allergens;
+drop table if exists meal;
+
+create table meal (id bigint auto_increment, name varchar(255) not null, description varchar(255) not null, price decimal(19, 2) not null, primary key (id));
+create table allergens (meal_id bigint auto_increment, peanuts number(1) not null, celery number(1) not null, sesame_seeds number(1) not null, primary key (meal_id));
+
+insert into meal (id, name, description, price) values (1, 'Pizza', 'Delicious', 5);
+insert into allergens (meal_id, peanuts, celery, sesame_seeds) values (1, 0, 1, 0);
diff --git a/persistence-modules/java-mongodb/README.md b/persistence-modules/java-mongodb/README.md
index f1542e3ee9..41d0ad63f8 100644
--- a/persistence-modules/java-mongodb/README.md
+++ b/persistence-modules/java-mongodb/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## MongoDB
+
+This module contains articles about MongoDB in Java.
+
+### Relevant articles:
- [A Guide to MongoDB with Java](http://www.baeldung.com/java-mongodb)
- [A Simple Tagging Implementation with MongoDB](http://www.baeldung.com/mongodb-tagging)
diff --git a/persistence-modules/jnosql/README.md b/persistence-modules/jnosql/README.md
index d580cbc920..cb126914e9 100644
--- a/persistence-modules/jnosql/README.md
+++ b/persistence-modules/jnosql/README.md
@@ -1,2 +1,6 @@
+## JNoSQL
+
+This module contains articles about JNoSQL.
+
### Relevant Articles:
- [A Guide to Eclipse JNoSQL](http://www.baeldung.com/eclipse-jnosql)
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 932b62a235..de20b135fa 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -23,7 +23,7 @@
hibernate5
hibernate-ogm
hibernate-mapping
- hibernate-parameters
+ hibernate5-2
influxdb
java-cassandra
java-cockroachdb
@@ -48,7 +48,9 @@
spring-data-eclipselink
spring-data-elasticsearch
spring-data-gemfire
+ spring-data-geode
spring-data-jpa
+ spring-data-jpa-3
spring-data-keyvalue
spring-data-mongodb
spring-data-neo4j
@@ -60,7 +62,7 @@
spring-jpa
spring-persistence-simple
jpa-hibernate-cascade-type
- r2dbc
+ r2dbc
spring-boot-jdbi
diff --git a/persistence-modules/sirix/README.md b/persistence-modules/sirix/README.md
index b0f6f8d04b..161e60c2cb 100644
--- a/persistence-modules/sirix/README.md
+++ b/persistence-modules/sirix/README.md
@@ -1,3 +1,5 @@
## Relevant articles:
-- [Introduction to Sirix](https://www.baeldung.com/introduction-to-sirix)
\ No newline at end of file
+- [Introduction to Sirix](https://www.baeldung.com/introduction-to-sirix)
+- [A Guide to SirixDB](https://www.baeldung.com/sirix)
+
diff --git a/persistence-modules/spring-data-geode/pom.xml b/persistence-modules/spring-data-geode/pom.xml
new file mode 100644
index 0000000000..abd3049755
--- /dev/null
+++ b/persistence-modules/spring-data-geode/pom.xml
@@ -0,0 +1,94 @@
+
+
+ 4.0.0
+ spring-data-geode
+ spring-data-geode
+ jar
+ Intro to Spring Data Geode
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ 2.1.9.RELEASE
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring-boot-version}
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
+
+
+ org.springframework.geode
+ spring-geode-starter
+ ${spring-geode-starter-version}
+
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ ${spring-boot-version}
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring-boot-version}
+ test
+
+
+
+
+ ${project.artifactId}
+
+
+ com.mysema.maven
+ maven-apt-plugin
+ 1.0
+
+
+ generate-sources
+
+ process
+
+
+ target/generated-sources
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot-version}
+
+
+
+
+
+ 2.1.9.RELEASE
+ UTF-8
+ com.baeldung.springdatageode.app.ClientCacheApp
+ 1.1.1.RELEASE
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/app/ClientCacheApp.java b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/app/ClientCacheApp.java
new file mode 100644
index 0000000000..6e9a33e953
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/app/ClientCacheApp.java
@@ -0,0 +1,32 @@
+package com.baeldung.springdatageode.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
+import org.springframework.data.gemfire.config.annotation.EnableClusterConfiguration;
+import org.springframework.data.gemfire.config.annotation.EnableContinuousQueries;
+import org.springframework.data.gemfire.config.annotation.EnableEntityDefinedRegions;
+import org.springframework.data.gemfire.config.annotation.EnableIndexing;
+import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;
+
+import com.baeldung.springdatageode.controller.AppController;
+import com.baeldung.springdatageode.domain.Author;
+import com.baeldung.springdatageode.repo.AuthorRepository;
+import com.baeldung.springdatageode.service.AuthorService;
+
+@SpringBootApplication
+@ClientCacheApplication(subscriptionEnabled = true)
+@EnableEntityDefinedRegions(basePackageClasses = Author.class)
+@EnableIndexing
+@EnableGemfireRepositories(basePackageClasses = AuthorRepository.class)
+@ComponentScan(basePackageClasses = {AppController.class, AuthorService.class})
+@EnableClusterConfiguration(useHttp = true, requireHttps=false)
+@EnableContinuousQueries
+public class ClientCacheApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ClientCacheApp.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/controller/AppController.java b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/controller/AppController.java
new file mode 100644
index 0000000000..32f931820a
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/controller/AppController.java
@@ -0,0 +1,37 @@
+package com.baeldung.springdatageode.controller;
+
+import java.util.Optional;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.springdatageode.domain.Author;
+import com.baeldung.springdatageode.repo.AuthorRepository;
+
+@RestController
+@CrossOrigin
+public class AppController {
+
+ @Autowired
+ private AuthorRepository authorRepositoryImpl;
+
+ @PostMapping(path = "/author" )
+ public ResponseEntity addAuthor(@RequestBody Author author) throws Exception {
+ authorRepositoryImpl.save(author);
+ return new ResponseEntity<>("OK", HttpStatus.OK);
+ }
+
+ @GetMapping(path = "/author" )
+ public ResponseEntity getAuthor(@RequestParam("id") String id) throws Exception {
+ Optional author = authorRepositoryImpl.findById(Long.parseLong(id));
+ return new ResponseEntity<>(author.isPresent() ? author.get() : null, HttpStatus.OK);
+ }
+
+}
diff --git a/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/domain/Author.java b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/domain/Author.java
new file mode 100644
index 0000000000..4a2e58ff34
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/domain/Author.java
@@ -0,0 +1,58 @@
+package com.baeldung.springdatageode.domain;
+
+import org.springframework.data.annotation.Id;
+import org.springframework.data.gemfire.mapping.annotation.Indexed;
+import org.springframework.data.gemfire.mapping.annotation.Region;
+
+@Region(name = "Authors")
+public class Author {
+
+ @Id
+ private Long id;
+
+ private String firstName;
+
+ private String lastName;
+
+ @Indexed
+ private int age;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return this.firstName + " " + this.lastName + ", " + this.age + " years old";
+ }
+
+}
+
diff --git a/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/repo/AuthorRepository.java b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/repo/AuthorRepository.java
new file mode 100644
index 0000000000..92f4165343
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/repo/AuthorRepository.java
@@ -0,0 +1,11 @@
+package com.baeldung.springdatageode.repo;
+
+import com.baeldung.springdatageode.domain.Author;
+
+import java.util.Optional;
+
+import org.springframework.data.repository.CrudRepository;
+
+public interface AuthorRepository extends CrudRepository {
+
+}
diff --git a/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/service/AuthorService.java b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/service/AuthorService.java
new file mode 100644
index 0000000000..1bf4cbaba1
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/java/com/baeldung/springdatageode/service/AuthorService.java
@@ -0,0 +1,14 @@
+package com.baeldung.springdatageode.service;
+
+import org.apache.geode.cache.query.CqEvent;
+import org.springframework.data.gemfire.listener.annotation.ContinuousQuery;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AuthorService {
+
+ @ContinuousQuery(query = "SELECT * FROM /Authors a WHERE a.id = 1")
+ public void process(CqEvent event) {
+ System.out.println("Author #" + event.getKey() + " updated to " + event.getNewValue());
+ }
+}
diff --git a/persistence-modules/spring-data-geode/src/main/resources/application.properties b/persistence-modules/spring-data-geode/src/main/resources/application.properties
new file mode 100644
index 0000000000..7b7cb5a37b
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/resources/application.properties
@@ -0,0 +1 @@
+server.port=9091
\ No newline at end of file
diff --git a/persistence-modules/spring-data-geode/src/main/resources/logback.xml b/persistence-modules/spring-data-geode/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-data-geode/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-3/pom.xml b/persistence-modules/spring-data-jpa-3/pom.xml
new file mode 100644
index 0000000000..f743fce2a3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/pom.xml
@@ -0,0 +1,78 @@
+
+
+
+ 4.0.0
+ spring-data-jpa-3
+ spring-data-jpa-3
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+
+
+
+
+ org.testcontainers
+ junit-jupiter
+ ${testcontainers.version}
+ test
+
+
+ org.testcontainers
+ postgresql
+ ${testcontainers.version}
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ junit
+ junit
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit.platform
+ junit-platform-launcher
+ ${junit-platform.version}
+ test
+
+
+
+
+ 1.12.2
+ 42.2.8
+
+
+
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..c0490d50c6
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/tx/Payment.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/tx/Payment.java
new file mode 100644
index 0000000000..37f3d09381
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/tx/Payment.java
@@ -0,0 +1,55 @@
+package com.baeldung.tx;
+
+import javax.persistence.*;
+
+@Entity
+public class Payment {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ private Long amount;
+
+ @Column(unique = true)
+ private String referenceNumber;
+
+ @Enumerated(EnumType.STRING)
+ private State state;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Long amount) {
+ this.amount = amount;
+ }
+
+ public String getReferenceNumber() {
+ return referenceNumber;
+ }
+
+ public void setReferenceNumber(String referenceNumber) {
+ this.referenceNumber = referenceNumber;
+ }
+
+ public State getState() {
+ return state;
+ }
+
+ public void setState(State state) {
+ this.state = state;
+ }
+
+ public enum State {
+ STARTED, FAILED, SUCCESSFUL
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/tx/ManualTransactionIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/tx/ManualTransactionIntegrationTest.java
new file mode 100644
index 0000000000..62d64d4372
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/tx/ManualTransactionIntegrationTest.java
@@ -0,0 +1,171 @@
+package com.baeldung.tx;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.DefaultTransactionDefinition;
+import org.springframework.transaction.support.TransactionCallbackWithoutResult;
+import org.springframework.transaction.support.TransactionTemplate;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import javax.persistence.EntityManager;
+
+import static java.util.Collections.singletonList;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE;
+import static org.springframework.transaction.annotation.Propagation.NOT_SUPPORTED;
+
+@DataJpaTest
+@Testcontainers
+@ActiveProfiles("test")
+@AutoConfigureTestDatabase(replace = NONE)
+@Transactional(propagation = NOT_SUPPORTED)
+class ManualTransactionIntegrationTest {
+
+ @Container
+ private static PostgreSQLContainer> pg = initPostgres();
+
+ @Autowired
+ private PlatformTransactionManager transactionManager;
+
+ @Autowired
+ private EntityManager entityManager;
+
+ private TransactionTemplate transactionTemplate;
+
+ @BeforeEach
+ void setUp() {
+ transactionTemplate = new TransactionTemplate(transactionManager);
+ }
+
+ @AfterEach
+ void flushDb() {
+ transactionTemplate.execute(status -> entityManager
+ .createQuery("delete from Payment")
+ .executeUpdate());
+ }
+
+ @Test
+ void givenAPayment_WhenNotDuplicate_ThenShouldCommit() {
+ Long id = transactionTemplate.execute(status -> {
+ Payment payment = new Payment();
+ payment.setAmount(1000L);
+ payment.setReferenceNumber("Ref-1");
+ payment.setState(Payment.State.SUCCESSFUL);
+
+ entityManager.persist(payment);
+
+ return payment.getId();
+ });
+
+ Payment payment = entityManager.find(Payment.class, id);
+ assertThat(payment).isNotNull();
+ }
+
+ @Test
+ void givenAPayment_WhenMarkAsRollback_ThenShouldRollback() {
+ transactionTemplate.execute(status -> {
+ Payment payment = new Payment();
+ payment.setAmount(1000L);
+ payment.setReferenceNumber("Ref-1");
+ payment.setState(Payment.State.SUCCESSFUL);
+
+ entityManager.persist(payment);
+ status.setRollbackOnly();
+
+ return payment.getId();
+ });
+
+ assertThat(entityManager
+ .createQuery("select p from Payment p")
+ .getResultList()).isEmpty();
+ }
+
+ @Test
+ void givenTwoPayments_WhenRefIsDuplicate_ThenShouldRollback() {
+ try {
+ transactionTemplate.execute(s -> {
+ Payment first = new Payment();
+ first.setAmount(1000L);
+ first.setReferenceNumber("Ref-1");
+ first.setState(Payment.State.SUCCESSFUL);
+
+ Payment second = new Payment();
+ second.setAmount(2000L);
+ second.setReferenceNumber("Ref-1");
+ second.setState(Payment.State.SUCCESSFUL);
+
+ entityManager.persist(first);
+ entityManager.persist(second);
+
+ return "Ref-1";
+ });
+ } catch (Exception ignored) {
+ }
+
+ assertThat(entityManager
+ .createQuery("select p from Payment p")
+ .getResultList()).isEmpty();
+ }
+
+ @Test
+ void givenAPayment_WhenNotExpectingAnyResult_ThenShouldCommit() {
+ transactionTemplate.execute(new TransactionCallbackWithoutResult() {
+ @Override
+ protected void doInTransactionWithoutResult(TransactionStatus status) {
+ Payment payment = new Payment();
+ payment.setReferenceNumber("Ref-1");
+ payment.setState(Payment.State.SUCCESSFUL);
+
+ entityManager.persist(payment);
+ }
+ });
+
+ assertThat(entityManager
+ .createQuery("select p from Payment p")
+ .getResultList()).hasSize(1);
+ }
+
+ @Test
+ void givenAPayment_WhenUsingTxManager_ThenShouldCommit() {
+ DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
+ definition.setIsolationLevel(TransactionDefinition.ISOLATION_REPEATABLE_READ);
+ definition.setTimeout(3);
+
+ TransactionStatus status = transactionManager.getTransaction(definition);
+ try {
+ Payment payment = new Payment();
+ payment.setReferenceNumber("Ref-1");
+ payment.setState(Payment.State.SUCCESSFUL);
+
+ entityManager.persist(payment);
+ transactionManager.commit(status);
+ } catch (Exception ex) {
+ transactionManager.rollback(status);
+ }
+
+ assertThat(entityManager
+ .createQuery("select p from Payment p")
+ .getResultList()).hasSize(1);
+ }
+
+ private static PostgreSQLContainer> initPostgres() {
+ PostgreSQLContainer> pg = new PostgreSQLContainer<>("postgres:11.1")
+ .withDatabaseName("baeldung")
+ .withUsername("test")
+ .withPassword("test");
+ pg.setPortBindings(singletonList("54320:5432"));
+
+ return pg;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-3/src/test/resources/application-test.properties
new file mode 100644
index 0000000000..aa7093f751
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/resources/application-test.properties
@@ -0,0 +1,4 @@
+spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:postgresql://localhost:54320/baeldung
+spring.datasource.username=test
+spring.datasource.password=test
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/FooTransactionalUnitTest.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/FooTransactionalUnitTest.java
new file mode 100644
index 0000000000..6f2a499bc5
--- /dev/null
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/FooTransactionalUnitTest.java
@@ -0,0 +1,250 @@
+package com.baeldung.persistence.service.transactional;
+
+import com.baeldung.persistence.model.Foo;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Service;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import org.springframework.transaction.IllegalTransactionStateException;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceTransactionalTestConfig.class }, loader = AnnotationConfigContextLoader.class)
+@DirtiesContext
+public class FooTransactionalUnitTest {
+
+ static abstract class BasicFooDao {
+ @PersistenceContext private EntityManager entityManager;
+
+ public Foo findOne(final long id) {
+ return entityManager.find(Foo.class, id);
+ }
+
+ public Foo create(final Foo entity) {
+ entityManager.persist(entity);
+ return entity;
+ }
+ }
+
+ @Repository
+ static class RequiredTransactionalFooDao extends BasicFooDao {
+ @Override
+ @Transactional(propagation = Propagation.REQUIRED)
+ public Foo create(Foo entity) {
+ return super.create(entity);
+ }
+ }
+
+ @Repository
+ static class RequiresNewTransactionalFooDao extends BasicFooDao {
+ @Override
+ @Transactional(propagation = Propagation.REQUIRES_NEW)
+ public Foo create(Foo entity) {
+ return super.create(entity);
+ }
+ }
+
+ @Repository
+ static class SupportTransactionalFooDao extends BasicFooDao {
+ @Override
+ @Transactional(propagation = Propagation.SUPPORTS)
+ public Foo create(Foo entity) {
+ return super.create(entity);
+ }
+ }
+
+ @Repository
+ static class MandatoryTransactionalFooDao extends BasicFooDao {
+ @Override
+ @Transactional(propagation = Propagation.MANDATORY)
+ public Foo create(Foo entity) {
+ return super.create(entity);
+ }
+ }
+
+ @Repository
+ static class SupportTransactionalFooService {
+ @Transactional(propagation = Propagation.SUPPORTS)
+ public Foo identity(Foo entity) {
+ return entity;
+ }
+ }
+
+ @Service
+ static class MandatoryTransactionalFooService {
+ @Transactional(propagation = Propagation.MANDATORY)
+ public Foo identity(Foo entity) {
+ return entity;
+ }
+ }
+
+ @Service
+ static class NotSupportedTransactionalFooService {
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
+ public Foo identity(Foo entity) {
+ return entity;
+ }
+ }
+
+ @Service
+ static class NeverTransactionalFooService {
+ @Transactional(propagation = Propagation.NEVER)
+ public Foo identity(Foo entity) {
+ return entity;
+ }
+ }
+
+ @Autowired private TransactionTemplate transactionTemplate;
+
+ @Autowired private RequiredTransactionalFooDao requiredTransactionalFooDao;
+
+ @Autowired private RequiresNewTransactionalFooDao requiresNewTransactionalFooDao;
+
+ @Autowired private SupportTransactionalFooDao supportTransactionalFooDao;
+
+ @Autowired private MandatoryTransactionalFooDao mandatoryTransactionalFooDao;
+
+ @Autowired private MandatoryTransactionalFooService mandatoryTransactionalFooService;
+
+ @Autowired private NeverTransactionalFooService neverTransactionalFooService;
+
+ @Autowired private NotSupportedTransactionalFooService notSupportedTransactionalFooService;
+
+ @Autowired private SupportTransactionalFooService supportTransactionalFooService;
+
+ @After
+ public void tearDown(){
+ PersistenceTransactionalTestConfig.clearSpy();
+ }
+
+ @Test
+ public void givenRequiredWithNoActiveTransaction_whenCallCreate_thenExpect1NewAnd0Suspend() {
+ requiredTransactionalFooDao.create(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+
+
+ @Test
+ public void givenRequiresNewWithNoActiveTransaction_whenCallCreate_thenExpect1NewAnd0Suspend() {
+ requiresNewTransactionalFooDao.create(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenSupportWithNoActiveTransaction_whenCallService_thenExpect0NewAnd0Suspend() {
+ supportTransactionalFooService.identity(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(0, transactionSpy.getCreate());
+ }
+
+ @Test(expected = IllegalTransactionStateException.class)
+ public void givenMandatoryWithNoActiveTransaction_whenCallService_thenExpectIllegalTransactionStateExceptionWith0NewAnd0Suspend() {
+ mandatoryTransactionalFooService.identity(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(0, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenNotSupportWithNoActiveTransaction_whenCallService_thenExpect0NewAnd0Suspend() {
+ notSupportedTransactionalFooService.identity(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(0, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenNeverWithNoActiveTransaction_whenCallService_thenExpect0NewAnd0Suspend() {
+ neverTransactionalFooService.identity(new Foo("baeldung"));
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(0, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenRequiredWithActiveTransaction_whenCallCreate_thenExpect0NewAnd0Suspend() {
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return requiredTransactionalFooDao.create(foo);
+ });
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenRequiresNewWithActiveTransaction_whenCallCreate_thenExpect1NewAnd1Suspend() {
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return requiresNewTransactionalFooDao.create(foo);
+ });
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(1, transactionSpy.getSuspend());
+ Assert.assertEquals(2, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenSupportWithActiveTransaction_whenCallCreate_thenExpect0NewAnd0Suspend() {
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return supportTransactionalFooDao.create(foo);
+ });
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenMandatoryWithActiveTransaction_whenCallCreate_thenExpect0NewAnd0Suspend() {
+
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return mandatoryTransactionalFooDao.create(foo);
+ });
+
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+ @Test
+ public void givenNotSupportWithActiveTransaction_whenCallCreate_thenExpect0NewAnd1Suspend() {
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return notSupportedTransactionalFooService.identity(foo);
+ });
+
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(1, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+ @Test(expected = IllegalTransactionStateException.class)
+ public void givenNeverWithActiveTransaction_whenCallCreate_thenExpectIllegalTransactionStateExceptionWith0NewAnd0Suspend() {
+ transactionTemplate.execute(status -> {
+ Foo foo = new Foo("baeldung");
+ return neverTransactionalFooService.identity(foo);
+ });
+ PersistenceTransactionalTestConfig.TransactionSynchronizationAdapterSpy transactionSpy = PersistenceTransactionalTestConfig.getSpy();
+ Assert.assertEquals(0, transactionSpy.getSuspend());
+ Assert.assertEquals(1, transactionSpy.getCreate());
+ }
+
+}
diff --git a/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/PersistenceTransactionalTestConfig.java b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/PersistenceTransactionalTestConfig.java
new file mode 100644
index 0000000000..fde1857ca2
--- /dev/null
+++ b/persistence-modules/spring-persistence-simple/src/test/java/com/baeldung/persistence/service/transactional/PersistenceTransactionalTestConfig.java
@@ -0,0 +1,148 @@
+package com.baeldung.persistence.service.transactional;
+
+import com.google.common.base.Preconditions;
+import java.util.Properties;
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.transaction.support.DefaultTransactionStatus;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.springframework.transaction.support.TransactionTemplate;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "com.baeldung.persistence","com.baeldung.jpa.dao" })
+@EnableJpaRepositories(basePackages = "com.baeldung.jpa.dao")
+public class PersistenceTransactionalTestConfig {
+
+ public static class TransactionSynchronizationAdapterSpy extends TransactionSynchronizationAdapter {
+ private int create, suspend;
+
+ public int getSuspend() {
+ return suspend;
+ }
+
+ public int getCreate() {
+ return create;
+ }
+
+ public void create() {
+ create++;
+ }
+
+ @Override
+ public void suspend() {
+ suspend++;
+ super.suspend();
+ }
+ }
+
+
+ public static class JpaTransactionManagerSpy extends JpaTransactionManager {
+ @Override
+ protected void prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition) {
+ super.prepareSynchronization(status, definition);
+ if (status.isNewTransaction()) {
+ if ( adapterSpyThreadLocal.get() == null ){
+ TransactionSynchronizationAdapterSpy spy = new TransactionSynchronizationAdapterSpy();
+ TransactionSynchronizationManager.registerSynchronization(spy);
+ adapterSpyThreadLocal.set(spy);
+ }
+ adapterSpyThreadLocal.get().create();
+ }
+ }
+ }
+
+ private static ThreadLocal adapterSpyThreadLocal = new ThreadLocal<>();
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceTransactionalTestConfig() {
+ super();
+ }
+
+ public static TransactionSynchronizationAdapterSpy getSpy(){
+ if ( adapterSpyThreadLocal.get() == null )
+ return new TransactionSynchronizationAdapterSpy();
+ return adapterSpyThreadLocal.get();
+ }
+
+ public static void clearSpy(){
+ adapterSpyThreadLocal.set(null);
+ }
+
+ // beans
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
+ final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource());
+ em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });
+
+ final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ em.setJpaVendorAdapter(vendorAdapter);
+ em.setJpaProperties(additionalProperties());
+
+ return em;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+
+
+ @Bean
+ public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
+ final JpaTransactionManagerSpy transactionManager = new JpaTransactionManagerSpy();
+ transactionManager.setEntityManagerFactory(emf);
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ final Properties additionalProperties() {
+ final Properties hibernateProperties = new Properties();
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", "false");
+ return hibernateProperties;
+ }
+
+
+ @Bean
+ public TransactionTemplate transactionTemplate(PlatformTransactionManager transactionManager){
+ TransactionTemplate template = new TransactionTemplate(transactionManager);
+ template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
+ return template;
+ }
+
+
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 12f33c5187..5404c908d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,415 +1,416 @@
- 4.0.0
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ 4.0.0
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- parent-modules
- pom
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ parent-modules
+ pom
-
-
-
- org.slf4j
- slf4j-api
- ${org.slf4j.version}
-
-
- ch.qos.logback
- logback-classic
- ${logback.version}
-
-
- ch.qos.logback
- logback-core
- ${logback.version}
-
-
- org.slf4j
- jcl-over-slf4j
- ${org.slf4j.version}
-
+
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+ org.slf4j
+ jcl-over-slf4j
+ ${org.slf4j.version}
+
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-params
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
-
-
- org.hamcrest
- hamcrest-core
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-library
- ${org.hamcrest.version}
- test
-
-
- org.hamcrest
- hamcrest-all
- ${org.hamcrest.version}
- test
-
-
- org.mockito
- mockito-core
- ${mockito.version}
- test
-
-
- org.apache.maven.surefire
- surefire-logger-api
- ${maven-surefire-plugin.version}
-
- test
- true
-
-
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-params
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-core
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-all
+ ${org.hamcrest.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+ org.apache.maven.surefire
+ surefire-logger-api
+ ${maven-surefire-plugin.version}
+
+ test
+ true
+
+
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
- maven
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
- **/JdbcTest.java
- **/*LiveTest.java
-
-
-
-
- org.junit.platform
- junit-platform-surefire-provider
- ${junit-platform.version}
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
-
- org.apache.maven.plugins
- maven-pmd-plugin
- ${maven-pmd-plugin.version}
-
-
- org.baeldung.pmd
- custom-pmd
- ${custom-pmd.version}
-
-
-
- 5
- false
- true
- true
- true
- true
- UTF-8
- ${java.version}
-
- ${tutorialsproject.basedir}/baeldung-pmd-rules.xml
-
-
- target/generated-sources
-
-
-
-
- compile
-
- check
-
-
-
-
-
- org.commonjava.maven.plugins
- directory-maven-plugin
- ${directory-maven-plugin.version}
-
-
- directories
-
- directory-of
-
- validate
-
- tutorialsproject.basedir
-
- com.baeldung
- parent-modules
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-install-plugin
- ${maven-install-plugin.version}
-
- org.baeldung.pmd
- custom-pmd
- ${custom-pmd.version}
- jar
- ${tutorialsproject.basedir}/custom-pmd-${custom-pmd.version}.jar
- true
-
-
-
- install-jar-lib
-
- install-file
-
- validate
-
-
-
-
- maven-war-plugin
- ${maven-war-plugin.version}
-
-
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ maven
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ ${junit-platform.version}
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ ${junit-jupiter.version}
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+
+
+
+ org.apache.maven.plugins
+ maven-pmd-plugin
+ ${maven-pmd-plugin.version}
+
+
+ org.baeldung.pmd
+ custom-pmd
+ ${custom-pmd.version}
+
+
+
+ 5
+ false
+ true
+ true
+ true
+ true
+ UTF-8
+ ${java.version}
+
+ ${tutorialsproject.basedir}/baeldung-pmd-rules.xml
+
+
+ target/generated-sources
+
+
+
+
+ compile
+
+ check
+
+
+
+
+
+ org.commonjava.maven.plugins
+ directory-maven-plugin
+ ${directory-maven-plugin.version}
+
+
+ directories
+
+ directory-of
+
+ validate
+
+ tutorialsproject.basedir
+
+ com.baeldung
+ parent-modules
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+ ${maven-install-plugin.version}
+
+ org.baeldung.pmd
+ custom-pmd
+ ${custom-pmd.version}
+ jar
+ ${tutorialsproject.basedir}/custom-pmd-${custom-pmd.version}.jar
+ true
+
+
+
+ install-jar-lib
+
+ install-file
+
+ validate
+
+
+
+
+ maven-war-plugin
+ ${maven-war-plugin.version}
+
+
-
-
- com.vackosar.gitflowincrementalbuilder
- gitflow-incremental-builder
- ${gitflow-incremental-builder.version}
-
-
-
-
-
-
- org.eclipse.m2e
- lifecycle-mapping
- 1.0.0
-
-
-
-
-
-
- org.commonjava.maven.plugins
-
-
- directory-maven-plugin
-
-
- [0.3.1,)
-
-
- directory-of
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
-
-
- maven-install-plugin
-
-
- [2.5.1,)
-
-
- install-file
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ com.vackosar.gitflowincrementalbuilder
+ gitflow-incremental-builder
+ ${gitflow-incremental-builder.version}
+
+
+
+
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+
+ org.commonjava.maven.plugins
+
+
+ directory-maven-plugin
+
+
+ [0.3.1,)
+
+
+ directory-of
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+
+
+ maven-install-plugin
+
+
+ [2.5.1,)
+
+
+ install-file
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
- default-first
-
-
+
+ default-first
+
+
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- SpringContextTest
- **/*UnitTest
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
- **/JdbcTest.java
- **/*LiveTest.java
-
-
-
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ SpringContextTest
+ **/*UnitTest
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/JdbcTest.java
+ **/*LiveTest.java
+
+
+
-
-
+
+
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
- akka-streams
- algorithms-genetic
- algorithms-miscellaneous-1
- algorithms-miscellaneous-2
- algorithms-miscellaneous-3
- algorithms-miscellaneous-4
- algorithms-miscellaneous-5
- algorithms-sorting
- animal-sniffer-mvn-plugin
- annotations
- antlr
- apache-avro
- apache-bval
- apache-curator
- apache-cxf
- apache-fop
- apache-geode
- apache-meecrowave
- apache-olingo/olingo2
- apache-opennlp
- apache-poi
- apache-pulsar
- apache-shiro
- apache-solrj
- apache-spark
- apache-thrift
- apache-tika
- apache-velocity
- apache-zookeeper
- asciidoctor
- asm
- atomix
- aws
- aws-lambda
- axon
- azure
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ akka-streams
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-miscellaneous-3
+ algorithms-miscellaneous-4
+ algorithms-miscellaneous-5
+ algorithms-sorting
+ animal-sniffer-mvn-plugin
+ annotations
+ antlr
+ apache-avro
+ apache-bval
+ apache-curator
+ apache-cxf
+ apache-fop
+ apache-geode
+ apache-meecrowave
+ apache-olingo/olingo2
+ apache-opennlp
+ apache-poi
+ apache-pulsar
+ apache-shiro
+ apache-solrj
+ apache-spark
+ apache-thrift
+ apache-tika
+ apache-velocity
+ apache-zookeeper
+ asciidoctor
+ asm
+ atomix
+ aws
+ aws-lambda
+ axon
+ azure
- bazel
- blade
- bootique
+ bazel
+ blade
+ bootique
- cas
- cdi
- checker-plugin
- cloud-foundry-uaa/cf-uaa-oauth2-client
- cloud-foundry-uaa/cf-uaa-oauth2-resource-server
- code-generation
+ cas
+ cdi
+ checker-plugin
+ cloud-foundry-uaa/cf-uaa-oauth2-client
+ cloud-foundry-uaa/cf-uaa-oauth2-resource-server
+ code-generation
core-groovy
- core-groovy-2
- core-groovy-collections
-
-
-
- core-java-modules/core-java-8
- core-java-modules/core-java-8-2
- core-java-modules/core-java-annotations
- core-java-modules/core-java-streams
- core-java-modules/core-java-function
- core-java-modules/core-java-lang-math
- core-java-modules/core-java-datetime
- core-java-modules/core-java-text
- core-java-modules/core-java-lambdas
+ core-groovy-2
+ core-groovy-collections
+
+
+
+ core-java-modules/core-java-8
+ core-java-modules/core-java-8-2
+ core-java-modules/core-java-annotations
+ core-java-modules/core-java-streams
+ core-java-modules/core-java-function
+ core-java-modules/core-java-lang-math
+
+
+ core-java-modules/core-java-text
+ core-java-modules/core-java-lambdas
core-java-modules/core-java-arrays
core-java-modules/core-java-arrays-2
core-java-modules/core-java-collections
- core-java-modules/core-java-collections-2
- core-java-modules/core-java-collections-3
+ core-java-modules/core-java-collections-2
+ core-java-modules/core-java-collections-3
core-java-modules/core-java-collections-list
core-java-modules/core-java-collections-list-2
core-java-modules/core-java-collections-list-3
core-java-modules/core-java-collections-array-list
core-java-modules/core-java-collections-set
core-java-modules/core-java-concurrency-basic
- core-java-modules/core-java-concurrency-basic-2
+ core-java-modules/core-java-concurrency-basic-2
core-java-modules/core-java-concurrency-collections
core-java-modules/core-java-io
core-java-modules/core-java-io-files
@@ -419,10 +420,10 @@
core-java-modules/core-java-lang-syntax
core-java-modules/core-java-lang-syntax-2
core-java-modules/core-java-lang
- core-java-modules/core-java-lang-2
+ core-java-modules/core-java-lang-2
core-java-modules/core-java-lang-oop
core-java-modules/core-java-lang-oop-2
- core-java-modules/core-java-lang-oop-3
+ core-java-modules/core-java-lang-oop-3
core-java-modules
core-java-modules/core-java-networking
core-java-modules/core-java-perf
@@ -430,6 +431,7 @@
core-java-modules/core-java-sun
core-java-modules/core-java-string-conversions
core-java-modules/core-java-string-conversions-2
+ core-java-modules/core-java-string-apis
core-java-modules/core-java
core-java-modules/core-java-jvm
core-scala
@@ -459,7 +461,766 @@
grpc
gson
guava
- guava-io
+ guava-io
+ guava-collections
+ guava-collections-map
+ guava-collections-set
+ guava-modules
+
+ guice
+
+ hazelcast
+ helidon
+ httpclient
+ httpclient-simple
+ hystrix
+
+ image-processing
+ immutables
+
+ jackson
+ jackson-2
+ jackson-simple
+ java-collections-conversions
+ java-collections-maps
+ java-collections-maps-2
+ java-jdi
+
+
+ java-lite
+ java-math
+ java-numbers
+ java-numbers-2
+ java-rmi
+ java-spi
+ java-streams
+
+ java-strings
+ java-strings-2
+ java-strings-3
+ java-strings-ops
+ java-vavr-stream
+ java-websocket
+ javafx
+ javax-servlets
+ javaxval
+ jaxb
+
+ jee-7-security
+ jee-kotlin
+ jersey
+ jgit
+ jgroups
+ jhipster-5
+ jib
+ jjwt
+ jmeter
+ jmh
+ jni
+ jooby
+ jsf
+ json
+ json-path
+ jsoup
+ jta
+
+
+ kotlin-libraries
+ kotlin-libraries-2
+
+
+ libraries
+ libraries-2
+ libraries-data
+ libraries-data-2
+ libraries-data-db
+ libraries-data-io
+ libraries-apache-commons
+ libraries-apache-commons-collections
+ libraries-apache-commons-io
+ libraries-primitive
+ libraries-testing
+ libraries-security
+ libraries-server
+ libraries-http
+ libraries-io
+ linkrest
+ logging-modules
+ lombok
+ lucene
+
+ mapstruct
+
+ maven-all/maven
+ maven-all/maven-war-plugin
+ maven-all/profiles
+ maven-all/versions-maven-plugin
+ maven-archetype
+
+ maven-polyglot/maven-polyglot-json-extension
+
+ mesos-marathon
+ metrics
+
+ microprofile
+ msf4j
+
+ mustache
+ mybatis
+
+
+ optaplanner
+ orika
+ osgi
+
+ patterns
+ pdf
+ performance-tests
+
+ protobuffer
+
+ persistence-modules
+ quarkus
+
+ rabbitmq
+
+ ratpack
+ reactor-core
+ resteasy
+ restx
+
+ rule-engines
+ rsocket
+ rxjava
+ rxjava-2
+ software-security/sql-injection-samples
+
+ tensorflow-java
+ spf4j
+ spring-boot-configuration
+ spring-boot-flowable
+ spring-boot-mvc-2
+ spring-boot-performance
+ spring-boot-properties
+
+ spring-security-kerberos
+ oauth2-framework-impl
+
+ spring-boot-nashorn
+ java-blockchain
+wildfly
+
+
+
+
+
+ default-second
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ SpringContextTest
+ **/*UnitTest
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/*JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ saas
+ spark-java
+
+ spring-4
+
+ spring-5
+ spring-5-webflux
+ spring-5-data-reactive
+ spring-5-mvc
+ spring-5-reactive
+ spring-5-reactive-2
+ spring-5-reactive-client
+ spring-5-reactive-oauth
+ spring-5-reactive-security
+ spring-5-security
+ spring-5-security-oauth
+ spring-5-security-cognito
+
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-aop
+ spring-apache-camel
+ spring-batch
+ spring-bom
+
+ spring-boot
+ spring-boot-admin
+ spring-boot-angular
+ spring-boot-autoconfiguration
+ spring-boot-bootstrap
+ spring-boot-camel
+
+ spring-boot-configuration
+ spring-boot-client
+
+ spring-boot-crud
+ spring-boot-ctx-fluent
+ spring-boot-custom-starter
+
+ spring-boot-jasypt
+ spring-boot-keycloak
+ spring-boot-kotlin
+ spring-boot-logging-log4j2
+ spring-boot-mvc
+ spring-boot-mvc-birt
+ spring-boot-environment
+ spring-boot-deployment
+ spring-boot-runtime
+ spring-boot-runtime/disabling-console-jul
+ spring-boot-runtime/disabling-console-log4j2
+ spring-boot-runtime/disabling-console-logback
+ spring-boot-artifacts
+ spring-boot-rest
+ spring-boot-data
+ spring-boot-parent
+ spring-boot-property-exp
+ spring-boot-security
+ spring-boot-testing
+ spring-boot-vue
+ spring-caching
+ spring-boot-libraries
+
+
+ spring-cloud
+ spring-cloud-bus
+
+ spring-cloud-data-flow
+
+ spring-core
+ spring-core-2
+ spring-core-3
+ spring-cucumber
+
+ spring-data-rest
+ spring-data-rest-querydsl
+ spring-dispatcher-servlet
+ spring-drools
+ spring-di
+
+ spring-ehcache
+ spring-ejb
+ spring-exceptions
+
+ spring-freemarker
+
+ spring-groovy
+
+ spring-integration
+
+ spring-jenkins-pipeline
+ spring-jersey
+ spring-jinq
+ spring-jms
+ spring-jooq
+
+ spring-kafka
+ spring-katharsis
+
+ spring-ldap
+
+ spring-mobile
+ spring-mockito
+ spring-mvc-basics-2
+ spring-mvc-forms-jsp
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-kotlin
+ spring-mvc-simple
+ spring-mvc-simple-2
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
+
+ spring-protobuf
+
+
+ spring-quartz
+
+ spring-reactive-kotlin
+ spring-reactor
+ spring-remoting
+ spring-rest
+ spring-rest-angular
+ spring-rest-compress
+ spring-rest-full
+ spring-rest-hal-browser
+ spring-rest-query-language
+ spring-rest-shell
+ spring-rest-simple
+ spring-resttemplate
+ spring-roo
+ spring-schedulingspring-security-acl
+ spring-security-angular/server
+ spring-security-cache-control
+
+ spring-security-core
+ spring-security-mvc-boot
+ spring-security-mvc-custom
+ spring-security-mvc-digest-auth
+ spring-security-mvc-jsonview
+ spring-security-mvc-ldap
+ spring-security-mvc-login
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc
+ spring-security-mvc-socket
+ spring-security-openid
+
+ spring-security-rest
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-sso
+ spring-security-stormpath
+ spring-security-thymeleaf
+ spring-security-x509
+ spring-session
+ spring-shell
+ spring-sleuth
+ spring-soap
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-static-resources
+ spring-swagger-codegen
+
+ spring-thymeleaf
+
+ spring-vault
+ spring-vertx
+
+ spring-webflux-amqp
+
+ spring-zuul
+
+ static-analysis
+ stripe
+ structurizr
+ struts-2
+
+ testing-modules
+
+ twilio
+ twitter4j
+
+ undertow
+
+ vertx
+ vertx-and-rxjava
+ video-tutorials
+ vraptor
+
+ wicket
+
+ xml
+ xstream
+
+ tensorflow-java
+ spring-boot-flowable
+ spring-security-kerberos
+
+ spring-boot-nashorn
+ java-blockchain
+
+
+
+
+
+
+ spring-context
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ **/*SpringContextIntegrationTest.java
+
+
+
+
+
+
+
+
+ spring-5
+ spring-5-data-reactive
+ spring-5-reactive
+ spring-5-reactive-2
+ spring-5-reactive-client
+ spring-5-reactive-security
+ spring-5-security
+ spring-5-security-oauth
+ spring-5-security-cognito
+ spring-activiti
+ spring-akka
+ spring-aop
+ spring-apache-camel
+ spring-batch
+ spring-bom
+ spring-boot-admin
+ spring-boot-bootstrap
+ spring-boot-bootstrap
+ spring-boot-camel
+ spring-boot-client
+ spring-boot-custom-starter
+ spring-boot-di
+ greeter-spring-boot-autoconfigure
+ greeter-spring-boot-sample-app
+ persistence-modules/spring-boot-h2/spring-boot-h2-database
+ spring-boot-jasypt
+ spring-boot-keycloak
+ spring-boot-mvc
+ spring-boot-property-exp
+ spring-boot-vue
+ spring-cloud
+ spring-cloud/spring-cloud-archaius/basic-config
+ spring-cloud/spring-cloud-archaius/extra-configs
+ spring-cloud/spring-cloud-bootstrap/config
+ spring-cloud/spring-cloud-contract
+ spring-cloud/spring-cloud-gateway
+ spring-cloud/spring-cloud-kubernetes/demo-backend
+ spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server
+ spring-cloud/spring-cloud-ribbon-client
+ spring-cloud/spring-cloud-security
+ spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit
+ spring-cloud/spring-cloud-task/springcloudtasksink
+ spring-cloud/spring-cloud-zookeeper
+ spring-cloud/spring-cloud-bus/spring-cloud-config-server
+ spring-cloud/spring-cloud-data-flow/log-sink
+ spring-cloud/spring-cloud-data-flow/time-processor
+ spring-cloud/spring-cloud-data-flow/time-source
+ spring-cucumber
+ persistence-modules/spring-data-keyvalue
+ spring-data-rest
+ spring-dispatcher-servlet
+ spring-drools
+ spring-di
+ spring-ehcache
+ spring-freemarker
+ persistence-modules/spring-hibernate-3
+ persistence-modules/spring-hibernate4
+ persistence-modules/spring-mybatis
+ spring-integration
+ spring-jenkins-pipeline
+ spring-jersey
+ spring-jinq
+ spring-jms
+ spring-kafka
+ spring-katharsis
+ spring-ldap
+ spring-mobile
+ spring-mockito
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-protobuf
+ spring-quartz
+ remoting-hessian-burlap/spring-remoting-hessian-burlap-client
+ remoting-hessian-burlap/remoting-hessian-burlap-server
+ spring-reactor
+ spring-remoting/
+ spring-remoting/remoting-http/remoting-http-server
+ spring-remoting/remoting-jms/remoting-jms-client
+ spring-remoting/remoting-rmi/remoting-rmi-server
+ spring-rest
+ spring-rest-angular
+ spring-rest-compress
+ spring-rest-full
+ spring-rest-simple
+ spring-resttemplate
+ spring-security-acl
+ spring-security-angular
+ spring-security-cache-control
+ spring-security-core
+ spring-security-mvc-boot
+ spring-security-mvc-custom
+ spring-security-mvc-digest-auth
+ spring-security-mvc-ldap
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc
+ spring-security-mvc-socket
+ spring-security-rest
+ spring-security-sso
+ spring-security-thymeleaf/spring-security-thymeleaf-authentication
+ spring-security-thymeleaf/spring-security-thymeleaf-authorize
+ spring-security-thymeleaf/spring-security-thymeleaf-config
+ spring-security-x509
+ spring-session/spring-session-jdbc
+ spring-sleuth
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-swagger-codegen/spring-swagger-codegen-app
+ spring-thymeleaf
+ spring-vault
+ spring-vertx
+ spring-zuul/spring-zuul-foos-resource
+ persistence-modules/hibernate-mapping
+ persistence-modules/spring-data-dynamodb
+ persistence-modules/spring-data-eclipselink
+ persistence-modules/spring-data-solr
+ persistence-modules/spring-hibernate-5
+
+ spring-boot-flowable
+ spring-security-kerberos
+ spring-boot-nashorn
+
+
+
+
+
+ default-heavy
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+ 3
+ true
+
+ SpringContextTest
+ **/*UnitTest
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*LongRunningUnitTest.java
+ **/*ManualTest.java
+ **/*JdbcTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ core-java-modules/core-java-concurrency-advanced
+ core-java-modules/core-java-concurrency-advanced-2
+ core-java-modules/core-java-concurrency-advanced-3
+ core-kotlin
+ core-kotlin-2
+ core-kotlin-io
+
+ jenkins/plugins
+ jhipster
+ jws
+
+ libraries
+ persistence-modules/hibernate5
+ persistence-modules/hibernate-mapping
+ persistence-modules/java-jpa
+ persistence-modules/java-jpa-2
+ persistence-modules/java-mongodb
+ persistence-modules/jnosql
+
+ vaadin
+ vavr
+
+
+
+
+ integration-lite-first
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
+
+ akka-streams
+ algorithms-genetic
+ algorithms-miscellaneous-1
+ algorithms-miscellaneous-2
+ algorithms-miscellaneous-3
+ algorithms-miscellaneous-4
+ algorithms-miscellaneous-5
+ algorithms-sorting
+ animal-sniffer-mvn-plugin
+ annotations
+ antlr
+ apache-avro
+ apache-bval
+ apache-curator
+ apache-cxf
+ apache-fop
+ apache-geode
+ apache-meecrowave
+ apache-olingo/olingo2
+ apache-opennlp
+ apache-poi
+ apache-pulsar
+ apache-shiro
+ apache-solrj
+ apache-spark
+ apache-thrift
+ apache-tika
+ apache-velocity
+ apache-zookeeper
+ asciidoctor
+ asm
+ atomix
+ aws
+ aws-lambda
+ axon
+ azure
+ bazel
+ bootique
+
+ cas
+ cdi
+ checker-plugin
+ cloud-foundry-uaa/cf-uaa-oauth2-client
+ cloud-foundry-uaa/cf-uaa-oauth2-resource-server
+ code-generation
+ core-groovy
+ core-groovy-2
+ core-groovy-collections
+
+
+ core-java-modules/core-java-8
+ core-java-modules/core-java-8-2
+ core-java-modules/core-java-annotations
+ core-java-modules/core-java-streams
+ core-java-modules/core-java-function
+ core-java-modules/core-java-lang-math
+
+
+ core-java-modules/core-java-text
+
+
+ core-java-modules/core-java-arrays
+ core-java-modules/core-java-arrays-2
+ core-java-modules/core-java-collections
+ core-java-modules/core-java-collections-2
+ core-java-modules/core-java-collections-3
+ core-java-modules/core-java-collections-list
+ core-java-modules/core-java-collections-list-2
+ core-java-modules/core-java-collections-list-3
+ core-java-modules/core-java-collections-array-list
+ core-java-modules/core-java-collections-set
+ core-java-modules/core-java-concurrency-basic
+ core-java-modules/core-java-concurrency-basic-2
+ core-java-modules/core-java-concurrency-collections
+ core-java-modules/core-java-io
+ core-java-modules/core-java-io-files
+ core-java-modules/core-java-nio
+ core-java-modules/core-java-security
+ core-java-modules/core-java-exceptions
+ core-java-modules/core-java-lang-syntax
+ core-java-modules/core-java-lang-syntax-2
+ core-java-modules/core-java-lang
+ core-java-modules/core-java-lang-2
+ core-java-modules/core-java-lang-oop
+ core-java-modules/core-java-lang-oop-2
+ core-java-modules/core-java-lang-oop-3
+ core-java-modules
+ core-java-modules/core-java-networking
+ core-java-modules/core-java-perf
+ core-java-modules/core-java-sun
+ core-java-modules/core-java-string-conversions
+ core-java-modules/core-java-string-conversions-2
+ core-java-modules/core-java-string-apis
+ core-scala
+ couchbase
+ custom-pmd
+
+ dagger
+ data-structures
+ ddd
+ deeplearning4j
+ disruptor
+ dozer
+ drools
+ dubbo
+
+ ethereum
+
+ feign
+ flyway-cdi-extension
+
+ geotools
+ google-cloud
+ google-web-toolkit
+
+
+ graphql/graphql-java
+ grpc
+ gson
+ guava
+ guava-io
guava-collections
guava-collections-map
guava-collections-set
@@ -484,10 +1245,9 @@
java-collections-maps-2
java-jdi
-
-
+ java-ee-8-security-api
java-lite
- java-math
+ java-math
java-numbers
java-numbers-2
java-rmi
@@ -506,1205 +1266,444 @@
jaxb
- jee-7-security
- jee-kotlin
- jersey
- jgit
- jgroups
- jhipster-5
- jib
- jjwt
- jmeter
- jmh
- jni
- jooby
- jsf
- json
- json-path
- jsoup
- jta
+ jee-7-security
+ jee-kotlin
+ jersey
+ jgit
+ jgroups
+ jhipster-5
+ jib
+ jjwt
+ jmeter
+ jmh
+ jni
+ jooby
+ jsf
+ json
+ json-path
+ jsoup
+ jta
-
- kotlin-libraries
- kotlin-libraries-2
+
+ kotlin-libraries
-
- libraries
- libraries-2
- libraries-data
- libraries-data-2
- libraries-data-db
+
+ libraries
+ libraries-data
+ libraries-data-2
+ libraries-data-db
libraries-data-io
libraries-apache-commons
- libraries-apache-commons-collections
- libraries-apache-commons-io
- libraries-primitive
- libraries-testing
- libraries-security
- libraries-server
- libraries-http
- libraries-io
- linkrest
- logging-modules
- lombok
- lucene
+ libraries-apache-commons-collections
+ libraries-apache-commons-io
+ libraries-testing
+ libraries-security
+ libraries-server
+ libraries-http
+ linkrest
+ logging-modules
+ lombok
+ lucene
- mapstruct
-
- maven-all/maven
- maven-all/maven-war-plugin
- maven-all/profiles
- maven-all/versions-maven-plugin
- maven-archetype
-
- maven-polyglot/maven-polyglot-json-extension
-
- mesos-marathon
- metrics
-
- microprofile
- msf4j
-
- mustache
- mybatis
+ mapstruct
+
+ maven-all/maven
+ maven-all/maven-war-plugin
+ maven-all/profiles
+ maven-all/versions-maven-plugin
+
+ maven-archetype
+
+ maven-polyglot/maven-polyglot-json-extension
+
+ mesos-marathon
+ metrics
+
+ microprofile
+ msf4j
+
+ mustache
+ mybatis
- optaplanner
- orika
- osgi
+ optaplanner
+ orika
+ osgi
- patterns
- pdf
- performance-tests
-
- protobuffer
+ patterns
+ pdf
+ performance-tests
+
+ protobuffer
- persistence-modules
- quarkus
+ persistence-modules
- rabbitmq
-
- ratpack
- reactor-core
- resteasy
- restx
-
- rule-engines
- rsocket
- rxjava
- rxjava-2
- software-security/sql-injection-samples
+ rabbitmq
+
+ ratpack
+ reactor-core
+ resteasy
+ restx
+
+ rule-engines
+ rsocket
+ rxjava
+ rxjava-2
+ oauth2-framework-impl
+ spf4j
+ spring-boot-performance
+ spring-boot-properties
+
+
- tensorflow-java
- spf4j
- spring-boot-configuration
- spring-boot-flowable
- spring-boot-mvc-2
- spring-boot-performance
- spring-boot-properties
-
+
- spring-security-kerberos
- oauth2-framework-impl
-
- spring-boot-nashorn
- java-blockchain
- wildfly
-
-
+
-
+
+ integration-lite-second
-
- default-second
-
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- SpringContextTest
- **/*UnitTest
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
- **/*JdbcTest.java
- **/*LiveTest.java
-
-
-
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
-
-
+ saas
+ spark-java
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
+ spring-4
- saas
- spark-java
+ spring-5
+ spring-5-data-reactive
+ spring-5-mvc
+ spring-5-reactive
+ spring-5-reactive-2
+ spring-5-reactive-client
+ spring-5-reactive-oauth
+ spring-5-reactive-security
+ spring-5-security
+ spring-5-security-oauth
+ spring-5-security-cognito
+ spring-activiti
+ spring-akka
+ spring-amqp
+ spring-aop
+ spring-apache-camel
+ spring-batch
+ spring-bom
- spring-4
-
- spring-5
- spring-5-webflux
- spring-5-data-reactive
- spring-5-mvc
- spring-5-reactive
- spring-5-reactive-2
- spring-5-reactive-client
- spring-5-reactive-oauth
- spring-5-reactive-security
- spring-5-security
- spring-5-security-oauth
- spring-5-security-cognito
-
- spring-activiti
- spring-akka
- spring-amqp
- spring-aop
- spring-apache-camel
- spring-batch
- spring-bom
-
- spring-boot
- spring-boot-admin
- spring-boot-angular
- spring-boot-autoconfiguration
- spring-boot-bootstrap
- spring-boot-camel
-
- spring-boot-configuration
- spring-boot-client
-
- spring-boot-crud
- spring-boot-ctx-fluent
- spring-boot-custom-starter
-
- spring-boot-jasypt
- spring-boot-keycloak
- spring-boot-kotlin
- spring-boot-logging-log4j2
- spring-boot-mvc
- spring-boot-mvc-birt
- spring-boot-environment
+ spring-boot
+ spring-boot-admin
+ spring-boot-angular
+ spring-boot-autoconfiguration
+ spring-boot-bootstrap
+ spring-boot-camel
+
+ spring-boot-client
+ spring-boot-crud
+ spring-boot-ctx-fluent
+ spring-boot-custom-starter
+
+ spring-boot-jasypt
+ spring-boot-keycloak
+ spring-boot-logging-log4j2
+ spring-boot-mvc
+ spring-boot-mvc-birt
+ spring-boot-environment
spring-boot-deployment
spring-boot-runtime
spring-boot-runtime/disabling-console-jul
spring-boot-runtime/disabling-console-log4j2
- spring-boot-runtime/disabling-console-logback
- spring-boot-artifacts
- spring-boot-rest
- spring-boot-data
- spring-boot-parent
- spring-boot-property-exp
- spring-boot-security
- spring-boot-testing
- spring-boot-vue
+ spring-boot-runtime/disabling-console-logback
+ spring-boot-artifacts
+ spring-boot-rest
+ spring-boot-data
+ spring-boot-parent
+ spring-boot-property-exp
+ spring-boot-security
+ spring-boot-vue
spring-caching
- spring-boot-libraries
+ spring-cloud
+ spring-cloud-bus
+
+ spring-cloud-data-flow
-
- spring-cloud
- spring-cloud-bus
-
- spring-cloud-data-flow
-
- spring-core
- spring-core-2
- spring-core-3
+ spring-core
+ spring-core-2
+ spring-core-3
spring-cucumber
- spring-data-rest
- spring-data-rest-querydsl
- spring-dispatcher-servlet
- spring-drools
- spring-di
+ spring-data-rest
+ spring-data-rest-querydsl
+ spring-dispatcher-servlet
+ spring-drools
+ spring-di
- spring-ehcache
- spring-ejb
- spring-exceptions
+ spring-ehcache
+ spring-ejb
+ spring-exceptions
- spring-freemarker
+ spring-freemarker
- spring-groovy
+ spring-groovy
- spring-integration
+ spring-integration
- spring-jenkins-pipeline
- spring-jersey
- spring-jinq
- spring-jms
- spring-jooq
+ spring-jenkins-pipeline
+ spring-jersey
+ spring-jinq
+ spring-jms
+ spring-jooq
- spring-kafka
- spring-katharsis
+ spring-kafka
+ spring-katharsis
- spring-ldap
+ spring-ldap
- spring-mobile
- spring-mockito
- spring-mvc-basics-2
+ spring-mobile
+ spring-mockito
+ spring-mvc-basics-2
spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-kotlin
- spring-mvc-simple
- spring-mvc-simple-2
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
+ spring-mvc-forms-thymeleaf
+ spring-mvc-java
+ spring-mvc-kotlin
+ spring-mvc-simple
+ spring-mvc-simple-2
+ spring-mvc-velocity
+ spring-mvc-webflow
+ spring-mvc-xml
- spring-protobuf
-
+ spring-protobuf
+
- spring-quartz
+ spring-quartz
- spring-reactive-kotlin
- spring-reactor
- spring-remoting
- spring-rest
- spring-rest-angular
- spring-rest-compress
- spring-rest-full
- spring-rest-hal-browser
- spring-rest-query-language
- spring-rest-shell
- spring-rest-simple
- spring-resttemplate
- spring-roo
+ spring-reactive-kotlin
+ spring-reactor
+ spring-remoting
+ spring-rest
+ spring-rest-angular
+ spring-rest-compress
+ spring-rest-full
+ spring-rest-hal-browser
+ spring-rest-query-language
+ spring-rest-shell
+ spring-rest-simple
+ spring-resttemplate
+ spring-roo
- spring-scheduling
+ spring-scheduling
spring-security-acl
- spring-security-angular/server
- spring-security-cache-control
-
- spring-security-core
- spring-security-mvc-boot
- spring-security-mvc-custom
- spring-security-mvc-digest-auth
- spring-security-mvc-jsonview
- spring-security-mvc-ldap
- spring-security-mvc-login
- spring-security-mvc-persisted-remember-me
- spring-security-mvc
- spring-security-mvc-socket
- spring-security-openid
-
- spring-security-rest
- spring-security-rest-basic-auth
- spring-security-rest-custom
- spring-security-sso
- spring-security-stormpath
- spring-security-thymeleaf
- spring-security-x509
- spring-session
+ spring-security-angular/server
+ spring-security-cache-control
+ spring-security-core
+ spring-security-mvc-boot
+ spring-security-mvc-custom
+ spring-security-mvc-digest-auth
+ spring-security-mvc-ldap
+ spring-security-mvc-login
+ spring-security-mvc-persisted-remember-me
+ spring-security-mvc
+ spring-security-mvc-socket
+ spring-security-openid
+
+ spring-security-rest
+ spring-security-rest-basic-auth
+ spring-security-rest-custom
+ spring-security-sso
+ spring-security-stormpath
+ spring-security-thymeleaf
+ spring-security-x509
+ spring-session
spring-shell
- spring-sleuth
- spring-soap
- spring-social-login
- spring-spel
- spring-state-machine
- spring-static-resources
- spring-swagger-codegen
+ spring-sleuth
+ spring-soap
+ spring-social-login
+ spring-spel
+ spring-state-machine
+ spring-static-resources
+ spring-swagger-codegen
- spring-thymeleaf
+ spring-thymeleaf
- spring-vault
- spring-vertx
+ spring-vault
+ spring-vertx
- spring-webflux-amqp
+ spring-webflux-amqp
- spring-zuul
+ spring-zuul
- static-analysis
- stripe
- structurizr
- struts-2
+ static-analysis
+ stripe
+ structurizr
+ struts-2
- testing-modules
+ testing-modules
- twilio
- twitter4j
+ twilio
+ twitter4j
- undertow
+ undertow
- vertx
- vertx-and-rxjava
- video-tutorials
- vraptor
+ vertx
+ vertx-and-rxjava
+ video-tutorials
+ vraptor
- wicket
+ wicket
- xml
- xstream
+ xml
+ xstream
+
- tensorflow-java
- spring-boot-flowable
- spring-security-kerberos
-
- spring-boot-nashorn
- java-blockchain
+
-
+
+ integration-heavy
-
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
-
- spring-context
-
-
+
+ parent-boot-1
+ parent-boot-2
+ parent-spring-4
+ parent-spring-5
+ parent-java
+ parent-kotlin
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- **/*SpringContextIntegrationTest.java
-
-
-
-
-
-
-
-
- spring-5
- spring-5-data-reactive
- spring-5-reactive
- spring-5-reactive-2
- spring-5-reactive-client
- spring-5-reactive-security
- spring-5-security
- spring-5-security-oauth
- spring-5-security-cognito
- spring-activiti
- spring-akka
- spring-aop
- spring-apache-camel
- spring-batch
- spring-bom
- spring-boot-admin
- spring-boot-bootstrap
- spring-boot-bootstrap
- spring-boot-camel
- spring-boot-client
- spring-boot-custom-starter
- spring-boot-di
- greeter-spring-boot-autoconfigure
- greeter-spring-boot-sample-app
- persistence-modules/spring-boot-h2/spring-boot-h2-database
- spring-boot-jasypt
- spring-boot-keycloak
- spring-boot-mvc
- spring-boot-property-exp
- spring-boot-vue
- spring-cloud
- spring-cloud/spring-cloud-archaius/basic-config
- spring-cloud/spring-cloud-archaius/extra-configs
- spring-cloud/spring-cloud-bootstrap/config
- spring-cloud/spring-cloud-contract
- spring-cloud/spring-cloud-gateway
- spring-cloud/spring-cloud-kubernetes/demo-backend
- spring-cloud/spring-cloud-rest/spring-cloud-rest-config-server
- spring-cloud/spring-cloud-ribbon-client
- spring-cloud/spring-cloud-security
- spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit
- spring-cloud/spring-cloud-task/springcloudtasksink
- spring-cloud/spring-cloud-zookeeper
- spring-cloud/spring-cloud-bus/spring-cloud-config-server
- spring-cloud/spring-cloud-data-flow/log-sink
- spring-cloud/spring-cloud-data-flow/time-processor
- spring-cloud/spring-cloud-data-flow/time-source
- spring-cucumber
- persistence-modules/spring-data-keyvalue
- spring-data-rest
- spring-dispatcher-servlet
- spring-drools
- spring-di
- spring-ehcache
- spring-freemarker
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate4
- persistence-modules/spring-mybatis
- spring-integration
- spring-jenkins-pipeline
- spring-jersey
- spring-jinq
- spring-jms
- spring-kafka
- spring-katharsis
- spring-ldap
- spring-mobile
- spring-mockito
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-velocity
- spring-mvc-webflow
- spring-protobuf
- spring-quartz
- remoting-hessian-burlap/spring-remoting-hessian-burlap-client
- remoting-hessian-burlap/remoting-hessian-burlap-server
- spring-reactor
- spring-remoting/
- spring-remoting/remoting-http/remoting-http-server
- spring-remoting/remoting-jms/remoting-jms-client
- spring-remoting/remoting-rmi/remoting-rmi-server
- spring-rest
- spring-rest-angular
- spring-rest-compress
- spring-rest-full
- spring-rest-simple
- spring-resttemplate
- spring-security-acl
- spring-security-angular
- spring-security-cache-control
- spring-security-core
- spring-security-mvc-boot
- spring-security-mvc-custom
- spring-security-mvc-digest-auth
- spring-security-mvc-ldap
- spring-security-mvc-persisted-remember-me
- spring-security-mvc
- spring-security-mvc-socket
- spring-security-rest
- spring-security-sso
- spring-security-thymeleaf/spring-security-thymeleaf-authentication
- spring-security-thymeleaf/spring-security-thymeleaf-authorize
- spring-security-thymeleaf/spring-security-thymeleaf-config
- spring-security-x509
- spring-session/spring-session-jdbc
- spring-sleuth
- spring-social-login
- spring-spel
- spring-state-machine
- spring-swagger-codegen/spring-swagger-codegen-app
- spring-thymeleaf
- spring-vault
- spring-vertx
- spring-zuul/spring-zuul-foos-resource
- persistence-modules/hibernate-mapping
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-eclipselink
- persistence-modules/spring-data-solr
- persistence-modules/spring-hibernate-5
-
- spring-boot-flowable
- spring-security-kerberos
- spring-boot-nashorn
-
-
-
-
-
- default-heavy
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- SpringContextTest
- **/*UnitTest
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
- **/*JdbcTest.java
- **/*LiveTest.java
-
-
-
-
-
-
-
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
- core-java-modules/core-java-concurrency-advanced
+ core-java-modules/core-java
+ core-java-modules/core-java-concurrency-advanced
core-java-modules/core-java-concurrency-advanced-2
core-java-modules/core-java-concurrency-advanced-3
core-kotlin
- core-kotlin-2
- core-kotlin-io
-
- jenkins/plugins
- jhipster
- jws
-
- libraries
- persistence-modules/hibernate5
- persistence-modules/hibernate-mapping
- persistence-modules/java-jpa
- persistence-modules/java-jpa-2
- persistence-modules/java-mongodb
- persistence-modules/jnosql
-
- vaadin
- vavr
-
-
-
-
- integration-lite-first
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
- akka-streams
- algorithms-genetic
- algorithms-miscellaneous-1
- algorithms-miscellaneous-2
- algorithms-miscellaneous-3
- algorithms-miscellaneous-4
- algorithms-miscellaneous-5
- algorithms-sorting
- animal-sniffer-mvn-plugin
- annotations
- antlr
- apache-avro
- apache-bval
- apache-curator
- apache-cxf
- apache-fop
- apache-geode
- apache-meecrowave
- apache-olingo/olingo2
- apache-opennlp
- apache-poi
- apache-pulsar
- apache-shiro
- apache-solrj
- apache-spark
- apache-thrift
- apache-tika
- apache-velocity
- apache-zookeeper
- asciidoctor
- asm
- atomix
- aws
- aws-lambda
- axon
- azure
- bazel
- bootique
-
- cas
- cdi
- checker-plugin
- cloud-foundry-uaa/cf-uaa-oauth2-client
- cloud-foundry-uaa/cf-uaa-oauth2-resource-server
- code-generation
- core-groovy
- core-groovy-2
- core-groovy-collections
-
-
- core-java-modules/core-java-8
- core-java-modules/core-java-8-2
- core-java-modules/core-java-annotations
- core-java-modules/core-java-streams
- core-java-modules/core-java-function
- core-java-modules/core-java-lang-math
- core-java-modules/core-java-datetime
- core-java-modules/core-java-text
-
-
- core-java-modules/core-java-arrays
- core-java-modules/core-java-arrays-2
- core-java-modules/core-java-collections
- core-java-modules/core-java-collections-2
- core-java-modules/core-java-collections-3
- core-java-modules/core-java-collections-list
- core-java-modules/core-java-collections-list-2
- core-java-modules/core-java-collections-list-3
- core-java-modules/core-java-collections-array-list
- core-java-modules/core-java-collections-set
- core-java-modules/core-java-concurrency-basic
- core-java-modules/core-java-concurrency-basic-2
- core-java-modules/core-java-concurrency-collections
- core-java-modules/core-java-io
- core-java-modules/core-java-io-files
- core-java-modules/core-java-nio
- core-java-modules/core-java-security
- core-java-modules/core-java-exceptions
- core-java-modules/core-java-lang-syntax
- core-java-modules/core-java-lang-syntax-2
- core-java-modules/core-java-lang
- core-java-modules/core-java-lang-2
- core-java-modules/core-java-lang-oop
- core-java-modules/core-java-lang-oop-2
- core-java-modules/core-java-lang-oop-3
- core-java-modules
- core-java-modules/core-java-networking
- core-java-modules/core-java-perf
- core-java-modules/core-java-sun
- core-java-modules/core-java-string-conversions
- core-java-modules/core-java-string-conversions-2
- core-scala
- couchbase
- custom-pmd
-
- dagger
- data-structures
- ddd
- deeplearning4j
- disruptor
- dozer
- drools
- dubbo
-
- ethereum
-
- feign
- flyway-cdi-extension
-
- geotools
- google-cloud
- google-web-toolkit
-
-
- graphql/graphql-java
- grpc
- gson
- guava
- guava-io
- guava-collections
- guava-collections-map
- guava-collections-set
- guava-modules
-
- guice
-
- hazelcast
- helidon
- httpclient
- httpclient-simple
- hystrix
-
- image-processing
- immutables
-
- jackson
- jackson-2
- jackson-simple
- java-collections-conversions
- java-collections-maps
- java-collections-maps-2
- java-jdi
-
- java-ee-8-security-api
- java-lite
- java-math
- java-numbers
- java-numbers-2
- java-rmi
- java-spi
- java-streams
-
- java-strings
- java-strings-2
- java-strings-3
- java-strings-ops
- java-vavr-stream
- java-websocket
- javafx
- javax-servlets
- javaxval
- jaxb
-
- jee-7-security
- jee-kotlin
- jersey
- jgit
- jgroups
- jhipster-5
- jib
- jjwt
- jmeter
- jmh
- jni
- jooby
- jsf
- json
- json-path
- jsoup
- jta
-
-
- kotlin-libraries
-
-
- libraries
- libraries-data
- libraries-data-2
- libraries-data-db
- libraries-data-io
- libraries-apache-commons
- libraries-apache-commons-collections
- libraries-apache-commons-io
- libraries-testing
- libraries-security
- libraries-server
- libraries-http
- linkrest
- logging-modules
- lombok
- lucene
-
- mapstruct
-
- maven-all/maven
- maven-all/maven-war-plugin
- maven-all/profiles
- maven-all/versions-maven-plugin
-
- maven-archetype
-
- maven-polyglot/maven-polyglot-json-extension
-
- mesos-marathon
- metrics
-
- microprofile
- msf4j
-
- mustache
- mybatis
-
-
- optaplanner
- orika
- osgi
-
- patterns
- pdf
- performance-tests
-
- protobuffer
-
- persistence-modules
-
- rabbitmq
-
- ratpack
- reactor-core
- resteasy
- restx
-
- rule-engines
- rsocket
- rxjava
- rxjava-2
- oauth2-framework-impl
- spf4j
- spring-boot-performance
- spring-boot-properties
-
-
-
-
-
-
-
-
- integration-lite-second
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
- saas
- spark-java
-
- spring-4
-
- spring-5
- spring-5-data-reactive
- spring-5-mvc
- spring-5-reactive
- spring-5-reactive-2
- spring-5-reactive-client
- spring-5-reactive-oauth
- spring-5-reactive-security
- spring-5-security
- spring-5-security-oauth
- spring-5-security-cognito
- spring-activiti
- spring-akka
- spring-amqp
- spring-aop
- spring-apache-camel
- spring-batch
- spring-bom
-
- spring-boot
- spring-boot-admin
- spring-boot-angular
- spring-boot-autoconfiguration
- spring-boot-bootstrap
- spring-boot-camel
-
- spring-boot-client
- spring-boot-crud
- spring-boot-ctx-fluent
- spring-boot-custom-starter
-
- spring-boot-jasypt
- spring-boot-keycloak
- spring-boot-logging-log4j2
- spring-boot-mvc
- spring-boot-mvc-birt
- spring-boot-environment
- spring-boot-deployment
- spring-boot-runtime
- spring-boot-runtime/disabling-console-jul
- spring-boot-runtime/disabling-console-log4j2
- spring-boot-runtime/disabling-console-logback
- spring-boot-artifacts
- spring-boot-rest
- spring-boot-data
- spring-boot-parent
- spring-boot-property-exp
- spring-boot-security
- spring-boot-vue
- spring-caching
- spring-cloud
- spring-cloud-bus
-
- spring-cloud-data-flow
-
- spring-core
- spring-core-2
- spring-core-3
- spring-cucumber
-
- spring-data-rest
- spring-data-rest-querydsl
- spring-dispatcher-servlet
- spring-drools
- spring-di
-
- spring-ehcache
- spring-ejb
- spring-exceptions
-
- spring-freemarker
-
- spring-groovy
-
- spring-integration
-
- spring-jenkins-pipeline
- spring-jersey
- spring-jinq
- spring-jms
- spring-jooq
-
- spring-kafka
- spring-katharsis
-
- spring-ldap
-
- spring-mobile
- spring-mockito
- spring-mvc-basics-2
- spring-mvc-forms-jsp
- spring-mvc-forms-thymeleaf
- spring-mvc-java
- spring-mvc-kotlin
- spring-mvc-simple
- spring-mvc-simple-2
- spring-mvc-velocity
- spring-mvc-webflow
- spring-mvc-xml
-
- spring-protobuf
-
-
- spring-quartz
-
- spring-reactive-kotlin
- spring-reactor
- spring-remoting
- spring-rest
- spring-rest-angular
- spring-rest-compress
- spring-rest-full
- spring-rest-hal-browser
- spring-rest-query-language
- spring-rest-shell
- spring-rest-simple
- spring-resttemplate
- spring-roo
-
- spring-scheduling
- spring-security-acl
- spring-security-angular/server
- spring-security-cache-control
- spring-security-core
- spring-security-mvc-boot
- spring-security-mvc-custom
- spring-security-mvc-digest-auth
- spring-security-mvc-ldap
- spring-security-mvc-login
- spring-security-mvc-persisted-remember-me
- spring-security-mvc
- spring-security-mvc-socket
- spring-security-openid
-
- spring-security-rest
- spring-security-rest-basic-auth
- spring-security-rest-custom
- spring-security-sso
- spring-security-stormpath
- spring-security-thymeleaf
- spring-security-x509
- spring-session
- spring-shell
- spring-sleuth
- spring-soap
- spring-social-login
- spring-spel
- spring-state-machine
- spring-static-resources
- spring-swagger-codegen
-
- spring-thymeleaf
-
- spring-vault
- spring-vertx
-
- spring-webflux-amqp
-
- spring-zuul
-
- static-analysis
- stripe
- structurizr
- struts-2
-
- testing-modules
-
- twilio
- twitter4j
-
- undertow
-
- vertx
- vertx-and-rxjava
- video-tutorials
- vraptor
-
- wicket
-
- xml
- xstream
-
-
-
-
-
- integration-heavy
-
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*ManualTest.java
- **/*LiveTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
-
- parent-boot-1
- parent-boot-2
- parent-spring-4
- parent-spring-5
- parent-java
- parent-kotlin
-
- core-java-modules/core-java
- core-java-modules/core-java-concurrency-advanced
- core-java-modules/core-java-concurrency-advanced-2
- core-java-modules/core-java-concurrency-advanced-3
- core-kotlin
- core-kotlin-2
-
- jenkins/plugins
- jhipster
- jws
-
- libraries
-
- persistence-modules/hibernate5
- persistence-modules/java-jpa
- persistence-modules/java-jpa-2
- persistence-modules/java-mongodb
- persistence-modules/jnosql
-
- vaadin
- vavr
-
-
-
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jxr-plugin
- ${maven-jxr-plugin.version}
-
-
-
-
-
- UTF-8
- UTF-8
- refs/remotes/origin/master
- true
- false
- false
- false
- false
-
- 4.12
- 1.3
- 2.21.0
-
-
- 1.7.21
- 1.1.7
-
-
-
- 2.21.0
- 3.7.0
- 1.6.0
- 1.8
- 1.2.17
- 1.1
- 2.1.0.1
- 1.19
- 1.19
- 1.3
- 1.6.0
- 2.21.0
- 2.5
- 2.6
- 3.5
- 1.4
- 3.0.0
- 3.1.0
- 1.2
- 2.3.1
- 1.9.13
- 1.2
- 2.9.8
- 1.3
- 1.2.0
- 5.2.0
- 0.3.1
- 2.5.1
- 0.0.1
- 3.8
- 2.3
-
- 3.8
- 1.16.12
- 1.4.197
-
+ core-kotlin-2
+
+ jenkins/plugins
+ jhipster
+ jws
+
+ libraries
+
+ persistence-modules/hibernate5
+ persistence-modules/java-jpa
+ persistence-modules/java-jpa-2
+ persistence-modules/java-mongodb
+ persistence-modules/jnosql
+
+ vaadin
+ vavr
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jxr-plugin
+ ${maven-jxr-plugin.version}
+
+
+
+
+
+ UTF-8
+ UTF-8
+ refs/remotes/origin/master
+ true
+ false
+ false
+ false
+ false
+
+ 4.12
+ 1.3
+ 2.21.0
+
+
+ 1.7.21
+ 1.1.7
+
+
+
+ 2.21.0
+ 3.7.0
+ 1.6.0
+ 1.8
+ 1.2.17
+ 1.1
+ 2.1.0.1
+ 1.19
+ 1.19
+ 1.3
+ 1.6.0
+ 2.21.0
+ 2.5
+ 2.6
+ 3.5
+ 1.4
+ 3.0.0
+ 3.1.0
+ 1.2
+ 2.3.1
+ 1.9.13
+ 1.2
+ 2.9.8
+ 1.3
+ 1.2.0
+ 5.2.0
+ 0.3.1
+ 2.5.1
+ 0.0.1
+ 3.8
+ 2.3
+
+ 3.8
+ 1.16.12
+ 1.4.197
+
diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md
index 683b493317..03bd323cb4 100644
--- a/spring-5-data-reactive/README.md
+++ b/spring-5-data-reactive/README.md
@@ -10,3 +10,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive)
- [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors)
- [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc)
+- [Spring Data Reactive Repositories with Couchbase](https://www.baeldung.com/spring-data-reactive-couchbase)
+
diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md
index 1724db9e66..221c333d5b 100644
--- a/spring-5-reactive-client/README.md
+++ b/spring-5-reactive-client/README.md
@@ -6,5 +6,6 @@ This module contains articles about reactive Spring 5 WebClient
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles
+- [Logging Spring WebClient Calls](https://www.baeldung.com/spring-log-webclient-calls)
- [Simultaneous Spring WebClient Calls](https://www.baeldung.com/spring-webclient-simultaneous-calls)
diff --git a/spring-5/README.md b/spring-5/README.md
index 7588d23304..3f839a5bca 100644
--- a/spring-5/README.md
+++ b/spring-5/README.md
@@ -15,4 +15,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring ResponseStatusException](https://www.baeldung.com/spring-response-status-exception)
- [Spring Assert Statements](https://www.baeldung.com/spring-assert)
- [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari)
-
+- [Difference between \ vs \](https://www.baeldung.com/spring-contextannotation-contextcomponentscan)
diff --git a/spring-boot-autoconfiguration/README.md b/spring-boot-autoconfiguration/README.md
index 67311eed50..180d857d52 100644
--- a/spring-boot-autoconfiguration/README.md
+++ b/spring-boot-autoconfiguration/README.md
@@ -9,3 +9,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Create a Custom Auto-Configuration with Spring Boot](https://www.baeldung.com/spring-boot-custom-auto-configuration)
- [Guide to ApplicationContextRunner in Spring Boot](https://www.baeldung.com/spring-boot-context-runner)
+- [A Guide to Spring Boot Configuration Metadata](https://www.baeldung.com/spring-boot-configuration-metadata)
+
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index baf86a4386..7138efc128 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -25,7 +25,7 @@
spring-cloud-zookeeper
spring-cloud-gateway
spring-cloud-stream
- spring-cloud-stream-starters/twitterhdfs
+ spring-cloud-stream-starters/twitterhdfs
spring-cloud-connectors-heroku
spring-cloud-aws
spring-cloud-consul
@@ -35,9 +35,10 @@
spring-cloud-archaius
spring-cloud-functions
spring-cloud-vault
-
- spring-cloud-task
+
+ spring-cloud-task
spring-cloud-zuul
+ spring-cloud-zuul-fallback
diff --git a/spring-cloud/spring-cloud-zuul-fallback/README.md b/spring-cloud/spring-cloud-zuul-fallback/README.md
new file mode 100644
index 0000000000..2f13c1923b
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [Fallback for Zuul Route](TODO)
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml
new file mode 100644
index 0000000000..ee0f607d8a
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/pom.xml
@@ -0,0 +1,43 @@
+
+ 4.0.0
+ api-gateway
+ api-gateway
+ API Gateway using Zuul
+ jar
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-zuul-fallback
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-parent
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplication.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplication.java
new file mode 100644
index 0000000000..78f489f2bb
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.cloud.apigateway;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+
+@SpringBootApplication
+@EnableZuulProxy
+public class ApiGatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ApiGatewayApplication.class, args);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayClientResponse.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayClientResponse.java
new file mode 100644
index 0000000000..ce0c7819f1
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayClientResponse.java
@@ -0,0 +1,69 @@
+package com.baeldung.spring.cloud.apigateway.fallback;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpResponse;
+
+public class GatewayClientResponse implements ClientHttpResponse {
+
+ private HttpStatus status;
+ private String message;
+
+ public GatewayClientResponse(HttpStatus status, String message) {
+ this.status = status;
+ this.message = message;
+ }
+
+ @Override
+ public HttpStatus getStatusCode() throws IOException {
+ return status;
+ }
+
+ @Override
+ public int getRawStatusCode() throws IOException {
+ return status.value();
+ }
+
+ @Override
+ public String getStatusText() throws IOException {
+ return status.getReasonPhrase();
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public InputStream getBody() throws IOException {
+ return new ByteArrayInputStream(message.getBytes());
+ }
+
+ @Override
+ public HttpHeaders getHeaders() {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);
+ return headers;
+ }
+
+ public HttpStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(HttpStatus status) {
+ this.status = status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallback.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallback.java
new file mode 100644
index 0000000000..73f72492c9
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallback.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.cloud.apigateway.fallback;
+
+import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.stereotype.Component;
+
+import com.netflix.hystrix.exception.HystrixTimeoutException;
+
+@Component
+class GatewayServiceFallback implements FallbackProvider {
+
+ private static final String DEFAULT_MESSAGE = "Service not available.";
+
+ @Override
+ public String getRoute() {
+ return "*"; // or return null;
+ }
+
+ @Override
+ public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
+ if (cause instanceof HystrixTimeoutException) {
+ return new GatewayClientResponse(HttpStatus.GATEWAY_TIMEOUT, DEFAULT_MESSAGE);
+ } else {
+ return new GatewayClientResponse(HttpStatus.INTERNAL_SERVER_ERROR, DEFAULT_MESSAGE);
+ }
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallback.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallback.java
new file mode 100644
index 0000000000..28fb6fb6e5
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallback.java
@@ -0,0 +1,29 @@
+package com.baeldung.spring.cloud.apigateway.fallback;
+
+import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.stereotype.Component;
+
+import com.netflix.hystrix.exception.HystrixTimeoutException;
+
+@Component
+class WeatherServiceFallback implements FallbackProvider {
+
+ private static final String DEFAULT_MESSAGE = "Weather information is not available.";
+
+ @Override
+ public String getRoute() {
+ return "weather-service";
+ }
+
+ @Override
+ public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
+ if (cause instanceof HystrixTimeoutException) {
+ return new GatewayClientResponse(HttpStatus.GATEWAY_TIMEOUT, DEFAULT_MESSAGE);
+ } else {
+ return new GatewayClientResponse(HttpStatus.INTERNAL_SERVER_ERROR, DEFAULT_MESSAGE);
+ }
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/resources/application.yml
new file mode 100644
index 0000000000..4a0662a960
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/main/resources/application.yml
@@ -0,0 +1,22 @@
+spring:
+ application:
+ name: api-gateway
+server:
+ port: 7070
+
+zuul:
+ igoredServices: '*'
+ routes:
+ weather-service:
+ path: /weather/**
+ serviceId: weather-service
+ strip-prefix: false
+
+ribbon:
+ eureka:
+ enabled: false
+
+weather-service:
+ ribbon:
+ listOfServers: localhost:8080
+
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplicationIntegrationTest.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplicationIntegrationTest.java
new file mode 100644
index 0000000000..4052edc1f3
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/ApiGatewayApplicationIntegrationTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.cloud.apigateway;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ApiGatewayApplicationIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallbackUnitTest.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallbackUnitTest.java
new file mode 100644
index 0000000000..db2f703084
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/GatewayServiceFallbackUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.spring.cloud.apigateway.fallback;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.netflix.hystrix.exception.HystrixTimeoutException;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class GatewayServiceFallbackUnitTest {
+
+ private static final String ROUTE = "*";
+
+ @Autowired
+ private GatewayServiceFallback fallback;
+
+ @Test
+ public void testWhenGetRouteThenReturnWeatherServiceRoute() {
+ assertEquals(ROUTE, fallback.getRoute());
+
+ }
+
+ @Test
+ public void testFallbackResponse_whenHystrixException_thenGatewayTimeout() throws Exception {
+ HystrixTimeoutException exception = new HystrixTimeoutException();
+ ClientHttpResponse response = fallback.fallbackResponse(ROUTE, exception);
+
+ assertEquals(HttpStatus.GATEWAY_TIMEOUT, response.getStatusCode());
+ }
+
+ @Test
+ public void testFallbackResponse_whenNonHystrixException_thenInternalServerError() throws Exception {
+ RuntimeException exception = new RuntimeException("Test exception");
+ ClientHttpResponse response = fallback.fallbackResponse(ROUTE, exception);
+
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallbackUnitTest.java b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallbackUnitTest.java
new file mode 100644
index 0000000000..ccd59531b5
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/api-gateway/src/test/java/com/baeldung/spring/cloud/apigateway/fallback/WeatherServiceFallbackUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.spring.cloud.apigateway.fallback;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.netflix.hystrix.exception.HystrixTimeoutException;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class WeatherServiceFallbackUnitTest {
+
+ private static final String ROUTE = "weather-service";
+
+ @Autowired
+ private WeatherServiceFallback fallback;
+
+ @Test
+ public void testWhenGetRouteThenReturnWeatherServiceRoute() {
+ assertEquals(ROUTE, fallback.getRoute());
+
+ }
+
+ @Test
+ public void testFallbackResponse_whenHystrixException_thenGatewayTimeout() throws Exception {
+ HystrixTimeoutException exception = new HystrixTimeoutException();
+ ClientHttpResponse response = fallback.fallbackResponse(ROUTE, exception);
+
+ assertEquals(HttpStatus.GATEWAY_TIMEOUT, response.getStatusCode());
+ }
+
+ @Test
+ public void testFallbackResponse_whenNonHystrixException_thenInternalServerError() throws Exception {
+ RuntimeException exception = new RuntimeException("Test exception");
+ ClientHttpResponse response = fallback.fallbackResponse(ROUTE, exception);
+
+ assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/pom.xml
new file mode 100644
index 0000000000..5bdd1d49ca
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+ spring-cloud-zuul-fallback
+ pom
+ spring-cloud-zuul-fallback
+ Spring Cloud Zuul Fallback
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ api-gateway
+ weather-service
+
+
+
+ 1.8
+ Finchley.SR2
+ 3.1.1
+
+
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml b/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml
new file mode 100644
index 0000000000..611f1dcd4f
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+ weather-service
+ Weather Service
+ Weather Service for Zuul Fallback Test
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-zuul-fallback
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-parent
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherController.java b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherController.java
new file mode 100644
index 0000000000..3cf451dcf7
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherController.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.cloud.weatherservice;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/weather")
+public class WeatherController {
+
+ @GetMapping("/today")
+ public String getMessage() {
+ return "It's a bright sunny day today!";
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplication.java b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplication.java
new file mode 100644
index 0000000000..3a6d85e8d1
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.cloud.weatherservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class WeatherServiceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(WeatherServiceApplication.class, args);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/resources/application.yml
new file mode 100644
index 0000000000..242f842f44
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+spring:
+ application:
+ name: weather-service
+
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherControllerIntegrationTest.java b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherControllerIntegrationTest.java
new file mode 100644
index 0000000000..3ffd2b0e7a
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherControllerIntegrationTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.spring.cloud.weatherservice;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(WeatherController.class)
+public class WeatherControllerIntegrationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @Test
+ public void whenWeatherControllerInvoked_thenReturnWeatherInformation() throws Exception {
+ this.mockMvc.perform(get("/weather/today"))
+ .andDo(print())
+ .andExpect(status().isOk())
+ .andExpect(content().string(containsString("bright sunny day")));
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplicationIntegrationTest.java b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplicationIntegrationTest.java
new file mode 100644
index 0000000000..fec7ec1560
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul-fallback/weather-service/src/test/java/com/baeldung/spring/cloud/weatherservice/WeatherServiceApplicationIntegrationTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.spring.cloud.weatherservice;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class WeatherServiceApplicationIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+
+}
diff --git a/spring-freemarker/README.md b/spring-freemarker/README.md
index 410781f2ca..d9dfe16fbe 100644
--- a/spring-freemarker/README.md
+++ b/spring-freemarker/README.md
@@ -4,3 +4,5 @@ This module contains articles about Spring with FreeMarker
### Relevant Articles:
- [Introduction to Using FreeMarker in Spring MVC](https://www.baeldung.com/freemarker-in-spring-mvc-tutorial)
+- [FreeMarker Common Operations](https://www.baeldung.com/freemarker-operations)
+
diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml
index 367d25de98..f06cb91ef6 100644
--- a/spring-integration/pom.xml
+++ b/spring-integration/pom.xml
@@ -68,6 +68,11 @@
spring-integration-security
${spring.version}
+
+ org.springframework.integration
+ spring-integration-jdbc
+ ${spring.version}
+
org.springframework.security
@@ -75,6 +80,12 @@
${spring.version}
test
+
+
+ com.h2database
+ h2
+ 1.4.197
+
@@ -106,7 +117,7 @@
UTF-8
- 5.0.3.RELEASE
+ 5.0.13.RELEASE
1.1.4.RELEASE
1.4.7
1.1.1
diff --git a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
index 7e91345f04..e79eec3e83 100644
--- a/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
+++ b/spring-integration/src/main/java/com/baeldung/dsl/JavaDSLFileCopyConfig.java
@@ -16,8 +16,10 @@ import org.springframework.integration.core.MessageSource;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.dsl.IntegrationFlows;
import org.springframework.integration.dsl.Pollers;
+import org.springframework.integration.dsl.channel.MessageChannels;
import org.springframework.integration.file.FileReadingMessageSource;
import org.springframework.integration.file.FileWritingMessageHandler;
+import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
/**
@@ -104,9 +106,14 @@ public class JavaDSLFileCopyConfig {
return handler;
}
+ @Bean
+ public MessageChannel holdingTank() {
+ return MessageChannels.queue().get();
+ }
+
// @Bean
public IntegrationFlow fileReader() {
- return IntegrationFlows.from(sourceDirectory())
+ return IntegrationFlows.from(sourceDirectory(), configurer -> configurer.poller(Pollers.fixedDelay(10)))
.filter(onlyJpgs())
.channel("holdingTank")
.get();
diff --git a/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java b/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java
new file mode 100755
index 0000000000..56399c653f
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/tx/ServiceActivator.java
@@ -0,0 +1,27 @@
+package com.baeldung.tx;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+public class ServiceActivator {
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+ public void checkTestResults(String payload) {
+
+ this.jdbcTemplate.update("insert into STUDENT values(?)", payload);
+
+ if (payload.toLowerCase().startsWith("fail")) {
+ log.error("Service failure. Test result: {}", payload);
+ throw new RuntimeException("Service failure.");
+ }
+
+ log.info("Service success. Test result: {}", payload);
+ }
+
+}
diff --git a/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java b/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java
new file mode 100644
index 0000000000..7a58cb3125
--- /dev/null
+++ b/spring-integration/src/main/java/com/baeldung/tx/TxIntegrationConfig.java
@@ -0,0 +1,155 @@
+package com.baeldung.tx;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.integration.annotation.InboundChannelAdapter;
+import org.springframework.integration.annotation.Poller;
+import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.annotation.Transformer;
+import org.springframework.integration.channel.DirectChannel;
+import org.springframework.integration.config.EnableIntegration;
+import org.springframework.integration.core.MessageSource;
+import org.springframework.integration.dsl.Pollers;
+import org.springframework.integration.file.FileReadingMessageSource;
+import org.springframework.integration.file.filters.SimplePatternFileListFilter;
+import org.springframework.integration.file.transformer.FileToStringTransformer;
+import org.springframework.integration.scheduling.PollerMetadata;
+import org.springframework.integration.transaction.*;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.transaction.interceptor.TransactionInterceptor;
+
+import javax.sql.DataSource;
+import java.io.File;
+import java.util.Scanner;
+
+@Configuration
+@EnableIntegration
+public class TxIntegrationConfig {
+
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+
+ public final String INPUT_DIR = System.getProperty("java.io.tmpdir") + "/tx/";
+ public final String FILE_PATTERN = "*.txt";
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Autowired
+ private TransactionSynchronizationFactory transactionSynchronizationFactory;
+
+ @Autowired
+ DataSourceTransactionManager txManager;
+
+ @Bean
+ public MessageChannel inputChannel() {
+ return new DirectChannel();
+ }
+
+ @Bean
+ @InboundChannelAdapter(value = "inputChannel", poller = @Poller(value = "pollerMetadata"))
+ public MessageSource fileReadingMessageSource() {
+ FileReadingMessageSource sourceReader = new FileReadingMessageSource();
+ sourceReader.setDirectory(new File(INPUT_DIR));
+ sourceReader.setFilter(new SimplePatternFileListFilter(FILE_PATTERN));
+ return sourceReader;
+ }
+
+ @Bean
+ public PollerMetadata pollerMetadata() {
+ return Pollers.fixedDelay(5000)
+ .advice(transactionInterceptor())
+ .transactionSynchronizationFactory(transactionSynchronizationFactory)
+ .get();
+ }
+
+ private TransactionInterceptor transactionInterceptor() {
+ return new TransactionInterceptorBuilder().transactionManager(txManager).build();
+ }
+
+ @Bean
+ public TransactionSynchronizationFactory transactionSynchronizationFactory() {
+ ExpressionEvaluatingTransactionSynchronizationProcessor processor =
+ new ExpressionEvaluatingTransactionSynchronizationProcessor();
+
+ SpelExpressionParser spelParser = new SpelExpressionParser();
+ processor.setAfterCommitExpression(
+ spelParser.parseExpression(
+ "payload.renameTo(new java.io.File(payload.absolutePath + '.PASSED'))"));
+ processor.setAfterRollbackExpression(
+ spelParser.parseExpression(
+ "payload.renameTo(new java.io.File(payload.absolutePath + '.FAILED'))"));
+
+ return new DefaultTransactionSynchronizationFactory(processor);
+ }
+
+ @Bean
+ @Transformer(inputChannel = "inputChannel", outputChannel = "toServiceChannel")
+ public FileToStringTransformer fileToStringTransformer() {
+ return new FileToStringTransformer();
+ }
+
+ @ServiceActivator(inputChannel = "toServiceChannel")
+ public void serviceActivator(String payload) {
+
+ jdbcTemplate.update("insert into STUDENT values(?)", payload);
+
+ if (payload.toLowerCase().startsWith("fail")) {
+ log.error("Service failure. Test result: {} ", payload);
+ throw new RuntimeException("Service failure.");
+ }
+
+ log.info("Service success. Test result: {}", payload);
+ }
+
+ @Bean
+ public JdbcTemplate jdbcTemplate(DataSource dataSource) {
+ return new JdbcTemplate(dataSource);
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ return new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.H2)
+ .addScript("classpath:table.sql")
+ .build();
+ }
+
+ @Bean
+ public DataSourceTransactionManager txManager() {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ public static void main(final String... args) {
+ final AbstractApplicationContext context = new AnnotationConfigApplicationContext(TxIntegrationConfig.class);
+ context.registerShutdownHook();
+
+ final Scanner scanner = new Scanner(System.in);
+ System.out.print("Integration flow is running. Type q + to quit ");
+ while (true) {
+ final String input = scanner.nextLine();
+ if ("q".equals(input.trim())) {
+ context.close();
+ scanner.close();
+ break;
+ }
+ }
+ System.exit(0);
+ }
+
+}
+
+
+
diff --git a/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml b/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml
new file mode 100755
index 0000000000..2861826521
--- /dev/null
+++ b/spring-integration/src/main/resources/META-INF/spring/integration/spring-integration-tx-context.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-integration/src/main/resources/table.sql b/spring-integration/src/main/resources/table.sql
new file mode 100644
index 0000000000..9ca58f6f27
--- /dev/null
+++ b/spring-integration/src/main/resources/table.sql
@@ -0,0 +1,4 @@
+
+CREATE TABLE IF NOT EXISTS STUDENT (
+ TEST VARCHAR(256)
+);
\ No newline at end of file
diff --git a/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java b/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java
new file mode 100644
index 0000000000..1bbd16aa4b
--- /dev/null
+++ b/spring-integration/src/test/java/com/baeldung/tx/TxIntegrationTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.tx;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public final class TxIntegrationTest {
+
+ private static final String CONTEXT_CONFIG = "classpath:META-INF/spring/integration/spring-integration-tx-context.xml";
+
+ @Test
+ public void whenFileDoesntStartWithFail_thenTxSuccessful() throws InterruptedException, IOException {
+ final AbstractApplicationContext context =
+ new ClassPathXmlApplicationContext(CONTEXT_CONFIG);
+
+ String fileName = System.getProperty("java.io.tmpdir") + "/tx/test1.txt";
+ FileWriter fw = new FileWriter(fileName);
+ fw.write("PASSED!");
+ fw.close();
+
+ context.registerShutdownHook();
+ Thread.sleep(5000);
+
+ File file = new File(fileName + ".PASSED");
+ Assert.assertTrue(file.exists());
+ }
+
+ @Test
+ public void whenFileStartsWithFail_thenTxFailed() {
+
+ String fileName = System.getProperty("java.io.tmpdir") + "/tx/test2.txt";
+
+ try {
+ final AbstractApplicationContext context =
+ new ClassPathXmlApplicationContext(CONTEXT_CONFIG);
+
+ FileWriter fw = new FileWriter(fileName);
+ fw.write("FAILED!");
+ fw.close();
+
+ context.registerShutdownHook();
+ Thread.sleep(5000);
+ } catch (Exception e) {
+ // Exception is expected, do nothing
+ }
+
+ File file = new File(fileName + ".FAILED");
+ Assert.assertTrue(file.exists());
+ }
+
+}
diff --git a/spring-jooq/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java b/spring-jooq/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java
index 8312f20c05..26c061e9cd 100644
--- a/spring-jooq/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java
+++ b/spring-jooq/src/test/java/com/baeldung/jooq/introduction/ExceptionTranslator.java
@@ -12,7 +12,7 @@ public class ExceptionTranslator extends DefaultExecuteListener {
@Override
public void exception(ExecuteContext context) {
SQLDialect dialect = context.configuration().dialect();
- SQLExceptionTranslator translator = new SQLErrorCodeSQLExceptionTranslator(dialect.name());
+ SQLExceptionTranslator translator = new SQLErrorCodeSQLExceptionTranslator(dialect.thirdParty().springDbName());
context.exception(translator.translate("Access database using jOOQ", context.sql(), context.sqlException()));
}
diff --git a/spring-mvc-simple-2/README.md b/spring-mvc-simple-2/README.md
index a4a545ab72..c03fa6363a 100644
--- a/spring-mvc-simple-2/README.md
+++ b/spring-mvc-simple-2/README.md
@@ -5,4 +5,5 @@ This module contains articles about Spring MVC
## Relevant articles:
- [How to Read HTTP Headers in Spring REST Controllers](https://www.baeldung.com/spring-rest-http-headers)
- [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder)
+- [Validating Lists in a Spring Controller](https://www.baeldung.com/spring-validate-list-controller)
- More articles: [[<-- prev]](/spring-mvc-simple)
diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md
index b6a34475ea..bc530ba295 100644
--- a/spring-mvc-xml/README.md
+++ b/spring-mvc-xml/README.md
@@ -14,6 +14,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config)
- [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml)
- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable)
-
+- [Debugging the Spring MVC 404 “No mapping found for HTTP request” Error](https://www.baeldung.com/spring-mvc-404-error)
## Spring MVC with XML Configuration Example Project
- access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html`
diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md
index 72d5a7dc83..2e3bb2b5e5 100644
--- a/spring-scheduling/README.md
+++ b/spring-scheduling/README.md
@@ -1,5 +1,6 @@
### Relevant articles:
- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler)
+- [The @Scheduled Annotation in Spring](https://www.baeldung.com/spring-scheduled-tasks)
- [Guide to Spring Retry](http://www.baeldung.com/spring-retry)
- [How To Do @Async in Spring](http://www.baeldung.com/spring-async)
diff --git a/spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java b/spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java
index 284bcf5e6a..23bbee3bc3 100644
--- a/spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java
+++ b/spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java
@@ -31,9 +31,10 @@ public class ScheduledAnnotationExample {
System.out.println("Fixed rate task - " + System.currentTimeMillis() / 1000);
}
- @Scheduled(fixedDelay = 1000, initialDelay = 100)
+ @Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void scheduleFixedRateWithInitialDelayTask() {
- System.out.println("Fixed delay task with one second initial delay - " + System.currentTimeMillis() / 1000);
+ long now = System.currentTimeMillis() / 1000;
+ System.out.println("Fixed rate task with one second initial delay - " + now);
}
/**
@@ -41,7 +42,8 @@ public class ScheduledAnnotationExample {
*/
@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
- System.out.println("schedule tasks using cron expressions - " + System.currentTimeMillis() / 1000);
+ long now = System.currentTimeMillis() / 1000;
+ System.out.println("schedule tasks using cron jobs - " + now);
}
@Scheduled(cron = "${cron.expression}")
diff --git a/spring-scheduling/src/main/resources/springScheduled-config.xml b/spring-scheduling/src/main/resources/springScheduled-config.xml
index d1ff9dc028..4078f535da 100644
--- a/spring-scheduling/src/main/resources/springScheduled-config.xml
+++ b/spring-scheduling/src/main/resources/springScheduled-config.xml
@@ -15,7 +15,7 @@
-
+
diff --git a/spring-security-mvc-boot/README.md b/spring-security-mvc-boot/README.md
index 7dcfe4d70f..a1056cc130 100644
--- a/spring-security-mvc-boot/README.md
+++ b/spring-security-mvc-boot/README.md
@@ -17,3 +17,5 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range)
- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters)
- [HTTPS using Self-Signed Certificate in Spring Boot](https://www.baeldung.com/spring-boot-https-self-signed-certificate)
+- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
+
diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md
deleted file mode 100644
index a7cdfec7d8..0000000000
--- a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication)
diff --git a/spring-security-mvc/src/main/java/com/baeldung/session/bean/Constants.java b/spring-security-mvc/src/main/java/com/baeldung/session/bean/Constants.java
new file mode 100644
index 0000000000..bf204c3b99
--- /dev/null
+++ b/spring-security-mvc/src/main/java/com/baeldung/session/bean/Constants.java
@@ -0,0 +1,5 @@
+package com.baeldung.session.bean;
+
+public class Constants {
+ public static final String FOO = "foo";
+}
diff --git a/spring-security-mvc/src/main/java/com/baeldung/session/bean/Foo.java b/spring-security-mvc/src/main/java/com/baeldung/session/bean/Foo.java
new file mode 100644
index 0000000000..c9c9c011d4
--- /dev/null
+++ b/spring-security-mvc/src/main/java/com/baeldung/session/bean/Foo.java
@@ -0,0 +1,29 @@
+package com.baeldung.session.bean;
+
+import static org.springframework.context.annotation.ScopedProxyMode.TARGET_CLASS;
+import static org.springframework.web.context.WebApplicationContext.SCOPE_SESSION;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(value = SCOPE_SESSION, proxyMode = TARGET_CLASS)
+public class Foo {
+ private final String created;
+
+ public Foo() {
+ this.created = LocalDateTime.now()
+ .format(DateTimeFormatter.ISO_DATE_TIME);
+ }
+
+ public Foo(Foo theFoo) {
+ this.created = theFoo.created;
+ }
+
+ public String getCreated() {
+ return created;
+ }
+}
diff --git a/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java
index 35b53a0e7f..9a4978c27e 100644
--- a/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java
+++ b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java
@@ -38,7 +38,7 @@ public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
.csrf().disable()
.authorizeRequests()
.antMatchers("/anonymous*").anonymous()
- .antMatchers("/login*","/invalidSession*", "/sessionExpired*").permitAll()
+ .antMatchers("/login*","/invalidSession*", "/sessionExpired*", "/foo/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
diff --git a/spring-security-mvc/src/main/java/com/baeldung/session/web/FooController.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/FooController.java
new file mode 100644
index 0000000000..7c3385dcbd
--- /dev/null
+++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/FooController.java
@@ -0,0 +1,44 @@
+package com.baeldung.session.web;
+
+import javax.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.baeldung.session.bean.Constants;
+import com.baeldung.session.bean.Foo;
+
+@RestController
+@RequestMapping(path = "/foo")
+public class FooController {
+
+ @Autowired
+ private Foo theFoo;
+
+ @GetMapping(path = "set")
+ public void fooSet(HttpSession session) {
+ session.setAttribute(Constants.FOO, new Foo());
+ }
+
+ @GetMapping(path = "autowired")
+ public Foo getAutowired() {
+ return new Foo(theFoo);
+ }
+
+ @GetMapping(path = "inject")
+ public Foo fooInject(HttpSession session) {
+ return (Foo) session.getAttribute(Constants.FOO);
+ }
+
+ @GetMapping(path = "raw")
+ public Foo fromRaw() {
+ ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
+ HttpSession session = attr.getRequest()
+ .getSession(true);
+ return (Foo) session.getAttribute(Constants.FOO);
+ }
+}
diff --git a/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java
index 82199a9e4e..79f57246a9 100644
--- a/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java
+++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java
@@ -3,15 +3,13 @@ package com.baeldung.session.web;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SessionRestController {
@GetMapping("/session-max-interval")
- @ResponseBody
- public String retrieveMaxSessionIncativeInterval(HttpSession session) {
+ public String retrieveMaxSessionInactiveInterval(HttpSession session) {
return "Max Inactive Interval before Session expires: " + session.getMaxInactiveInterval();
}
}
diff --git a/spring-security-mvc/src/main/resources/application.properties b/spring-security-mvc/src/main/resources/application.properties
index 56b2b7b123..6f0d0519ef 100644
--- a/spring-security-mvc/src/main/resources/application.properties
+++ b/spring-security-mvc/src/main/resources/application.properties
@@ -1,3 +1,5 @@
+spring.jackson.serialization.fail-on-empty-beans=false
+
server.servlet.session.timeout=65s
spring.mvc.view.prefix=/WEB-INF/view/
diff --git a/spring-security-mvc/src/main/resources/webSecurityConfig.xml b/spring-security-mvc/src/main/resources/webSecurityConfig.xml
index 42ff4c2186..e91755d394 100644
--- a/spring-security-mvc/src/main/resources/webSecurityConfig.xml
+++ b/spring-security-mvc/src/main/resources/webSecurityConfig.xml
@@ -7,7 +7,7 @@
http://www.springframework.org/schema/beans/spring-beans.xsd"
>
-
+
@@ -22,10 +22,9 @@
-
-
+
diff --git a/spring-security-mvc/src/main/webapp/WEB-INF/web.xml b/spring-security-mvc/src/main/webapp/WEB-INF/web.xml
index 2ef734441b..88087c92ed 100644
--- a/spring-security-mvc/src/main/webapp/WEB-INF/web.xml
+++ b/spring-security-mvc/src/main/webapp/WEB-INF/web.xml
@@ -8,13 +8,14 @@
1
+ COOKIE
- org.baeldung.web.SessionListenerWithMetrics
+ com.baeldung.web.SessionListenerWithMetrics
2.0.0.0
3.1.6
- 5.4.0
+ 5.5.0
+ 1.5.2
5.1.4.RELEASE
4.0.1
2.1.1
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java
index f3e7b8c228..7afd4a22d4 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java
@@ -10,10 +10,12 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@TestMethodOrder(OrderAnnotation.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = SpringDataRestApplication.class)
+@EnableWebMvc
class DirtiesContextIntegrationTest {
@Autowired
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
index 95d83420b7..815b628f0a 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java
@@ -1,21 +1,25 @@
package com.baeldung.overrideproperties;
-import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
+import static org.junit.Assert.assertEquals;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import static org.junit.Assert.assertEquals;
+import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
+@EnableWebMvc
public class ProfilePropertySourceResolverIntegrationTest {
- @Autowired private PropertySourceResolver propertySourceResolver;
+ @Autowired
+ private PropertySourceResolver propertySourceResolver;
@Test
public void shouldProfiledProperty_overridePropertyValues() {
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
index 573a46dd5f..d00aa51e6c 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java
@@ -1,18 +1,22 @@
package com.baeldung.overrideproperties;
-import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+
+import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
@RunWith(SpringRunner.class)
@SpringBootTest(properties = { "example.firstProperty=annotation" })
+@EnableWebMvc
public class SpringBootPropertySourceResolverIntegrationTest {
- @Autowired private PropertySourceResolver propertySourceResolver;
+ @Autowired
+ private PropertySourceResolver propertySourceResolver;
@Test
public void shouldSpringBootTestAnnotation_overridePropertyValues() {
diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
index c724713854..dc15851277 100644
--- a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
+++ b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java
@@ -1,19 +1,23 @@
package com.baeldung.overrideproperties;
-import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
+import static org.junit.Assert.assertEquals;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import static org.junit.Assert.assertEquals;
+import com.baeldung.overrideproperties.resolver.PropertySourceResolver;
@RunWith(SpringRunner.class)
@SpringBootTest
+@EnableWebMvc
public class TestResourcePropertySourceResolverIntegrationTest {
- @Autowired private PropertySourceResolver propertySourceResolver;
+ @Autowired
+ private PropertySourceResolver propertySourceResolver;
@Test
public void shouldTestResourceFile_overridePropertyValues() {
diff --git a/vaadin/README.md b/vaadin/README.md
index 1d570d1f58..92ee8b938e 100644
--- a/vaadin/README.md
+++ b/vaadin/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Vaadin
+
+This module contains articles about Vaadin.
+
+### Relevant articles:
- [Introduction to Vaadin](https://www.baeldung.com/vaadin)
- [Sample Application with Spring Boot and Vaadin](https://www.baeldung.com/spring-boot-vaadin)
diff --git a/vavr/README.md b/vavr/README.md
index 6832f78a62..2b8bb25356 100644
--- a/vavr/README.md
+++ b/vavr/README.md
@@ -1,3 +1,7 @@
+## Vavr
+
+This module contains articles about Vavr.
+
### Relevant Articles:
- [Introduction to Vavr](https://www.baeldung.com/vavr)
- [Guide to Try in Vavr](https://www.baeldung.com/vavr-try)
diff --git a/xml/README.md b/xml/README.md
index d1aa3a798b..b609a1e078 100644
--- a/xml/README.md
+++ b/xml/README.md
@@ -10,3 +10,5 @@ This module contains articles about eXtensible Markup Language (XML)
- [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file)
- [Modifying an XML Attribute in Java](https://www.baeldung.com/java-modify-xml-attribute)
- [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html)
+- [Parsing an XML File Using StAX](https://www.baeldung.com/java-stax)
+