diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java b/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java index a6019ea9f9..a3cb2b396e 100644 --- a/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java +++ b/algorithms-searching/src/main/java/com/baeldung/algorithms/dfs/BinaryTree.java @@ -1,7 +1,5 @@ package com.baeldung.algorithms.dfs; -import java.util.LinkedList; -import java.util.Queue; import java.util.Stack; public class BinaryTree { @@ -124,69 +122,43 @@ public class BinaryTree { } } - public void traverseLevelOrder() { - if (root == null) { - return; - } - Queue nodes = new LinkedList<>(); - nodes.add(root); - - while (!nodes.isEmpty()) { - - Node node = nodes.remove(); - - System.out.print(" " + node.value); - - if (node.left != null) { - nodes.add(node.left); - } - - if (node.left != null) { - nodes.add(node.right); - } - } - } - - public void traverseInOrderWithoutRecursion() { - Stack stack = new Stack(); + Stack stack = new Stack<>(); Node current = root; - stack.push(root); - while(! stack.isEmpty()) { - while(current.left != null) { - current = current.left; - stack.push(current); - } - current = stack.pop(); - visit(current.value); - if(current.right != null) { - current = current.right; + + while (current != null || !stack.isEmpty()) { + while (current != null) { stack.push(current); + current = current.left; } + + Node top = stack.pop(); + visit(top.value); + current = top.right; } } - + public void traversePreOrderWithoutRecursion() { - Stack stack = new Stack(); - Node current = root; + Stack stack = new Stack<>(); + Node current; stack.push(root); while(! stack.isEmpty()) { current = stack.pop(); visit(current.value); - + if(current.right != null) stack.push(current.right); - + if(current.left != null) stack.push(current.left); - } + } } - + public void traversePostOrderWithoutRecursion() { - Stack stack = new Stack(); + Stack stack = new Stack<>(); Node prev = root; - Node current = root; + Node current; stack.push(root); while (!stack.isEmpty()) { @@ -206,14 +178,14 @@ public class BinaryTree { stack.push(current.left); } } - } - } - - private void visit(int value) { - System.out.print(" " + value); + } } - - class Node { + + private void visit(int value) { + System.out.print(" " + value); + } + + static class Node { int value; Node left; Node right; diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java b/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java index 076da14f81..f98b4377ed 100644 --- a/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java +++ b/algorithms-searching/src/test/java/com/baeldung/algorithms/dfs/BinaryTreeUnitTest.java @@ -1,11 +1,11 @@ package com.baeldung.algorithms.dfs; +import org.junit.Test; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Test; - public class BinaryTreeUnitTest { @Test @@ -13,7 +13,7 @@ public class BinaryTreeUnitTest { BinaryTree bt = createBinaryTree(); - assertTrue(!bt.isEmpty()); + assertFalse(bt.isEmpty()); } @Test @@ -111,14 +111,6 @@ public class BinaryTreeUnitTest { bt.traversePostOrderWithoutRecursion(); } - @Test - public void givenABinaryTree_WhenTraversingLevelOrder_ThenPrintValues() { - - BinaryTree bt = createBinaryTree(); - - bt.traverseLevelOrder(); - } - private BinaryTree createBinaryTree() { BinaryTree bt = new BinaryTree(); diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index 7f2245ccc0..12a060ccfe 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -8,4 +8,5 @@ This module contains articles about Java 8 core features - [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit) - [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface) - [Interface With Default Methods vs Abstract Class](https://www.baeldung.com/java-interface-default-method-vs-abstract-class) +- [Convert Between Byte Array and UUID in Java](https://www.baeldung.com/java-byte-array-to-uuid) - [[<-- Prev]](/core-java-modules/core-java-8) diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/game/RockPaperScissorsGame.java b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/game/RockPaperScissorsGame.java index fc9299f12d..17f0f02698 100644 --- a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/game/RockPaperScissorsGame.java +++ b/core-java-modules/core-java-8-2/src/main/java/com/baeldung/game/RockPaperScissorsGame.java @@ -1,17 +1,24 @@ package com.baeldung.game; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.Scanner; +import java.util.*; class RockPaperScissorsGame { - private static Map movesMap = new HashMap() {{ - put(0, "rock"); - put(1, "paper"); - put(2, "scissors"); - }}; + enum Move { + ROCK("rock"), + PAPER("paper"), + SCISSORS("scissors"); + + private String value; + + Move(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); @@ -31,7 +38,7 @@ class RockPaperScissorsGame { break; } - if (!movesMap.containsValue(playerMove)) { + if (Arrays.stream(Move.values()).noneMatch(x -> x.getValue().equals(playerMove))) { System.out.println("Your move isn't valid!"); continue; } @@ -51,15 +58,15 @@ class RockPaperScissorsGame { } private static boolean isPlayerWin(String playerMove, String computerMove) { - return playerMove.equals("rock") && computerMove.equals("scissors") - || (playerMove.equals("scissors") && computerMove.equals("paper")) - || (playerMove.equals("paper") && computerMove.equals("rock")); + return playerMove.equals(Move.ROCK.value) && computerMove.equals(Move.SCISSORS.value) + || (playerMove.equals(Move.SCISSORS.value) && computerMove.equals(Move.PAPER.value)) + || (playerMove.equals(Move.PAPER.value) && computerMove.equals(Move.ROCK.value)); } private static String getComputerMove() { Random random = new Random(); int randomNumber = random.nextInt(3); - String computerMove = movesMap.get(randomNumber); + String computerMove = Move.values()[randomNumber].getValue(); System.out.println("Computer move: " + computerMove); return computerMove; } diff --git a/core-java-modules/core-java-collections-4/README.md b/core-java-modules/core-java-collections-4/README.md index 0e14f407c4..cbca44d372 100644 --- a/core-java-modules/core-java-collections-4/README.md +++ b/core-java-modules/core-java-collections-4/README.md @@ -7,3 +7,4 @@ - [ArrayList vs. LinkedList vs. HashMap in Java](https://www.baeldung.com/java-arraylist-vs-linkedlist-vs-hashmap) - [Java Deque vs. Stack](https://www.baeldung.com/java-deque-vs-stack) - [Collection.toArray(new T[0]) or .toArray(new T[size])](https://www.baeldung.com/java-collection-toarray-methods) +- [Create an Empty Map in Java](https://www.baeldung.com/java-create-empty-map) diff --git a/core-java-modules/core-java-collections-maps-4/pom.xml b/core-java-modules/core-java-collections-maps-4/pom.xml index be467dd57b..e5afd87bbe 100644 --- a/core-java-modules/core-java-collections-maps-4/pom.xml +++ b/core-java-modules/core-java-collections-maps-4/pom.xml @@ -15,6 +15,16 @@ + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + com.google.guava + guava + ${guava.version} + junit junit @@ -37,12 +47,23 @@ + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + UTF-8 - 1.8 - 1.8 + 1.9 + 1.9 \ No newline at end of file diff --git a/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/entries/SimpleCustomKeyValue.java b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/entries/SimpleCustomKeyValue.java new file mode 100644 index 0000000000..b2925cd508 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/entries/SimpleCustomKeyValue.java @@ -0,0 +1,53 @@ +package com.baeldung.entries; + +import java.util.Map; +import java.util.Objects; +import java.util.StringJoiner; + +public class SimpleCustomKeyValue implements Map.Entry { + + private final K key; + private V value; + + public SimpleCustomKeyValue(K key, V value) { + this.key = key; + this.value = value; + } + + @Override + public K getKey() { + return key; + } + + @Override + public V getValue() { + return value; + } + + @Override + public V setValue(V value) { + return this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SimpleCustomKeyValue that = (SimpleCustomKeyValue) o; + return Objects.equals(key, that.key) && Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(key, value); + } + + @Override + public String toString() { + return new StringJoiner(", ", SimpleCustomKeyValue.class.getSimpleName() + "[", "]").add("key=" + key).add("value=" + value).toString(); + } +} diff --git a/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/EntriesExampleUnitTest.java b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/EntriesExampleUnitTest.java new file mode 100644 index 0000000000..954a4a4f22 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/EntriesExampleUnitTest.java @@ -0,0 +1,113 @@ +package com.baeldung.entries; + +import com.google.common.collect.Maps; +import org.apache.commons.collections4.KeyValue; +import org.apache.commons.collections4.keyvalue.DefaultMapEntry; +import org.apache.commons.collections4.keyvalue.UnmodifiableMapEntry; +import org.junit.jupiter.api.Test; + +import java.util.AbstractMap; +import java.util.Map; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +public class EntriesExampleUnitTest { + + @Test + public void givenEntries_whenVerifying_thenShouldContainKeyValues() { + AbstractMap.SimpleEntry firstEntry = new AbstractMap.SimpleEntry<>("key1", "value1"); + AbstractMap.SimpleEntry secondEntry = new AbstractMap.SimpleEntry<>("key2", "value2"); + AbstractMap.SimpleEntry thirdEntry = new AbstractMap.SimpleEntry<>(firstEntry); + thirdEntry.setValue("a different value"); + + assertThat(Stream.of(firstEntry, secondEntry, thirdEntry)) + .extracting("key", "value") + .containsExactly( + tuple("key1", "value1"), + tuple("key2", "value2"), + tuple("key1", "a different value")); + } + + @Test + public void givenImmutableEntries_whenVerifying_thenShouldContainKeyValues() { + AbstractMap.SimpleImmutableEntry firstEntry = new AbstractMap.SimpleImmutableEntry<>("key1", "value1"); + AbstractMap.SimpleImmutableEntry secondEntry = new AbstractMap.SimpleImmutableEntry<>("key2", "value2"); + AbstractMap.SimpleImmutableEntry thirdEntry = new AbstractMap.SimpleImmutableEntry<>(firstEntry); + + assertThat(Stream.of(firstEntry, secondEntry, thirdEntry)) + .extracting("key", "value") + .containsExactly( + tuple("key1", "value1"), + tuple("key2", "value2"), + tuple("key1", "value1")); + } + + @Test + public void givenImmutableEntryUsingJava9_whenVerifying_thenShouldContainKeyValues() { + Map.Entry entry = Map.entry("key", "value"); + + assertThat(entry.getKey()) + .isEqualTo("key"); + assertThat(entry.getValue()) + .isEqualTo("value"); + } + + + @Test + public void givenEntriesWithApacheCommons_whenVerifying_thenShouldContainKeyValues() { + Map.Entry firstEntry = new DefaultMapEntry<>("key1", "value1"); + KeyValue secondEntry = new DefaultMapEntry<>("key2", "value2"); + + KeyValue thirdEntry = new DefaultMapEntry<>(firstEntry); + KeyValue fourthEntry = new DefaultMapEntry<>(secondEntry); + + firstEntry.setValue("a different value"); + + assertThat(firstEntry) + .extracting("key", "value") + .containsExactly("key1", "a different value"); + + assertThat(Stream.of(secondEntry, thirdEntry, fourthEntry)) + .extracting("key", "value") + .containsExactly( + tuple("key2", "value2"), + tuple("key1", "value1"), + tuple("key2", "value2")); + } + + @Test + public void givenImmutableEntriesWithApacheCommons_whenVerifying_thenShouldContainKeyValues() { + Map.Entry firstEntry = new UnmodifiableMapEntry<>("key1", "value1"); + KeyValue secondEntry = new UnmodifiableMapEntry<>("key2", "value2"); + + KeyValue thirdEntry = new UnmodifiableMapEntry<>(firstEntry); + KeyValue fourthEntry = new UnmodifiableMapEntry<>(secondEntry); + + assertThat(firstEntry) + .extracting("key", "value") + .containsExactly("key1", "value1"); + + assertThat(Stream.of(secondEntry, thirdEntry, fourthEntry)) + .extracting("key", "value") + .containsExactly( + tuple("key2", "value2"), + tuple("key1", "value1"), + tuple("key2", "value2")); + } + + + @Test + public void givenImmutableEntriesWithGuava_whenVerifying_thenShouldContainKeyValues() { + Map.Entry firstEntry = Maps.immutableEntry("key1", "value1"); + Map.Entry secondEntry = Maps.immutableEntry("key2", "value2"); + + assertThat(Stream.of(firstEntry, secondEntry)) + .extracting("key", "value") + .containsExactly( + tuple("key1", "value1"), + tuple("key2", "value2")); + } + +} diff --git a/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/SimpleCustomKeyValueUnitTest.java b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/SimpleCustomKeyValueUnitTest.java new file mode 100644 index 0000000000..d055bb1653 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/entries/SimpleCustomKeyValueUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.entries; + +import com.google.common.collect.ImmutableMap; +import org.junit.jupiter.api.Test; + +import java.util.Map; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; + +class SimpleCustomKeyValueUnitTest { + + + @Test + public void givenModifiableEntries_whenVerifying_thenShouldContainKeyValues() { + Map.Entry firstEntry = new SimpleCustomKeyValue<>("key1", "value1"); + + Map.Entry secondEntry = new SimpleCustomKeyValue<>("key2", "value2"); + secondEntry.setValue("different value"); + + Map map = Map.ofEntries(firstEntry, secondEntry); + + assertThat(map) + .isEqualTo(ImmutableMap.builder() + .put("key1", "value1") + .put("key2", "different value") + .build()); + } + +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitialized.java b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitialized.java new file mode 100644 index 0000000000..64118e6307 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/main/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitialized.java @@ -0,0 +1,45 @@ +package com.baeldung.exception.variablemightnothavebeeninitialized; + +public class VariableMightNotHaveBeenInitialized { + + private static int instanceVariableCount; + + /** + * Method would not compile if lines 14 and 18 are uncommented. + */ + public static void countEven() { + //uninstantiated + int count; + int[] arr = new int[]{23, 56, 89, 12, 23}; + for (int i = 0; i < arr.length; i++) { + if ((arr[i] % 2) == 0) { + // count++; + } + + } + // System.out.println("Total Even Numbers : " + count); + } + + public static int countEvenUsingInstanceVariable(int[] arr) { + + for (int i = 0; i < arr.length; i++) { + if ((arr[i] % 2) == 0) { + instanceVariableCount++; + } + + } + return instanceVariableCount; + } + + public static int countEvenUsingIfElse(int[] arr, int args) { + int count; + count = args > 0 ? args : 0; + for (int i = 0; i < arr.length; i++) { + if ((arr[i] % 2) == 0) { + count++; + } + + } + return count; + } +} diff --git a/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitializedUnitTest.java b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitializedUnitTest.java new file mode 100644 index 0000000000..c4773d6442 --- /dev/null +++ b/core-java-modules/core-java-exceptions-4/src/test/java/com/baeldung/exception/variablemightnothavebeeninitialized/VariableMightNotHaveBeenInitializedUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.exception.variablemightnothavebeeninitialized; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class VariableMightNotHaveBeenInitializedUnitTest { + + @Test + public void usingInstanceVariable_returnCount() { + int[] arr = new int[]{1, 2, 3, 4, 5, 6}; + int value = VariableMightNotHaveBeenInitialized.countEvenUsingInstanceVariable(arr); + + assertEquals(3, value); + } + + @Test + public void usingArgumentsAndIfElse_returnCount() { + int[] arr = new int[]{1, 2, 3, 4, 5, 6}; + int value = VariableMightNotHaveBeenInitialized.countEvenUsingIfElse(arr, 2); + + assertEquals(5, value); + } +} diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java new file mode 100644 index 0000000000..5d108ba14a --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/bytebuffer/ByteBufferUnitTest.java @@ -0,0 +1,339 @@ +package com.baeldung.bytebuffer; + +import org.junit.Test; + +import java.lang.reflect.Field; +import java.nio.*; +import java.nio.charset.StandardCharsets; + +import static org.junit.Assert.*; + +public class ByteBufferUnitTest { + @Test + public void givenBufferCreation_whenUsingAllocate_thenSuccess() { + ByteBuffer buffer = ByteBuffer.allocate(10); + assertNotNull(buffer); + } + + @Test + public void givenBufferCreation_whenUsingAllocateDirect_thenSuccess() { + ByteBuffer buffer = ByteBuffer.allocateDirect(10); + assertNotNull(buffer); + } + + @Test + public void givenBufferCreation_whenUsingWrap_thenSuccess() { + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + assertNotNull(buffer); + } + + @Test + public void givenBufferIndex_whenUsingAllocate_thenInitialIndices() { + // create instance using allocate + ByteBuffer buffer = ByteBuffer.allocate(10); + + // get index + int position = buffer.position(); + int limit = buffer.limit(); + int capacity = buffer.capacity(); + + // assert + assertEquals(0, position); + assertEquals(10, limit); + assertEquals(10, capacity); + } + + @Test + public void givenBufferIndex_whenChangingPositionAndLimit_thenSuccess() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + + // change index + buffer.position(2); + buffer.limit(5); + + // assert + assertIndex(buffer, -1, 2, 5, 10); + } + + @Test + public void givenBufferIndex_whenUsingWrap_thenInitialIndices() { + // create instance + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // assert + assertIndex(buffer, -1, 0, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingWrapWithOffsetAndLength_thenInitialIndices() { + // create instance + byte[] bytes = new byte[10]; + ByteBuffer buffer = ByteBuffer.wrap(bytes, 2, 6); + + // assert + assertIndex(buffer, -1, 2, 8, 10); + } + + @Test + public void givenBufferIndex_whenUsingMarkAndReset_thenOK() { + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + buffer.position(2); + assertIndex(buffer, -1, 2, 10, 10); + + buffer.mark(); + assertIndex(buffer, 2, 2, 10, 10); + + buffer.position(5); + assertIndex(buffer, 2, 5, 10, 10); + + buffer.reset(); + assertIndex(buffer, 2, 2, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingClear_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // clear + buffer.clear(); + assertIndex(buffer, -1, 0, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingFlip_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // flip + buffer.flip(); + assertIndex(buffer, -1, 0, 5, 10); + } + + @Test + public void givenBufferIndex_whenUsingRewind_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // rewind + buffer.rewind(); + assertIndex(buffer, -1, 0, 8, 10); + } + + @Test + public void givenBufferIndex_whenUsingCompact_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // compact + buffer.compact(); + assertIndex(buffer, -1, 3, 10, 10); + } + + @Test + public void givenBufferIndex_whenUsingRemain_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + + // change index + buffer.position(2); + buffer.limit(8); + + // remain + boolean flag = buffer.hasRemaining(); + int remaining = buffer.remaining(); + + // assert + assertTrue(flag); + assertEquals(6, remaining); + } + + @Test(expected = BufferUnderflowException.class) + public void givenNotEnoughRemaining_WhenCallingGetInt_thenBufferUnderflowException() { + ByteBuffer buffer = ByteBuffer.allocate(2); + buffer.getInt(); + } + + @Test(expected = BufferOverflowException.class) + public void givenNotEnoughRemaining_WhenCallingPutInt_thenBufferOverflowException() { + ByteBuffer buffer = ByteBuffer.allocate(2); + buffer.putInt(10); + } + + @Test + public void givenBufferView_whenUsingDuplicate_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.duplicate(); + assertIndex(view, 2, 5, 8, 10); + } + + @Test + public void givenBufferView_whenUsingSlice_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.slice(); + assertIndex(view, -1, 0, 3, 3); + } + + @Test + public void givenBufferView_whenUsingAsReaOnlyBuffer_thenOK() { + // create instance + ByteBuffer buffer = ByteBuffer.allocate(10); + assertIndex(buffer, -1, 0, 10, 10); + + // change index + buffer.position(2); + buffer.mark(); + buffer.position(5); + buffer.limit(8); + assertIndex(buffer, 2, 5, 8, 10); + + // view + ByteBuffer view = buffer.asReadOnlyBuffer(); + assertIndex(view, 2, 5, 8, 10); + } + + @Test + public void givenBufferView_whenUsingAsIntBuffer_thenOK() { + // create instance + byte[] bytes = new byte[]{ + (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE, // CAFEBABE ---> cafebabe + (byte) 0xF0, (byte) 0x07, (byte) 0xBA, (byte) 0x11, // F007BA11 ---> football + (byte) 0x0F, (byte) 0xF1, (byte) 0xCE // 0FF1CE ---> office + }; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + assertIndex(buffer, -1, 0, 11, 11); + + // view + IntBuffer intBuffer = buffer.asIntBuffer(); + int capacity = intBuffer.capacity(); + assertEquals(2, capacity); + assertIndex(intBuffer, -1, 0, 2, 2); + } + + @Test + public void givenByteOrder_whenUsingBigEndian_thenOK() { + // create instance + byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // change byte order + buffer.order(ByteOrder.BIG_ENDIAN); + int val = buffer.getInt(); + + // assert + assertEquals(0xCAFEBABE, val); + } + + @Test + public void givenByteOrder_whenUsingLittleEndian_thenOK() { + // create instance + byte[] bytes = new byte[]{(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; + ByteBuffer buffer = ByteBuffer.wrap(bytes); + + // change byte order + buffer.order(ByteOrder.LITTLE_ENDIAN); + int val = buffer.getInt(); + + // assert + assertEquals(0xBEBAFECA, val); + } + + @Test + public void givenComparing_whenUsingEqualsAndCompareTo_thenOK() { + // create instance + byte[] bytes1 = "World".getBytes(StandardCharsets.UTF_8); + byte[] bytes2 = "HelloWorld".getBytes(StandardCharsets.UTF_8); + ByteBuffer buffer1 = ByteBuffer.wrap(bytes1); + ByteBuffer buffer2 = ByteBuffer.wrap(bytes2); + + // change index + buffer2.position(5); + + // equals and compareTo + boolean equal = buffer1.equals(buffer2); + int result = buffer1.compareTo(buffer2); + + // assert + assertTrue(equal); + assertEquals(0, result); + } + + private void assertIndex(Buffer buffer, int mark, int position, int limit, int capacity) { + assertEquals(mark, getMark(buffer)); + assertEquals(position, buffer.position()); + assertEquals(limit, buffer.limit()); + assertEquals(capacity, buffer.capacity()); + } + + private int getMark(Buffer buffer) { + try { + Class clazz = Buffer.class; + Field f = clazz.getDeclaredField("mark"); + f.setAccessible(true); + Object result = f.get(buffer); + return (int) result; + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + return -1; + } +} diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md index 31969cd270..9d82e829e2 100644 --- a/core-java-modules/core-java-security-3/README.md +++ b/core-java-modules/core-java-security-3/README.md @@ -10,4 +10,5 @@ This module contains articles about core Java Security - [HMAC in Java](https://www.baeldung.com/java-hmac) - [Generating a Secure AES Key in Java](https://www.baeldung.com/java-secure-aes-key) - [Computing an X509 Certificate’s Thumbprint in Java](https://www.baeldung.com/java-x509-certificate-thumbprint) +- [Error: “trustAnchors parameter must be non-empty”](https://www.baeldung.com/java-trustanchors-parameter-must-be-non-empty) - More articles: [[<-- prev]](/core-java-modules/core-java-security-2) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index a25cf11454..60319b4de4 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -38,7 +38,6 @@ core-java-collections-maps core-java-collections-maps-2 core-java-collections-maps-3 - core-java-collections-maps-4 core-java-concurrency-2 core-java-concurrency-advanced core-java-concurrency-advanced-2 diff --git a/docker/README.md b/docker/README.md index 0de3694215..0adf1c9b51 100644 --- a/docker/README.md +++ b/docker/README.md @@ -6,3 +6,4 @@ - [How To Configure Java Heap Size Inside a Docker Container](https://www.baeldung.com/ops/docker-jvm-heap-size) - [Dockerfile Strategies for Git](https://www.baeldung.com/ops/dockerfile-git-strategies) - [How to Get Docker-Compose to Always Use the Latest Image](https://www.baeldung.com/ops/docker-compose-latest-image) +- [How to Include Files Outside of Docker’s Build Context](https://www.baeldung.com/ops/docker-include-files-outside-build-context) diff --git a/docker/docker-caching/multi-module-caching/Dockerfile b/docker/docker-caching/multi-module-caching/Dockerfile new file mode 100644 index 0000000000..96ebe2a76b --- /dev/null +++ b/docker/docker-caching/multi-module-caching/Dockerfile @@ -0,0 +1,21 @@ +FROM maven:alpine as build +ENV HOME=/usr/app +RUN mkdir -p $HOME +WORKDIR $HOME + +ADD pom.xml $HOME +ADD core/pom.xml $HOME/core/pom.xml +ADD runner/pom.xml $HOME/runner/pom.xml + +RUN mvn -pl core verify --fail-never +ADD core $HOME/core +RUN mvn -pl core install +RUN mvn -pl runner verify --fail-never +ADD runner $HOME/runner +RUN mvn -pl core,runner package + +FROM openjdk:8-jdk-alpine + +COPY --from=build /usr/app/runner/target/runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar /app/runner.jar + +ENTRYPOINT java -jar /app/runner.jar \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/Dockerfile-Buildkit b/docker/docker-caching/multi-module-caching/Dockerfile-Buildkit new file mode 100644 index 0000000000..e89ce38e4b --- /dev/null +++ b/docker/docker-caching/multi-module-caching/Dockerfile-Buildkit @@ -0,0 +1,13 @@ +FROM maven:alpine as build +ENV HOME=/usr/app +RUN mkdir -p $HOME +WORKDIR $HOME + +ADD . $HOME +RUN --mount=type=cache,target=/root/.m2 mvn -f $HOME/pom.xml clean package + +FROM openjdk:8-jdk-alpine + +COPY --from=build /usr/app/runner/target/runner-0.0.1-SNAPSHOT-jar-with-dependencies.jar /app/runner.jar + +ENTRYPOINT java -jar /app/runner.jar \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/core/pom.xml b/docker/docker-caching/multi-module-caching/core/pom.xml new file mode 100644 index 0000000000..eeeb5a6e5b --- /dev/null +++ b/docker/docker-caching/multi-module-caching/core/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + core + + + multi-module-caching + com.baeldung + 0.0.1-SNAPSHOT + + + + + com.google.guava + guava + + + + + 8 + 8 + + \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java b/docker/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java new file mode 100644 index 0000000000..d8c73a331a --- /dev/null +++ b/docker/docker-caching/multi-module-caching/core/src/main/java/com/baeldung/maven_caching/CoreClass.java @@ -0,0 +1,14 @@ +package com.baeldung.maven_caching; + +import com.google.common.io.Files; + +public class CoreClass { + + public String method() { + return "Hello from core module!!"; + } + + public String dependencyMethod() { + return Files.simplifyPath("/home/app/test"); + } +} diff --git a/docker/docker-caching/multi-module-caching/pom.xml b/docker/docker-caching/multi-module-caching/pom.xml new file mode 100644 index 0000000000..7968114385 --- /dev/null +++ b/docker/docker-caching/multi-module-caching/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + com.baeldung + multi-module-caching + 0.0.1-SNAPSHOT + Multi-module Maven caching example + pom + + + + + com.google.guava + guava + 31.0.1-jre + + + + + + 1.8 + + + + runner + core + + diff --git a/docker/docker-caching/multi-module-caching/runner/pom.xml b/docker/docker-caching/multi-module-caching/runner/pom.xml new file mode 100644 index 0000000000..e3654bff17 --- /dev/null +++ b/docker/docker-caching/multi-module-caching/runner/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + runner + + + multi-module-caching + com.baeldung + 0.0.1-SNAPSHOT + + + + + com.baeldung + core + 0.0.1-SNAPSHOT + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + jar-with-dependencies + + + + true + com.baeldung.maven_caching.MavenCachingApplication + + + + + + assemble-all + package + + single + + + + + + + + + 8 + 8 + + \ No newline at end of file diff --git a/docker/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java b/docker/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java new file mode 100644 index 0000000000..3673dd86c1 --- /dev/null +++ b/docker/docker-caching/multi-module-caching/runner/src/main/java/com/baeldung/maven_caching/MavenCachingApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.maven_caching; + +public class MavenCachingApplication { + + public static void main(String[] args) { + CoreClass cc = new CoreClass(); + System.out.println(cc.method()); + System.out.println(cc.dependencyMethod()); + } + +} diff --git a/docker/docker-caching/single-module-caching/Dockerfile b/docker/docker-caching/single-module-caching/Dockerfile new file mode 100644 index 0000000000..02157c0dd6 --- /dev/null +++ b/docker/docker-caching/single-module-caching/Dockerfile @@ -0,0 +1,15 @@ +FROM maven:alpine as build +ENV HOME=/usr/app +RUN mkdir -p $HOME +WORKDIR $HOME +ADD pom.xml $HOME +RUN mvn verify --fail-never + +ADD . $HOME +RUN mvn package + +FROM openjdk:8-jdk-alpine + +COPY --from=build /usr/app/target/single-module-caching-1.0-SNAPSHOT-jar-with-dependencies.jar /app/runner.jar + +ENTRYPOINT java -jar /app/runner.jar \ No newline at end of file diff --git a/docker/docker-caching/single-module-caching/Dockerfile-Buildkit b/docker/docker-caching/single-module-caching/Dockerfile-Buildkit new file mode 100644 index 0000000000..29384ce208 --- /dev/null +++ b/docker/docker-caching/single-module-caching/Dockerfile-Buildkit @@ -0,0 +1,13 @@ +FROM maven:alpine as build +ENV HOME=/usr/app +RUN mkdir -p $HOME +WORKDIR $HOME +ADD . $HOME + +RUN --mount=type=cache,target=/root/.m2 mvn -f $HOME/pom.xml clean package + +FROM openjdk:8-jdk-alpine + +COPY --from=build /usr/app/target/single-module-caching-1.0-SNAPSHOT-jar-with-dependencies.jar /app/runner.jar + +ENTRYPOINT java -jar /app/runner.jar \ No newline at end of file diff --git a/docker/docker-caching/single-module-caching/pom.xml b/docker/docker-caching/single-module-caching/pom.xml new file mode 100644 index 0000000000..386b040138 --- /dev/null +++ b/docker/docker-caching/single-module-caching/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + com.baeldung + single-module-caching + 1.0-SNAPSHOT + + + + com.google.guava + guava + 31.0.1-jre + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + jar-with-dependencies + + + + true + com.baeldung.maven_caching.MavenCachingMain + + + + + + assemble-all + package + + single + + + + + + + + + 8 + 8 + + \ No newline at end of file diff --git a/docker/docker-caching/single-module-caching/src/main/java/com/baeldung/maven_caching/MavenCachingMain.java b/docker/docker-caching/single-module-caching/src/main/java/com/baeldung/maven_caching/MavenCachingMain.java new file mode 100644 index 0000000000..4fbd8e5311 --- /dev/null +++ b/docker/docker-caching/single-module-caching/src/main/java/com/baeldung/maven_caching/MavenCachingMain.java @@ -0,0 +1,11 @@ +package com.baeldung.maven_caching; + +import com.google.common.io.Files; + +public class MavenCachingMain { + + public static void main(String[] args) { + System.out.println("Hello from maven_caching app!!!"); + System.out.println(Files.simplifyPath("/home/app/test")); + } +} diff --git a/docker/pom.xml b/docker/pom.xml index f481f1b8b7..5c6267c6dd 100644 --- a/docker/pom.xml +++ b/docker/pom.xml @@ -26,6 +26,8 @@ docker-internal-dto docker-spring-boot docker-sample-app + docker-caching/single-module-caching + docker-caching/multi-module-caching diff --git a/gradle/gradle-source-vs-target-compatibility/README.md b/gradle/gradle-source-vs-target-compatibility/README.md new file mode 100644 index 0000000000..cc3157fde3 --- /dev/null +++ b/gradle/gradle-source-vs-target-compatibility/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Gradle: sourceCompatiblity vs targetCompatibility](https://www.baeldung.com/gradle-sourcecompatiblity-vs-targetcompatibility) diff --git a/java-collections-maps-3/README.md b/java-collections-maps-3/README.md index 75842c85a4..e2e0a56489 100644 --- a/java-collections-maps-3/README.md +++ b/java-collections-maps-3/README.md @@ -7,3 +7,4 @@ - [Update the Value Associated With a Key in a HashMap](https://www.baeldung.com/java-hashmap-update-value-by-key) - [Java Map – keySet() vs. entrySet() vs. values() Methods](https://www.baeldung.com/java-map-entries-methods) - [Java IdentityHashMap Class and Its Use Cases](https://www.baeldung.com/java-identityhashmap) +- [How to Invert a Map in Java](https://www.baeldung.com/java-invert-map) diff --git a/java-native/README.md b/java-native/README.md index 4f85342a38..2aa02c03d5 100644 --- a/java-native/README.md +++ b/java-native/README.md @@ -7,3 +7,4 @@ This module contains articles about the Java Native Interface (JNI). - [Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni) - [Using JNA to Access Native Dynamic Libraries](https://www.baeldung.com/java-jna-dynamic-libraries) - [Check if a Java Program Is Running in 64-Bit or 32-Bit JVM](https://www.baeldung.com/java-detect-jvm-64-or-32-bit) +- [How to use JNI’s RegisterNatives() method?](https://www.baeldung.com/jni-registernatives) diff --git a/jta/pom.xml b/jta/pom.xml index e9f9364646..e62c480c81 100644 --- a/jta/pom.xml +++ b/jta/pom.xml @@ -15,6 +15,18 @@ 0.0.1-SNAPSHOT ../parent-boot-2 + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -37,6 +49,7 @@ 2.4.7 + 2.17.1 \ No newline at end of file diff --git a/maven-modules/maven-classifier/maven-classifier-example-consumer/pom.xml b/maven-modules/maven-classifier/maven-classifier-example-consumer/pom.xml new file mode 100644 index 0000000000..cbf046ed5a --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-consumer/pom.xml @@ -0,0 +1,53 @@ + + + + maven-classifier + com.baeldung + 0.0.1-SNAPSHOT + + + 4.0.0 + + maven-classifier-example-consumer + + + 8 + 8 + + + + + com.baeldung + maven-classifier-example-provider + 0.0.1-SNAPSHOT + + + com.baeldung + maven-classifier-example-provider + 0.0.1-SNAPSHOT + arbitrary + + + + + + + + + + com.baeldung + maven-classifier-example-provider + 0.0.1-SNAPSHOT + sources + + + com.baeldung + maven-classifier-example-provider + 0.0.1-SNAPSHOT + tests + + + + diff --git a/maven-modules/maven-classifier/maven-classifier-example-consumer/src/main/java/com/baeldung/maven/classifier/consumer/FuelStation.java b/maven-modules/maven-classifier/maven-classifier-example-consumer/src/main/java/com/baeldung/maven/classifier/consumer/FuelStation.java new file mode 100644 index 0000000000..cf5dc03457 --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-consumer/src/main/java/com/baeldung/maven/classifier/consumer/FuelStation.java @@ -0,0 +1,17 @@ + +package com.baeldung.maven.classifier.consumer; + +import com.baeldung.maven.dependency.classifier.provider.model.Car; +import com.baeldung.maven.dependency.classifier.provider.model.PowerSource; + +public class FuelStation { + + public FuelStation.Zone refill(Car car) { + return PowerSource.BATTERY.equals(car.getPowerSource()) ? FuelStation.Zone.BATTERY : FuelStation.Zone.UNKNOWN; + } + + public enum Zone { + BATTERY, + UNKNOWN + } +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-consumer/src/test/java/com/baeldung/maven/classifier/consumer/FuelStationUnitTest.java b/maven-modules/maven-classifier/maven-classifier-example-consumer/src/test/java/com/baeldung/maven/classifier/consumer/FuelStationUnitTest.java new file mode 100644 index 0000000000..e04afb8276 --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-consumer/src/test/java/com/baeldung/maven/classifier/consumer/FuelStationUnitTest.java @@ -0,0 +1,21 @@ +package com.baeldung.maven.classifier.consumer; + +import com.baeldung.maven.classifier.consumer.FuelStation.Zone; +import com.baeldung.maven.dependency.classifier.provider.model.Car; +import com.baeldung.maven.dependency.classifier.provider.stub.CarStub; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class FuelStationUnitTest { + + @Test + @DisplayName("Given fuel type battery When request for refill Then Return Battery Zone") + public void givenFuelTypeBattery_whenRequestToRefill_thenReturnBatteryZone() { + FuelStation fuelStation = new FuelStation(); + Car electricCar = CarStub.ELECTRIC_CAR; + + assertEquals(Zone.BATTERY, fuelStation.refill(electricCar)); + } +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/pom.xml b/maven-modules/maven-classifier/maven-classifier-example-provider/pom.xml new file mode 100644 index 0000000000..12cb4fa1a2 --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/pom.xml @@ -0,0 +1,122 @@ + + + + 4.0.0 + + + maven-classifier + com.baeldung + 0.0.1-SNAPSHOT + + + maven-classifier-example-provider + 0.0.1-SNAPSHOT + + + 8 + 8 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.0 + + + JDK 8 + compile + + compile + + + 8 + 8 + true + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.2.2 + + + Arbitrary + + jar + + + arbitrary + + + + Test Jar + + test-jar + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.3.2 + + + attach-javadocs + + jar + + + + + + + diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactory.java b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactory.java new file mode 100644 index 0000000000..285fec9ddc --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactory.java @@ -0,0 +1,14 @@ +package com.baeldung.maven.dependency.classifier.provider.factory; + +import com.baeldung.maven.dependency.classifier.provider.model.Car; +import com.baeldung.maven.dependency.classifier.provider.model.Car.Type; + +public class CarFactory { + + public static Car manufacture(Type carType) { + Car car = new Car(); + car.setType(carType); + + return car; + } +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/Car.java b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/Car.java new file mode 100644 index 0000000000..93d5091f55 --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/Car.java @@ -0,0 +1,26 @@ +package com.baeldung.maven.dependency.classifier.provider.model; + +public class Car { + private Type type; + private PowerSource fuelType; + + public Type getType() { + return this.type; + } + + public void setType(Type carType) { + this.type = carType; + } + + public PowerSource getPowerSource() { + return this.fuelType; + } + + public void setFuelType(PowerSource fuelType) { + this.fuelType = fuelType; + } + + public enum Type { + ELECTRIC + } +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/PowerSource.java b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/PowerSource.java new file mode 100644 index 0000000000..3ac5d98efe --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/src/main/java/com/baeldung/maven/dependency/classifier/provider/model/PowerSource.java @@ -0,0 +1,5 @@ +package com.baeldung.maven.dependency.classifier.provider.model; + +public enum PowerSource { + BATTERY +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactoryUnitTest.java b/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactoryUnitTest.java new file mode 100644 index 0000000000..36f0b36f1c --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/factory/CarFactoryUnitTest.java @@ -0,0 +1,32 @@ + +package com.baeldung.maven.dependency.classifier.provider.factory; + +import com.baeldung.maven.dependency.classifier.provider.model.Car; +import com.baeldung.maven.dependency.classifier.provider.model.Car.Type; +import com.baeldung.maven.dependency.classifier.provider.model.PowerSource; +import com.baeldung.maven.dependency.classifier.provider.stub.CarStub; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class CarFactoryUnitTest { + + @Test + @DisplayName("Given Car type When CarFactory manufacture is called Then create a Car of the given type") + public void givenCarType_whenCarFactoryManufactureCalled_thenCreateCarOfGivenType() { + Car car = CarFactory.manufacture(Type.ELECTRIC); + + assertNotNull(car, "CarFactory didn't manufacture a car. Car is null"); + assertEquals(Type.ELECTRIC, car.getType()); + } + + @Test + @DisplayName("Given an electric car When asked for fuel type Then return Battery") + public void givenElectricCar_whenAskedForFuelType_thenReturnBattery() { + Car car = CarStub.ELECTRIC_CAR; + + assertEquals(PowerSource.BATTERY, car.getPowerSource()); + } +} diff --git a/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/stub/CarStub.java b/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/stub/CarStub.java new file mode 100644 index 0000000000..54dbd1166f --- /dev/null +++ b/maven-modules/maven-classifier/maven-classifier-example-provider/src/test/java/com/baeldung/maven/dependency/classifier/provider/stub/CarStub.java @@ -0,0 +1,17 @@ +package com.baeldung.maven.dependency.classifier.provider.stub; + +import com.baeldung.maven.dependency.classifier.provider.model.Car; +import com.baeldung.maven.dependency.classifier.provider.model.PowerSource; +import com.baeldung.maven.dependency.classifier.provider.model.Car.Type; +import org.mockito.Mockito; + +import static org.mockito.Mockito.when; + +public class CarStub { + public static Car ELECTRIC_CAR = Mockito.mock(Car.class); + + static { + when(ELECTRIC_CAR.getType()).thenReturn(Type.ELECTRIC); + when(ELECTRIC_CAR.getPowerSource()).thenReturn(PowerSource.BATTERY); + } +} diff --git a/maven-modules/maven-classifier/pom.xml b/maven-modules/maven-classifier/pom.xml new file mode 100644 index 0000000000..6b75f60893 --- /dev/null +++ b/maven-modules/maven-classifier/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + maven-classifier + pom + 0.0.1-SNAPSHOT + + + maven-classifier-example-consumer + maven-classifier-example-provider + + + + com.baeldung + maven-modules + 0.0.1-SNAPSHOT + + + + 8 + 8 + + + diff --git a/maven-modules/maven-generate-war/pom.xml b/maven-modules/maven-generate-war/pom.xml index 56256f58ea..b388cfdadd 100644 --- a/maven-modules/maven-generate-war/pom.xml +++ b/maven-modules/maven-generate-war/pom.xml @@ -63,6 +63,7 @@ 11 + 2.17.1 \ No newline at end of file diff --git a/maven-modules/pom.xml b/maven-modules/pom.xml index 21bc0e72e1..37be581804 100644 --- a/maven-modules/pom.xml +++ b/maven-modules/pom.xml @@ -36,6 +36,7 @@ maven-surefire-plugin maven-parent-pom-resolution maven-simple + maven-classifier diff --git a/patterns/enterprise-patterns/pom.xml b/patterns/enterprise-patterns/pom.xml index 10c07d6d05..999b359170 100644 --- a/patterns/enterprise-patterns/pom.xml +++ b/patterns/enterprise-patterns/pom.xml @@ -48,6 +48,13 @@ pom import + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + @@ -63,6 +70,7 @@ 3.7.4 2.2.2.RELEASE + 2.17.1 \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/.gitignore b/persistence-modules/hibernate-mapping-2/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/.gitignore @@ -0,0 +1,13 @@ +*.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/persistence-modules/hibernate-mapping-2/README.md b/persistence-modules/hibernate-mapping-2/README.md new file mode 100644 index 0000000000..7a811e17cf --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/README.md @@ -0,0 +1,7 @@ +## Hibernate Mapping + +This module contains articles about Hibernate Mappings. + +### Relevant articles + +- [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/pom.xml b/persistence-modules/hibernate-mapping-2/pom.xml new file mode 100644 index 0000000000..10c07c95eb --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + hibernate-mapping-2y + 0.1-SNAPSHOT + hibernate-mapping-2 + + + com.baeldung + persistence-modules + 1.0.0-SNAPSHOT + + + + + + org.springframework + spring-context + ${org.springframework.version} + + + + org.springframework.data + spring-data-jpa + ${org.springframework.data.version} + + + org.hibernate + hibernate-core + ${hibernate.version} + + + org.apache.tomcat + tomcat-dbcp + ${tomcat-dbcp.version} + + + + + com.google.guava + guava + ${guava.version} + + + + org.springframework + spring-test + ${org.springframework.version} + test + + + com.h2database + h2 + ${h2.version} + + + com.sun.xml.bind + jaxb-core + ${com.sun.xml.version} + + + javax.xml.bind + jaxb-api + ${javax.xml.bind.version} + + + com.sun.xml.bind + jaxb-impl + ${com.sun.xml.version} + + + + + + 5.0.2.RELEASE + 1.10.6.RELEASE + + 5.2.10.Final + 9.0.0.M26 + 2.3.0.1 + 2.3.1 + + + \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java similarity index 93% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java index b8e7e1b2fd..0d7b8bdbcf 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/manytomany/spring/PersistenceConfig.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/PersistenceConfig.java @@ -1,70 +1,72 @@ -package com.baeldung.manytomany.spring; - -import java.util.Properties; -import javax.sql.DataSource; -import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; -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.orm.hibernate5.HibernateTransactionManager; -import org.springframework.orm.hibernate5.LocalSessionFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; - - - -@Configuration -@EnableTransactionManagement -@PropertySource({ "classpath:persistence-h2.properties" }) -@ComponentScan({ "com.baeldung.hibernate.manytomany" }) -public class PersistenceConfig { - - @Autowired - private Environment env; - - @Bean - public LocalSessionFactoryBean sessionFactory() { - final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); - sessionFactory.setDataSource(restDataSource()); - sessionFactory.setPackagesToScan(new String[] { "com.baeldung.hibernate.manytomany" }); - sessionFactory.setHibernateProperties(hibernateProperties()); - - return sessionFactory; - } - - @Bean - public DataSource restDataSource() { - final BasicDataSource dataSource = new BasicDataSource(); - dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); - dataSource.setUrl(env.getProperty("jdbc.url")); - dataSource.setUsername(env.getProperty("jdbc.user")); - dataSource.setPassword(env.getProperty("jdbc.pass")); - - return dataSource; - } - - @Bean - public PlatformTransactionManager hibernateTransactionManager() { - final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); - transactionManager.setSessionFactory(sessionFactory().getObject()); - return transactionManager; - } - - @Bean - public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { - return new PersistenceExceptionTranslationPostProcessor(); - } - - private final Properties hibernateProperties() { - 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.show_sql", "false"); - - return hibernateProperties; - } -} +package com.baeldung.manytomany; + +import java.util.Properties; + +import javax.sql.DataSource; + +import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; +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.orm.hibernate5.HibernateTransactionManager; +import org.springframework.orm.hibernate5.LocalSessionFactoryBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + + + +@Configuration +@EnableTransactionManagement +@PropertySource({ "classpath:persistence-h2.properties" }) +@ComponentScan({ "com.baeldung.manytomany" }) +public class PersistenceConfig { + + @Autowired + private Environment env; + + @Bean + public LocalSessionFactoryBean sessionFactory() { + final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); + sessionFactory.setDataSource(restDataSource()); + sessionFactory.setPackagesToScan(new String[] { "com.baeldung.manytomany" }); + sessionFactory.setHibernateProperties(hibernateProperties()); + + return sessionFactory; + } + + @Bean + public DataSource restDataSource() { + final BasicDataSource dataSource = new BasicDataSource(); + dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); + dataSource.setUrl(env.getProperty("jdbc.url")); + dataSource.setUsername(env.getProperty("jdbc.user")); + dataSource.setPassword(env.getProperty("jdbc.pass")); + + return dataSource; + } + + @Bean + public PlatformTransactionManager hibernateTransactionManager() { + final HibernateTransactionManager transactionManager = new HibernateTransactionManager(); + transactionManager.setSessionFactory(sessionFactory().getObject()); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { + return new PersistenceExceptionTranslationPostProcessor(); + } + + private final Properties hibernateProperties() { + 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.show_sql", "false"); + + return hibernateProperties; + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java new file mode 100644 index 0000000000..68bf5d5bad --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IEmployeeDao.java @@ -0,0 +1,8 @@ +package com.baeldung.manytomany.dao; + +import com.baeldung.manytomany.dao.common.IOperations; +import com.baeldung.manytomany.model.Employee; + +public interface IEmployeeDao extends IOperations{ + +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java new file mode 100644 index 0000000000..d2645db44a --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/IProjectDao.java @@ -0,0 +1,8 @@ +package com.baeldung.manytomany.dao; + +import com.baeldung.manytomany.dao.common.IOperations; +import com.baeldung.manytomany.model.Project; + +public interface IProjectDao extends IOperations{ + +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java new file mode 100644 index 0000000000..b37b48e645 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractDao.java @@ -0,0 +1,14 @@ +package com.baeldung.manytomany.dao.common; + +import java.io.Serializable; + +import com.google.common.base.Preconditions; + +public abstract class AbstractDao implements IOperations { + + protected Class clazz; + + protected final void setClazz(final Class clazzToSet) { + clazz = Preconditions.checkNotNull(clazzToSet); + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java new file mode 100644 index 0000000000..9c8a8faa2e --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/AbstractHibernateDao.java @@ -0,0 +1,59 @@ +package com.baeldung.manytomany.dao.common; + +import java.io.Serializable; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.google.common.base.Preconditions; + +@SuppressWarnings("unchecked") +public abstract class AbstractHibernateDao extends AbstractDao implements IOperations { + + @Autowired + protected SessionFactory sessionFactory; + + // API + + @Override + public T findOne(final long id) { + return (T) getCurrentSession().get(clazz, id); + } + + @Override + public List findAll() { + return getCurrentSession().createQuery("from " + clazz.getName()).getResultList(); + } + + @Override + public void create(final T entity) { + Preconditions.checkNotNull(entity); + getCurrentSession().saveOrUpdate(entity); + } + + @Override + public T update(final T entity) { + Preconditions.checkNotNull(entity); + return (T) getCurrentSession().merge(entity); + } + + @Override + public void delete(final T entity) { + Preconditions.checkNotNull(entity); + getCurrentSession().delete(entity); + } + + @Override + public void deleteById(final long entityId) { + final T entity = findOne(entityId); + Preconditions.checkState(entity != null); + delete(entity); + } + + protected Session getCurrentSession() { + return sessionFactory.getCurrentSession(); + } + +} \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java new file mode 100644 index 0000000000..8a85b52fc9 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/common/IOperations.java @@ -0,0 +1,20 @@ +package com.baeldung.manytomany.dao.common; + +import java.io.Serializable; +import java.util.List; + +public interface IOperations { + + T findOne(final long id); + + List findAll(); + + void create(final T entity); + + T update(final T entity); + + void delete(final T entity); + + void deleteById(final long entityId); + +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java new file mode 100644 index 0000000000..b24013c567 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/EmployeeDao.java @@ -0,0 +1,17 @@ +package com.baeldung.manytomany.dao.impl; + +import org.springframework.stereotype.Repository; + +import com.baeldung.manytomany.dao.IEmployeeDao; +import com.baeldung.manytomany.dao.common.AbstractHibernateDao; +import com.baeldung.manytomany.model.Employee; + +@Repository +public class EmployeeDao extends AbstractHibernateDao implements IEmployeeDao { + + public EmployeeDao() { + super(); + + setClazz(Employee.class); + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java new file mode 100644 index 0000000000..a70212f519 --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/dao/impl/ProjectDao.java @@ -0,0 +1,18 @@ +package com.baeldung.manytomany.dao.impl; + +import org.springframework.stereotype.Repository; + +import com.baeldung.manytomany.dao.IProjectDao; +import com.baeldung.manytomany.dao.common.AbstractHibernateDao; +import com.baeldung.manytomany.model.Project; + + +@Repository +public class ProjectDao extends AbstractHibernateDao implements IProjectDao { + + public ProjectDao() { + super(); + + setClazz(Project.class); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java similarity index 93% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java index 8157945e2c..39671c21bc 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Employee.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Employee.java @@ -1,88 +1,88 @@ -package com.baeldung.hibernate.manytomany.model; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; - -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.Table; - -@Entity -@Table(name = "Employee") -public class Employee implements Serializable { - @Id - @Column(name = "employee_id") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long employeeId; - - @Column(name = "first_name") - private String firstName; - - @Column(name = "last_name") - private String lastName; - - @ManyToMany(cascade = { CascadeType.ALL }) - @JoinTable( - name = "Employee_Project", - joinColumns = { @JoinColumn(name = "employee_id") }, - inverseJoinColumns = { @JoinColumn(name = "project_id") } - ) - Set projects = new HashSet(); - - - public Employee() { - super(); - } - - public Employee(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } - - public Employee(String firstName, String lastName, Set projects) { - this.firstName = firstName; - this.lastName = lastName; - this.projects = projects; - } - - - public Long getEmployeeId() { - return employeeId; - } - - public void setEmployeeId(Long employeeId) { - this.employeeId = employeeId; - } - - 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 Set getProjects() { - return projects; - } - - public void setProjects(Set projects) { - this.projects = projects; - } -} +package com.baeldung.manytomany.model; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; +import javax.persistence.Table; + +@Entity +@Table(name = "Employee") +public class Employee implements Serializable { + @Id + @Column(name = "employee_id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long employeeId; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @ManyToMany(cascade = { CascadeType.ALL }) + @JoinTable( + name = "Employee_Project", + joinColumns = { @JoinColumn(name = "employee_id") }, + inverseJoinColumns = { @JoinColumn(name = "project_id") } + ) + Set projects = new HashSet(); + + + public Employee() { + super(); + } + + public Employee(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Employee(String firstName, String lastName, Set projects) { + this.firstName = firstName; + this.lastName = lastName; + this.projects = projects; + } + + + public Long getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Long employeeId) { + this.employeeId = employeeId; + } + + 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 Set getProjects() { + return projects; + } + + public void setProjects(Set projects) { + this.projects = projects; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java similarity index 91% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java index d6c049f33e..b5dc3cb856 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/model/Project.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/model/Project.java @@ -1,61 +1,62 @@ -package com.baeldung.hibernate.manytomany.model; - -import java.io.Serializable; -import java.util.HashSet; -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; -import javax.persistence.ManyToMany; -import javax.persistence.Table; - -@Entity -@Table(name = "Project") -public class Project implements Serializable { - - @Id - @Column(name = "project_id") - @GeneratedValue - private Long projectId; - - @Column(name = "title") - private String title; - - @ManyToMany(mappedBy = "projects") - private Set employees = new HashSet(); - - public Project() { - super(); - } - - public Project(String title) { - this.title = title; - } - - public Long getProjectId() { - return projectId; - } - - public void setProjectId(Long projectId) { - this.projectId = projectId; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Set getEmployees() { - return employees; - } - - public void setEmployees(Set employees) { - this.employees = employees; - } - - -} +package com.baeldung.manytomany.model; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; + +@Entity +@Table(name = "Project") +public class Project implements Serializable { + + @Id + @Column(name = "project_id") + @GeneratedValue + private Long projectId; + + @Column(name = "title") + private String title; + + @ManyToMany(mappedBy = "projects") + private Set employees = new HashSet(); + + public Project() { + super(); + } + + public Project(String title) { + this.title = title; + } + + public Long getProjectId() { + return projectId; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Set getEmployees() { + return employees; + } + + public void setEmployees(Set employees) { + this.employees = employees; + } + + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java similarity index 88% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java rename to persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java index 29e8d7515a..d429564564 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/manytomany/util/HibernateUtil.java +++ b/persistence-modules/hibernate-mapping-2/src/main/java/com/baeldung/manytomany/util/HibernateUtil.java @@ -1,45 +1,46 @@ -package com.baeldung.hibernate.manytomany.util; - -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.service.ServiceRegistry; -import com.baeldung.hibernate.manytomany.model.Employee; -import com.baeldung.hibernate.manytomany.model.Project; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class HibernateUtil { - - private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class); - private static SessionFactory sessionFactory; - - private static SessionFactory buildSessionFactory() { - try { - // Create the SessionFactory from hibernate-annotation.cfg.xml - Configuration configuration = new Configuration(); - configuration.addAnnotatedClass(Employee.class); - configuration.addAnnotatedClass(Project.class); - configuration.configure("manytomany.cfg.xml"); - LOGGER.debug("Hibernate Annotation Configuration loaded"); - - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) - .build(); - LOGGER.debug("Hibernate Annotation serviceRegistry created"); - - SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); - - return sessionFactory; - } catch (Throwable ex) { - LOGGER.error("Initial SessionFactory creation failed.", ex); - throw new ExceptionInInitializerError(ex); - } - } - - public static SessionFactory getSessionFactory() { - if (sessionFactory == null) { - sessionFactory = buildSessionFactory(); - } - return sessionFactory; - } -} +package com.baeldung.manytomany.util; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.manytomany.model.Employee; +import com.baeldung.manytomany.model.Project; + +public class HibernateUtil { + + private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class); + private static SessionFactory sessionFactory; + + private static SessionFactory buildSessionFactory() { + try { + // Create the SessionFactory from hibernate-annotation.cfg.xml + Configuration configuration = new Configuration(); + configuration.addAnnotatedClass(Employee.class); + configuration.addAnnotatedClass(Project.class); + configuration.configure("manytomany.cfg.xml"); + LOGGER.debug("Hibernate Annotation Configuration loaded"); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) + .build(); + LOGGER.debug("Hibernate Annotation serviceRegistry created"); + + SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); + + return sessionFactory; + } catch (Throwable ex) { + LOGGER.error("Initial SessionFactory creation failed.", ex); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } +} diff --git a/persistence-modules/hibernate-mapping-2/src/main/resources/logback.xml b/persistence-modules/hibernate-mapping-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..ec0dc2469a --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties b/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties new file mode 100644 index 0000000000..9c8cf6e02b --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/main/resources/persistence-h2.properties @@ -0,0 +1,11 @@ +# jdbc.X +jdbc.driverClassName=org.h2.Driver +jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 +jdbc.eventGeneratedId=sa +jdbc.user=sa +jdbc.pass= + +# hibernate.X +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=false +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java new file mode 100644 index 0000000000..f1a6f675ce --- /dev/null +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/SpringContextTest.java @@ -0,0 +1,18 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +import com.baeldung.manytomany.PersistenceConfig; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +public class SpringContextTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java similarity index 87% rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java rename to persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java index 614de6d3ad..19d1a5ff50 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationJavaConfigMainIntegrationTest.java @@ -1,49 +1,50 @@ -package com.baeldung.hibernate.manytomany; - -import java.util.HashSet; -import java.util.Set; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import com.baeldung.hibernate.manytomany.model.Employee; -import com.baeldung.hibernate.manytomany.model.Project; -import com.baeldung.manytomany.spring.PersistenceConfig; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) -public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest { - - @Autowired - private SessionFactory sessionFactory; - - private Session session; - - @Before - public final void before() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @After - public final void after() { - session.getTransaction().commit(); - session.close(); - } - - @Test - public final void whenEntitiesAreCreated_thenNoExceptions() { - Set projects = new HashSet(); - projects.add(new Project("IT Project")); - projects.add(new Project("Networking Project")); - session.persist(new Employee("Peter", "Oven", projects)); - session.persist(new Employee("Allan", "Norman", projects)); - } - -} +package com.baeldung.hibernate.manytomany; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; +import com.baeldung.manytomany.PersistenceConfig; +import com.baeldung.manytomany.model.Employee; +import com.baeldung.manytomany.model.Project; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class) +public class HibernateManyToManyAnnotationJavaConfigMainIntegrationTest { + + @Autowired + private SessionFactory sessionFactory; + + private Session session; + + @Before + public final void before() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @After + public final void after() { + session.getTransaction().commit(); + session.close(); + } + + @Test + public final void whenEntitiesAreCreated_thenNoExceptions() { + Set projects = new HashSet(); + projects.add(new Project("IT Project")); + projects.add(new Project("Networking Project")); + session.persist(new Employee("Peter", "Oven", projects)); + session.persist(new Employee("Allan", "Norman", projects)); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java similarity index 89% rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java rename to persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java index 0073e181cc..bfa158d43f 100644 --- a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java +++ b/persistence-modules/hibernate-mapping-2/src/test/java/com/baeldung/hibernate/manytomany/HibernateManyToManyAnnotationMainIntegrationTest.java @@ -1,80 +1,82 @@ -package com.baeldung.hibernate.manytomany; - -import static org.junit.Assert.assertNotNull; -import static junit.framework.TestCase.assertEquals; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.baeldung.hibernate.manytomany.util.HibernateUtil; -import com.baeldung.hibernate.manytomany.model.Employee; -import com.baeldung.hibernate.manytomany.model.Project; - -/** - * Configured in: manytomany.cfg.xml - */ -public class HibernateManyToManyAnnotationMainIntegrationTest { - private static SessionFactory sessionFactory; - - private Session session; - - @BeforeClass - public static void beforeTests() { - sessionFactory = HibernateUtil.getSessionFactory(); - } - - @Before - public void setUp() { - session = sessionFactory.openSession(); - session.beginTransaction(); - } - - @Test - public void givenData_whenInsert_thenCreatesMtoMrelationship() { - String[] employeeData = { "Peter Oven", "Allan Norman" }; - String[] projectData = { "IT Project", "Networking Project" }; - Set projects = new HashSet(); - - for (String proj : projectData) { - projects.add(new Project(proj)); - } - - for (String emp : employeeData) { - Employee employee = new Employee(emp.split(" ")[0], emp.split(" ")[1]); - assertEquals(0, employee.getProjects().size()); - employee.setProjects(projects); - session.persist(employee); - assertNotNull(employee); - } - } - - @Test - public void givenSession_whenRead_thenReturnsMtoMdata() { - @SuppressWarnings("unchecked") - List employeeList = session.createQuery("FROM Employee").list(); - assertNotNull(employeeList); - for(Employee employee : employeeList) { - assertNotNull(employee.getProjects()); - } - } - - @After - public void tearDown() { - session.getTransaction() - .commit(); - session.close(); - } - - @AfterClass - public static void afterTests() { - sessionFactory.close(); - } - -} +package com.baeldung.hibernate.manytomany; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.manytomany.model.Employee; +import com.baeldung.manytomany.model.Project; +import com.baeldung.manytomany.util.HibernateUtil; + +/** + * Configured in: manytomany.cfg.xml + */ +public class HibernateManyToManyAnnotationMainIntegrationTest { + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreatesMtoMrelationship() { + String[] employeeData = { "Peter Oven", "Allan Norman" }; + String[] projectData = { "IT Project", "Networking Project" }; + Set projects = new HashSet(); + + for (String proj : projectData) { + projects.add(new Project(proj)); + } + + for (String emp : employeeData) { + Employee employee = new Employee(emp.split(" ")[0], emp.split(" ")[1]); + assertEquals(0, employee.getProjects().size()); + employee.setProjects(projects); + session.persist(employee); + assertNotNull(employee); + } + } + + @Test + public void givenSession_whenRead_thenReturnsMtoMdata() { + @SuppressWarnings("unchecked") + List employeeList = session.createQuery("FROM Employee").list(); + assertNotNull(employeeList); + for(Employee employee : employeeList) { + assertNotNull(employee.getProjects()); + } + } + + @After + public void tearDown() { + session.getTransaction() + .commit(); + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml b/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml similarity index 97% rename from persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml rename to persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml index 2ca23d57d3..3ddff9a993 100644 --- a/persistence-modules/spring-hibernate-5/src/test/resources/manytomany.cfg.xml +++ b/persistence-modules/hibernate-mapping-2/src/test/resources/manytomany.cfg.xml @@ -13,4 +13,4 @@ false create-drop - + \ No newline at end of file diff --git a/persistence-modules/hibernate-queries/README.md b/persistence-modules/hibernate-queries/README.md index 61d94e32de..58ca74cd24 100644 --- a/persistence-modules/hibernate-queries/README.md +++ b/persistence-modules/hibernate-queries/README.md @@ -7,4 +7,5 @@ This module contains articles about use of Queries in Hibernate. - [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) - [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) - [Hibernate Named Query](https://www.baeldung.com/hibernate-named-query) -- [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) \ No newline at end of file +- [Hibernate Query Plan Cache](https://www.baeldung.com/hibernate-query-plan-cache) +- [Hibernate’s addScalar() Method](https://www.baeldung.com/hibernate-addscalar) diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java new file mode 100644 index 0000000000..b2fcddeafb --- /dev/null +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/MultipleFieldsExample.java @@ -0,0 +1,44 @@ +package com.baeldung.mongo.update; + +import org.bson.Document; + +import com.mongodb.BasicDBObject; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.result.UpdateResult; + +public class MultipleFieldsExample { + + public static void main(String[] args) { + + // + // Connect to cluster (default is localhost:27017) + // + + MongoClient mongoClient = new MongoClient("localhost", 27017); + MongoDatabase database = mongoClient.getDatabase("baeldung"); + MongoCollection collection = database.getCollection("employee"); + + // + // Filter on the basis of employee_id + // + + BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875); + + // + // Update the fields in Document + // + + BasicDBObject updateFields = new BasicDBObject(); + updateFields.append("department_id", 3); + updateFields.append("job", "Sales Manager"); + BasicDBObject setQuery = new BasicDBObject(); + setQuery.append("$set", updateFields); + UpdateResult updateResult = collection.updateMany(searchQuery, setQuery); + + System.out.println("updateResult:- " + updateResult); + System.out.println("updateResult:- " + updateResult.getModifiedCount()); + + } +} diff --git a/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java new file mode 100644 index 0000000000..20af6d99cb --- /dev/null +++ b/persistence-modules/java-mongodb/src/main/java/com/baeldung/mongo/update/UpdateMultipleFields.java @@ -0,0 +1,36 @@ +package com.baeldung.mongo.update; + +import org.bson.Document; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.Updates; +import com.mongodb.client.result.UpdateResult; + +public class UpdateMultipleFields { + + public static void main(String[] args) { + + // + // Connect to cluster + // + + MongoClient mongoClient = new MongoClient("localhost", 27007); + MongoDatabase database = mongoClient.getDatabase("baeldung"); + MongoCollection collection = database.getCollection("employee"); + + // + // Update query + // + + UpdateResult updateResult = collection.updateMany(Filters.eq("employee_id", 794875), + Updates.combine(Updates.set("department_id", 4), Updates.set("job", "Sales Manager"))); + + System.out.println("updateResult:- " + updateResult); + System.out.println("updateResult:- " + updateResult.getModifiedCount()); + + } + +} \ No newline at end of file diff --git a/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java new file mode 100644 index 0000000000..d1538d5312 --- /dev/null +++ b/persistence-modules/java-mongodb/src/test/java/com/baeldung/update/UpdateMultipleFieldsLiveTest.java @@ -0,0 +1,80 @@ +package com.baeldung.update; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; + +import org.bson.Document; +import org.junit.Before; +import org.junit.Test; + +import com.mongodb.BasicDBObject; +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.Updates; +import com.mongodb.client.result.UpdateResult; + +public class UpdateMultipleFieldsLiveTest { + + private MongoClient mongoClient; + private MongoDatabase db; + private MongoCollection collection; + + @Before + public void setup() { + if (mongoClient == null) { + mongoClient = new MongoClient("localhost", 27017); + db = mongoClient.getDatabase("baeldung"); + collection = db.getCollection("employee"); + + collection.insertOne(Document.parse( + "{'employee_id':794875,'employee_name': 'David smith','job': 'Sales Representative','department_id': 2,'salary': 20000,'hire_date': NumberLong(\"1643969311817\")}")); + } + } + + @Test + public void updateMultipleFieldsUsingDBObject() { + + BasicDBObject searchQuery = new BasicDBObject("employee_id", 794875); + BasicDBObject updateFields = new BasicDBObject(); + updateFields.append("department_id", 4); + updateFields.append("job", "Sales Manager"); + BasicDBObject setQuery = new BasicDBObject(); + setQuery.append("$set", updateFields); + + collection.updateMany(searchQuery, setQuery); + + Document nameDoc = collection.find(Filters.eq("employee_id", 794875)).first(); + assertNotNull(nameDoc); + assertFalse(nameDoc.isEmpty()); + + String job = nameDoc.get("job", String.class); + assertNotNull(job); + + Integer department_id = nameDoc.get("department_id", Integer.class); + assertNotNull(department_id); + + } + + @Test + public void updateMultipleFieldsUsingDocument() { + + collection.updateMany(Filters.eq("employee_id", 794875), + Updates.combine(Updates.set("department_id", 4), Updates.set("job", "Sales Manager"))); + + Document nameDoc = collection.find(Filters.eq("employee_id", 794875)).first(); + assertNotNull(nameDoc); + assertFalse(nameDoc.isEmpty()); + + String job = nameDoc.get("job", String.class); + assertNotNull(job); + + Integer department_id = nameDoc.get("department_id", Integer.class); + assertNotNull(department_id); + + } + +} diff --git a/persistence-modules/spring-data-dynamodb/pom.xml b/persistence-modules/spring-data-dynamodb/pom.xml index 148215b68a..0e990c69f3 100644 --- a/persistence-modules/spring-data-dynamodb/pom.xml +++ b/persistence-modules/spring-data-dynamodb/pom.xml @@ -24,6 +24,13 @@ pom import + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + @@ -184,6 +191,7 @@ https://s3-us-west-2.amazonaws.com/dynamodb-local/release 3.1.1 2.4.7 + 2.17.1 \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index eff59a0362..9770fe95af 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -4,7 +4,6 @@ This module contains articles about Hibernate 5 with Spring. ### Relevant articles -- [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many) - [Programmatic Transactions in the Spring TestContext Framework](https://www.baeldung.com/spring-test-programmatic-transactions) - [JPA Criteria Queries](https://www.baeldung.com/hibernate-criteria-queries) - [Introduction to Hibernate Search](https://www.baeldung.com/hibernate-search) diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index d0fa23504c..ba18c5a221 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -107,7 +107,22 @@ com.h2database h2 ${h2.version} - + + + com.sun.xml.bind + jaxb-core + ${com.sun.xml.version} + + + javax.xml.bind + jaxb-api + ${javax.xml.bind.version} + + + com.sun.xml.bind + jaxb-impl + ${com.sun.xml.version} + @@ -122,6 +137,8 @@ 9.0.0.M26 1.1 2.3.4 + 2.3.0.1 + 2.3.1 \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java deleted file mode 100644 index d619807b64..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IEmployeeDao.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.persistence.manytomany.dao; - -import com.baeldung.hibernate.manytomany.model.Employee; -import com.baeldung.persistence.dao.common.IOperations; - -public interface IEmployeeDao extends IOperations{ - -} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java deleted file mode 100644 index 4a55714f8d..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/IProjectDao.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.persistence.manytomany.dao; - -import com.baeldung.hibernate.manytomany.model.Project; -import com.baeldung.persistence.dao.common.IOperations; - -public interface IProjectDao extends IOperations{ - -} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java deleted file mode 100644 index b062c00ff9..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/EmployeeDao.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.persistence.manytomany.dao.impl; - -import org.springframework.stereotype.Repository; -import com.baeldung.hibernate.manytomany.model.Employee; -import com.baeldung.persistence.dao.common.AbstractHibernateDao; -import com.baeldung.persistence.manytomany.dao.IEmployeeDao; - -@Repository -public class EmployeeDao extends AbstractHibernateDao implements IEmployeeDao { - - public EmployeeDao() { - super(); - - setClazz(Employee.class); - } -} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java deleted file mode 100644 index 772026fbc1..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/persistence/manytomany/dao/impl/ProjectDao.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.persistence.manytomany.dao.impl; - -import org.springframework.stereotype.Repository; -import com.baeldung.hibernate.manytomany.model.Project; -import com.baeldung.persistence.dao.common.AbstractHibernateDao; -import com.baeldung.persistence.manytomany.dao.IProjectDao; - - -@Repository -public class ProjectDao extends AbstractHibernateDao implements IProjectDao { - - public ProjectDao() { - super(); - - setClazz(Project.class); - } -} diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/import.sql b/persistence-modules/spring-hibernate-5/src/main/resources/import-db.sql similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/resources/import.sql rename to persistence-modules/spring-hibernate-5/src/main/resources/import-db.sql diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml deleted file mode 100644 index 315e2e3118..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/resources/manytomany.cfg.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - com.mysql.jdbc.Driver - tutorialmy5ql - jdbc:mysql://localhost:3306/spring_hibernate_many_to_many - tutorialuser - org.hibernate.dialect.MySQLDialect - thread - false - - diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/criteria.cfg.xml b/persistence-modules/spring-hibernate-5/src/test/resources/criteria.cfg.xml index bc4fed9680..9ca9836a70 100644 --- a/persistence-modules/spring-hibernate-5/src/test/resources/criteria.cfg.xml +++ b/persistence-modules/spring-hibernate-5/src/test/resources/criteria.cfg.xml @@ -11,6 +11,7 @@ org.hibernate.dialect.H2Dialect create-drop + import-db.sql false diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/import.sql b/persistence-modules/spring-hibernate-5/src/test/resources/import-db.sql similarity index 99% rename from persistence-modules/spring-hibernate-5/src/test/resources/import.sql rename to persistence-modules/spring-hibernate-5/src/test/resources/import-db.sql index 087d62d331..52c800f6b4 100644 --- a/persistence-modules/spring-hibernate-5/src/test/resources/import.sql +++ b/persistence-modules/spring-hibernate-5/src/test/resources/import-db.sql @@ -1,3 +1,4 @@ + insert into item (item_id, item_name, item_desc, item_price) values(1,'item One', 'test 1', 35.12); insert into item (item_id, item_name, item_desc, item_price) values(2,'Pogo stick', 'Pogo stick', 466.12); diff --git a/pom.xml b/pom.xml index f3d16366bd..edc5302390 100644 --- a/pom.xml +++ b/pom.xml @@ -400,7 +400,6 @@ dagger data-structures ddd - deeplearning4j discord4j disruptor @@ -432,7 +431,6 @@ hazelcast helidon httpclient - httpclient-simple hystrix @@ -483,8 +481,8 @@ kubernetes ksqldb - language-interop - libraries-2 + language-interop + libraries-2 libraries-3 libraries-apache-commons libraries-apache-commons-collections @@ -520,12 +518,12 @@ micronaut microprofile msf4j - + mustache mybatis netflix-modules - + netty ninja open-liberty @@ -886,7 +884,6 @@ dagger data-structures ddd - deeplearning4j discord4j disruptor @@ -917,7 +914,6 @@ hazelcast helidon httpclient - httpclient-simple hystrix @@ -1005,12 +1001,12 @@ micronaut microprofile msf4j - + mustache mybatis netflix-modules - + netty ninja open-liberty @@ -1200,7 +1196,6 @@ wildfly xml xstream - @@ -1329,6 +1324,7 @@ core-java-modules/core-java-collections-set + core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-date-operations-1 core-java-modules/core-java-datetime-conversion core-java-modules/core-java-datetime-string @@ -1341,11 +1337,15 @@ core-java-modules/core-java-time-measurements core-java-modules/core-java-networking-3 core-java-modules/multimodulemavenproject + ddd-modules + httpclient-2 + libraries-concurrency persistence-modules/sirix persistence-modules/spring-data-cassandra-2 quarkus-vs-springboot quarkus-jandex spring-boot-modules/spring-boot-cassandre + spring-boot-modules/spring-boot-camel testing-modules/testing-assertions @@ -1386,6 +1386,7 @@ core-java-modules/core-java-collections-set + core-java-modules/core-java-collections-maps-4 core-java-modules/core-java-date-operations-1 core-java-modules/core-java-datetime-conversion core-java-modules/core-java-datetime-string @@ -1398,11 +1399,15 @@ core-java-modules/core-java-networking-3 core-java-modules/multimodulemavenproject core-java-modules/core-java-strings + ddd-modules + httpclient-2 + libraries-concurrency persistence-modules/sirix persistence-modules/spring-data-cassandra-2 quarkus-vs-springboot quarkus-jandex spring-boot-modules/spring-boot-cassandre + spring-boot-modules/spring-boot-camel testing-modules/testing-assertions @@ -1470,7 +1475,6 @@ 0.0.1 3.12.2 3.0.0 - 3.13.0 1.18.20 1.4.200 diff --git a/quarkus-vs-springboot/spring-project/pom.xml b/quarkus-vs-springboot/spring-project/pom.xml index bf524cd550..7f0fa4c8c6 100644 --- a/quarkus-vs-springboot/spring-project/pom.xml +++ b/quarkus-vs-springboot/spring-project/pom.xml @@ -187,6 +187,7 @@ 11 0.11.0-RC1 + 2.17.1 \ No newline at end of file diff --git a/spring-5-autowiring-beans/README.md b/spring-5-autowiring-beans/README.md new file mode 100644 index 0000000000..dc8751325e --- /dev/null +++ b/spring-5-autowiring-beans/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring @Autowired Field Null – Common Causes and Solutions](https://www.baeldung.com/spring-autowired-field-null) diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index c145992737..023eda856b 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -13,6 +13,18 @@ 0.0.1-SNAPSHOT ../parent-boot-2 + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -138,6 +150,7 @@ 3.3.1.RELEASE 2.2.6.RELEASE + 2.17.1 \ No newline at end of file diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml index c685207cc4..2ede13a152 100644 --- a/spring-activiti/pom.xml +++ b/spring-activiti/pom.xml @@ -16,6 +16,18 @@ 0.0.1-SNAPSHOT ../parent-boot-1 + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -59,6 +71,7 @@ 6.0.0 + 2.17.1 \ No newline at end of file diff --git a/spring-boot-modules/pom.xml b/spring-boot-modules/pom.xml index c1a96a0604..fabd54aa92 100644 --- a/spring-boot-modules/pom.xml +++ b/spring-boot-modules/pom.xml @@ -36,7 +36,6 @@ spring-boot-deployment spring-boot-di spring-boot-disable-logging - spring-boot-camel spring-boot-ci-cd spring-boot-custom-starter diff --git a/spring-boot-modules/spring-boot-2/pom.xml b/spring-boot-modules/spring-boot-2/pom.xml index 08dc517fa0..0da07eaf00 100644 --- a/spring-boot-modules/spring-boot-2/pom.xml +++ b/spring-boot-modules/spring-boot-2/pom.xml @@ -62,7 +62,7 @@ - 2.14.1 + 2.17.1 5.3.15 11 11 diff --git a/spring-boot-modules/spring-boot-camel/pom.xml b/spring-boot-modules/spring-boot-camel/pom.xml index 5d5e2ce6bd..5bda1b2351 100644 --- a/spring-boot-modules/spring-boot-camel/pom.xml +++ b/spring-boot-modules/spring-boot-camel/pom.xml @@ -16,22 +16,22 @@ - org.apache.camel + org.apache.camel.springboot camel-servlet-starter ${camel.version} - org.apache.camel + org.apache.camel.springboot camel-jackson-starter ${camel.version} - org.apache.camel + org.apache.camel.springboot camel-swagger-java-starter ${camel.version} - org.apache.camel + org.apache.camel.springboot camel-spring-boot-starter ${camel.version} @@ -64,7 +64,8 @@ - 3.0.0-M4 + 11 + 3.15.0 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-libraries-comparison/README.md b/spring-boot-modules/spring-boot-libraries-comparison/README.md index 3efdac2a4c..d373f91b3b 100644 --- a/spring-boot-modules/spring-boot-libraries-comparison/README.md +++ b/spring-boot-modules/spring-boot-libraries-comparison/README.md @@ -4,4 +4,4 @@ This module contains articles about various Spring Boot libraries Comparison ### Relevant Articles: -- [GraphQL vs REST](https://www.baeldung.com/graphql-vs-rest/) \ No newline at end of file +- [GraphQL vs REST](https://www.baeldung.com/graphql-vs-rest) diff --git a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml index 8cf052deb3..036df19887 100644 --- a/spring-boot-modules/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-modules/spring-boot-logging-log4j2/pom.xml @@ -102,6 +102,7 @@ 4.13.2 5.8.1 + 2.17.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-mvc-birt/pom.xml b/spring-boot-modules/spring-boot-mvc-birt/pom.xml index 16b07000f8..8f1c770bbe 100644 --- a/spring-boot-modules/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-modules/spring-boot-mvc-birt/pom.xml @@ -70,6 +70,7 @@ 1.8 4.8.0 1.2.17 + 2.17.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-react/pom.xml b/spring-boot-modules/spring-boot-react/pom.xml index d515aed6ce..dc0c6914c9 100644 --- a/spring-boot-modules/spring-boot-react/pom.xml +++ b/spring-boot-modules/spring-boot-react/pom.xml @@ -11,6 +11,18 @@ 1.0.0-SNAPSHOT + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + + org.springframework.boot @@ -128,6 +140,7 @@ v1.12.1 2.4.4 1.0.2 + 2.17.1 \ No newline at end of file diff --git a/spring-boot-modules/spring-boot-security/README.md b/spring-boot-modules/spring-boot-security/README.md index b9966709cb..d848f798ba 100644 --- a/spring-boot-modules/spring-boot-security/README.md +++ b/spring-boot-modules/spring-boot-security/README.md @@ -10,6 +10,7 @@ This module contains articles about Spring Boot Security - [Guide to @CurrentSecurityContext in Spring Security](https://www.baeldung.com/spring-currentsecuritycontext) - [Disable Security for a Profile in Spring Boot](https://www.baeldung.com/spring-security-disable-profile) - [Spring @EnableWebSecurity vs. @EnableGlobalMethodSecurity](https://www.baeldung.com/spring-enablewebsecurity-vs-enableglobalmethodsecurity) +- [Spring Security – Configuring Different URLs](https://www.baeldung.com/spring-security-configuring-urls) ### Spring Boot Security Auto-Configuration diff --git a/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml b/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml index 82e1951b8e..a7f3e01014 100644 --- a/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml +++ b/spring-boot-modules/spring-boot-swagger-keycloak/pom.xml @@ -24,6 +24,13 @@ pom import + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + @@ -62,6 +69,7 @@ 2.4.5 3.0.0 15.0.2 + 2.17.1 diff --git a/spring-boot-modules/spring-boot-swagger/README.md b/spring-boot-modules/spring-boot-swagger/README.md index 174bfe626d..a09df23a80 100644 --- a/spring-boot-modules/spring-boot-swagger/README.md +++ b/spring-boot-modules/spring-boot-swagger/README.md @@ -5,3 +5,4 @@ - [Generate PDF from Swagger API Documentation](https://www.baeldung.com/swagger-generate-pdf) - [Remove Basic Error Controller In SpringFox Swagger-UI](https://www.baeldung.com/spring-swagger-remove-error-controller) - [Setting Example and Description with Swagger](https://www.baeldung.com/swagger-set-example-description) +- [Document Enum in Swagger](https://www.baeldung.com/swagger-enum) diff --git a/spring-boot-modules/spring-boot-testing/pom.xml b/spring-boot-modules/spring-boot-testing/pom.xml index 658eb7728e..fcfc2364ba 100644 --- a/spring-boot-modules/spring-boot-testing/pom.xml +++ b/spring-boot-modules/spring-boot-testing/pom.xml @@ -14,6 +14,18 @@ 1.0.0-SNAPSHOT + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + + org.springframework.boot @@ -131,6 +143,7 @@ 1.6 0.7.2 2.5.0 + 2.17.1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml index 8546e76586..6e8b130ed1 100644 --- a/spring-cloud/spring-cloud-contract/pom.xml +++ b/spring-cloud/spring-cloud-contract/pom.xml @@ -21,6 +21,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.boot spring-boot-starter-web @@ -55,6 +62,7 @@ 2.1.1.RELEASE 2.1.4.RELEASE + 2.17.1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml index 0b7da2ce4a..e22ad6b7c9 100644 --- a/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml +++ b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml @@ -14,6 +14,18 @@ spring-cloud 1.0.0-SNAPSHOT + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + spring-cloud-eureka-server @@ -32,6 +44,7 @@ 2.1.3.RELEASE Greenwich.SR3 + 2.17.1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-eureka/pom.xml b/spring-cloud/spring-cloud-eureka/pom.xml index e5327d4530..795eab7d6e 100644 --- a/spring-cloud/spring-cloud-eureka/pom.xml +++ b/spring-cloud/spring-cloud-eureka/pom.xml @@ -14,6 +14,18 @@ spring-cloud 1.0.0-SNAPSHOT + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + spring-cloud-eureka-server @@ -34,6 +46,7 @@ 2.1.2.RELEASE Greenwich.RELEASE + 2.17.1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-load-balancer/pom.xml b/spring-cloud/spring-cloud-load-balancer/pom.xml index 9c650565ed..65cf83de09 100644 --- a/spring-cloud/spring-cloud-load-balancer/pom.xml +++ b/spring-cloud/spring-cloud-load-balancer/pom.xml @@ -19,6 +19,18 @@ spring-cloud-loadbalancer-server spring-cloud-loadbalancer-client + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -32,6 +44,7 @@ 2.6.1 2021.0.0 + 2.17.1 diff --git a/spring-cloud/spring-cloud-openfeign/README.md b/spring-cloud/spring-cloud-openfeign/README.md index 5d3dc060c7..44f4d15b16 100644 --- a/spring-cloud/spring-cloud-openfeign/README.md +++ b/spring-cloud/spring-cloud-openfeign/README.md @@ -4,3 +4,4 @@ - [Differences Between Netflix Feign and OpenFeign](https://www.baeldung.com/netflix-feign-vs-openfeign) - [File Upload With Open Feign](https://www.baeldung.com/java-feign-file-upload) - [Feign Logging Configuration](https://www.baeldung.com/java-feign-logging) +- [Provide an OAuth2 Token to a Feign Client](https://www.baeldung.com/spring-cloud-feign-oauth-token) diff --git a/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml index 1c8fa4e694..73d6e62d37 100644 --- a/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml +++ b/spring-cloud/spring-cloud-stream-starters/twitterhdfs/pom.xml @@ -78,6 +78,7 @@ 4.13.2 5.8.1 + 2.17.1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml index 3514924198..b2cb66744b 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml @@ -17,6 +17,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.cloud spring-cloud-starter-parent @@ -45,5 +52,9 @@ test + + + 2.17.1 + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml index dcd912df07..466291650c 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml @@ -17,6 +17,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.cloud spring-cloud-starter-parent @@ -45,5 +52,9 @@ test + + + 2.17.1 + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml index bb38ec1351..27afc3eb69 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml @@ -14,6 +14,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.cloud spring-cloud-starter-parent @@ -53,5 +60,9 @@ test + + + 2.17.1 + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml index 2969b5eed9..4727859ea2 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml @@ -13,6 +13,18 @@ spring-cloud-zuul 0.0.1-SNAPSHOT + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -44,6 +56,7 @@ 2.2.0.RELEASE 2.4.7 2020.0.4 + 2.17.1 \ No newline at end of file diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml index d3be846424..1207506d17 100644 --- a/spring-di-2/pom.xml +++ b/spring-di-2/pom.xml @@ -16,6 +16,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.boot spring-boot-dependencies @@ -80,6 +87,7 @@ 2.6.1 1.11 1 + 2.17.1 \ No newline at end of file diff --git a/spring-di-3/README.md b/spring-di-3/README.md index 9ab7789f37..4246069616 100644 --- a/spring-di-3/README.md +++ b/spring-di-3/README.md @@ -5,4 +5,5 @@ This module contains articles about dependency injection with Spring ### Relevant Articles - [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) +- [Spring @Autowired Field Null – Common Causes and Solutions](https://www.baeldung.com/spring-autowired-field-null) - More articles: [[<-- prev]](../spring-di-2) diff --git a/spring-di-3/pom.xml b/spring-di-3/pom.xml index 0d4bbd01af..c6a2687606 100644 --- a/spring-di-3/pom.xml +++ b/spring-di-3/pom.xml @@ -16,6 +16,13 @@ + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.boot spring-boot-dependencies @@ -40,6 +47,7 @@ 2.6.1 + 2.17.1 \ No newline at end of file diff --git a/spring-native/pom.xml b/spring-native/pom.xml index 4455e050f2..f54d7b5308 100644 --- a/spring-native/pom.xml +++ b/spring-native/pom.xml @@ -75,6 +75,7 @@ 1.8 1.8 1.8 + 2.17.1 \ No newline at end of file diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index b55a334256..ea42095d92 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -625,6 +625,7 @@ 1.0.3 2.0.0.RELEASE 1.2.0 + 2.17.1 \ No newline at end of file diff --git a/spring-security-modules/spring-5-security-oauth/pom.xml b/spring-security-modules/spring-5-security-oauth/pom.xml index aa4958ae47..706cdb3082 100644 --- a/spring-security-modules/spring-5-security-oauth/pom.xml +++ b/spring-security-modules/spring-5-security-oauth/pom.xml @@ -15,6 +15,19 @@ 0.0.1-SNAPSHOT ../../parent-boot-2 + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + + @@ -72,6 +85,7 @@ is available --> 2.5.2 com.baeldung.oauth2.SpringOAuthApplication + 2.17.1 \ No newline at end of file diff --git a/spring-security-modules/spring-security-legacy-oidc/pom.xml b/spring-security-modules/spring-security-legacy-oidc/pom.xml index ca54a6765d..9dd898f9dd 100644 --- a/spring-security-modules/spring-security-legacy-oidc/pom.xml +++ b/spring-security-modules/spring-security-legacy-oidc/pom.xml @@ -14,6 +14,18 @@ 0.0.1-SNAPSHOT ../../parent-boot-2 + + + + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + + + @@ -50,6 +62,7 @@ 1.0.9.RELEASE 0.3.0 2.4.7 + 2.17.1 \ No newline at end of file diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/LoggingController.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/LoggingController.java new file mode 100644 index 0000000000..c2d47fe6d6 --- /dev/null +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/LoggingController.java @@ -0,0 +1,16 @@ +package com.baeldung.logging; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class LoggingController { + + @GetMapping("/logging") + public ResponseEntity logging() { + return new ResponseEntity<>("logging/baeldung", HttpStatus.OK); + } + +} diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java new file mode 100644 index 0000000000..f48f817dd2 --- /dev/null +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityConfig.java @@ -0,0 +1,26 @@ +package com.baeldung.logging; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Value("${spring.websecurity.debug:false}") + boolean webSecurityDebug; + + @Override + public void configure(WebSecurity web) { + web.debug(webSecurityDebug); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/**") + .permitAll(); + } +} diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityLoggingApplication.java b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityLoggingApplication.java new file mode 100644 index 0000000000..2fadf1cc26 --- /dev/null +++ b/spring-security-modules/spring-security-web-boot-3/src/main/java/com/baeldung/logging/SecurityLoggingApplication.java @@ -0,0 +1,14 @@ +package com.baeldung.logging; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SecurityLoggingApplication { + + public static void main(String... args) { + SpringApplication application = new SpringApplication(SecurityLoggingApplication.class); + application.setAdditionalProfiles("logging"); + application.run(args); + } +} diff --git a/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-logging.properties b/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-logging.properties new file mode 100644 index 0000000000..4f0c3450a3 --- /dev/null +++ b/spring-security-modules/spring-security-web-boot-3/src/main/resources/application-logging.properties @@ -0,0 +1,4 @@ + +logging.level.org.springframework.security=DEBUG + +spring.websecurity.debug=true \ No newline at end of file diff --git a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml index 336cb0da74..9add9ae494 100644 --- a/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml +++ b/spring-swagger-codegen/custom-validations-opeanpi-codegen/pom.xml @@ -100,6 +100,7 @@ 11 3.0.0 + 2.17.1 \ No newline at end of file diff --git a/spring-web-modules/spring-boot-jsp/pom.xml b/spring-web-modules/spring-boot-jsp/pom.xml index b9b4a97e6b..d2a363bafa 100644 --- a/spring-web-modules/spring-boot-jsp/pom.xml +++ b/spring-web-modules/spring-boot-jsp/pom.xml @@ -23,6 +23,13 @@ pom import + + org.apache.logging.log4j + log4j-bom + ${log4j2.version} + import + pom + org.springframework.boot spring-boot-dependencies @@ -92,6 +99,7 @@ 1.2 2.4.4 + 2.17.1 \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java index 20f5d02fed..61443a3631 100644 --- a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java +++ b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/DatesController.java @@ -5,8 +5,10 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; +import com.baeldung.thymeleaf.model.Student; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -22,4 +24,17 @@ public class DatesController { return "dates.html"; } + @RequestMapping(value = "/saveStudent", method = RequestMethod.GET) + public String displaySaveStudent(Model model) { + model.addAttribute("student", new Student()); + return "datePicker/saveStudent.html"; + } + + @RequestMapping(value = "/saveStudent", method = RequestMethod.POST) + public String saveStudent(Model model, @ModelAttribute("student") Student student) { + model.addAttribute("student", student); + + return "datePicker/displayDate.html"; + } + } diff --git a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Student.java b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Student.java index 202c04358a..c08985fd61 100644 --- a/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Student.java +++ b/spring-web-modules/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/model/Student.java @@ -1,6 +1,9 @@ package com.baeldung.thymeleaf.model; +import org.springframework.format.annotation.DateTimeFormat; + import java.io.Serializable; +import java.util.Date; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @@ -24,6 +27,9 @@ public class Student implements Serializable { @NotNull(message = "Student gender is required.") private Character gender; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date birthDate; + private Float percentage; public Integer getId() { @@ -50,6 +56,14 @@ public class Student implements Serializable { this.gender = gender; } + public Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(Date birthDate) { + this.birthDate = birthDate; + } + public Float getPercentage() { return percentage; } diff --git a/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/displayDate.html b/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/displayDate.html new file mode 100644 index 0000000000..7ae84e026f --- /dev/null +++ b/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/displayDate.html @@ -0,0 +1,12 @@ + + + + + Baeldung - using a datepicker to submit date + + +

Student birth date

+

+ + \ No newline at end of file diff --git a/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/saveStudent.html b/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/saveStudent.html new file mode 100644 index 0000000000..d897369326 --- /dev/null +++ b/spring-web-modules/spring-thymeleaf/src/main/webapp/WEB-INF/views/datePicker/saveStudent.html @@ -0,0 +1,42 @@ + + + + + Baeldung - using a datepicker to submit date + + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+ +
+
+
+ + \ No newline at end of file