diff --git a/.travis.yml b/.travis.yml
index 5e2d690b4e..683422dc97 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ before_install:
- echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
install: skip
-script: travis_wait 60 mvn -q install -Pdefault
+script: travis_wait 60 mvn -q install -Pdefault-first,default-second
sudo: required
diff --git a/README.md b/README.md
index 8e0a5eb9ee..f3fe5e3bf0 100644
--- a/README.md
+++ b/README.md
@@ -26,3 +26,13 @@ To do the full build, do: `mvn install -Pdefault -Dgib.enabled=false`
Building a single module
====================
To build a specific module run the command: `mvn clean install -Dgib.enabled=false` in the module directory
+
+
+Running a Spring Boot module
+====================
+To run a Spring Boot module run the command: `mvn spring-boot:run -Dgib.enabled=false` in the module directory
+
+
+
+
+
diff --git a/algorithms/README.md b/algorithms/README.md
index 9b3bbcdee5..9d347869bd 100644
--- a/algorithms/README.md
+++ b/algorithms/README.md
@@ -28,3 +28,6 @@
- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points)
- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines)
- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
+- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred)
+- [Merge Sort in Java](https://www.baeldung.com/java-merge-sort)
+- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
diff --git a/algorithms/pom.xml b/algorithms/pom.xml
index eda87d6c75..db4a1c2eff 100644
--- a/algorithms/pom.xml
+++ b/algorithms/pom.xml
@@ -17,6 +17,11 @@
commons-math3
${commons-math3.version}
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
org.projectlombok
lombok
@@ -85,6 +90,7 @@
3.7.0
1.0.1
3.9.0
+ 1.11
\ No newline at end of file
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
new file mode 100644
index 0000000000..d3e251d3fd
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
@@ -0,0 +1,110 @@
+package com.baeldung.algorithms.conversion;
+
+import java.math.BigInteger;
+
+import javax.xml.bind.DatatypeConverter;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
+
+import com.google.common.io.BaseEncoding;
+
+public class HexStringConverter {
+
+ /**
+ * Create a byte Array from String of hexadecimal digits using Character conversion
+ * @param hexString - Hexadecimal digits as String
+ * @return Desired byte Array
+ */
+ public byte[] decodeHexString(String hexString) {
+ if (hexString.length() % 2 == 1) {
+ throw new IllegalArgumentException("Invalid hexadecimal String supplied.");
+ }
+ byte[] bytes = new byte[hexString.length() / 2];
+
+ for (int i = 0; i < hexString.length(); i += 2) {
+ bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
+ }
+ return bytes;
+ }
+
+ /**
+ * Create a String of hexadecimal digits from a byte Array using Character conversion
+ * @param byteArray - The byte Array
+ * @return Desired String of hexadecimal digits in lower case
+ */
+ public String encodeHexString(byte[] byteArray) {
+ StringBuffer hexStringBuffer = new StringBuffer();
+ for (int i = 0; i < byteArray.length; i++) {
+ hexStringBuffer.append(byteToHex(byteArray[i]));
+ }
+ return hexStringBuffer.toString();
+ }
+
+ public String byteToHex(byte num) {
+ char[] hexDigits = new char[2];
+ hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
+ hexDigits[1] = Character.forDigit((num & 0xF), 16);
+ return new String(hexDigits);
+ }
+
+ public byte hexToByte(String hexString) {
+ int firstDigit = toDigit(hexString.charAt(0));
+ int secondDigit = toDigit(hexString.charAt(1));
+ return (byte) ((firstDigit << 4) + secondDigit);
+ }
+
+ private int toDigit(char hexChar) {
+ int digit = Character.digit(hexChar, 16);
+ if(digit == -1) {
+ throw new IllegalArgumentException("Invalid Hexadecimal Character: "+ hexChar);
+ }
+ return digit;
+ }
+
+ public String encodeUsingBigIntegerToString(byte[] bytes) {
+ BigInteger bigInteger = new BigInteger(1, bytes);
+ return bigInteger.toString(16);
+ }
+
+ public String encodeUsingBigIntegerStringFormat(byte[] bytes) {
+ BigInteger bigInteger = new BigInteger(1, bytes);
+ return String.format("%0" + (bytes.length << 1) + "x", bigInteger);
+ }
+
+ public byte[] decodeUsingBigInteger(String hexString) {
+ byte[] byteArray = new BigInteger(hexString, 16).toByteArray();
+ if (byteArray[0] == 0) {
+ byte[] output = new byte[byteArray.length - 1];
+ System.arraycopy(byteArray, 1, output, 0, output.length);
+ return output;
+ }
+ return byteArray;
+ }
+
+ public String encodeUsingDataTypeConverter(byte[] bytes) {
+ return DatatypeConverter.printHexBinary(bytes);
+ }
+
+ public byte[] decodeUsingDataTypeConverter(String hexString) {
+ return DatatypeConverter.parseHexBinary(hexString);
+ }
+
+ public String encodeUsingApacheCommons(byte[] bytes) throws DecoderException {
+ return Hex.encodeHexString(bytes);
+ }
+
+ public byte[] decodeUsingApacheCommons(String hexString) throws DecoderException {
+ return Hex.decodeHex(hexString);
+ }
+
+ public String encodeUsingGuava(byte[] bytes) {
+ return BaseEncoding.base16()
+ .encode(bytes);
+ }
+
+ public byte[] decodeUsingGuava(String hexString) {
+ return BaseEncoding.base16()
+ .decode(hexString.toUpperCase());
+ }
+}
diff --git a/algorithms/src/main/java/com/baeldung/algorithms/heapsort/Heap.java b/algorithms/src/main/java/com/baeldung/algorithms/heapsort/Heap.java
new file mode 100644
index 0000000000..8c98e4fc5c
--- /dev/null
+++ b/algorithms/src/main/java/com/baeldung/algorithms/heapsort/Heap.java
@@ -0,0 +1,136 @@
+package com.baeldung.algorithms.heapsort;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class Heap> {
+
+ private List elements = new ArrayList<>();
+
+ public static > List sort(Iterable elements) {
+ Heap heap = of(elements);
+
+ List result = new ArrayList<>();
+
+ while (!heap.isEmpty()) {
+ result.add(heap.pop());
+ }
+
+ return result;
+ }
+
+ public static > Heap of(E... elements) {
+ return of(Arrays.asList(elements));
+ }
+
+ public static > Heap of(Iterable elements) {
+ Heap result = new Heap<>();
+ for (E element : elements) {
+ result.add(element);
+ }
+ return result;
+ }
+
+ public void add(E e) {
+ elements.add(e);
+ int elementIndex = elements.size() - 1;
+ while (!isRoot(elementIndex) && !isCorrectChild(elementIndex)) {
+ int parentIndex = parentIndex(elementIndex);
+ swap(elementIndex, parentIndex);
+ elementIndex = parentIndex;
+ }
+ }
+
+ public E pop() {
+ if (isEmpty()) {
+ throw new IllegalStateException("You cannot pop from an empty heap");
+ }
+
+ E result = elementAt(0);
+
+ int lasElementIndex = elements.size() - 1;
+ swap(0, lasElementIndex);
+ elements.remove(lasElementIndex);
+
+ int elementIndex = 0;
+ while (!isLeaf(elementIndex) && !isCorrectParent(elementIndex)) {
+ int smallerChildIndex = smallerChildIndex(elementIndex);
+ swap(elementIndex, smallerChildIndex);
+ elementIndex = smallerChildIndex;
+ }
+
+ return result;
+ }
+
+ public boolean isEmpty() {
+ return elements.isEmpty();
+ }
+
+ private boolean isRoot(int index) {
+ return index == 0;
+ }
+
+ private int smallerChildIndex(int index) {
+ int leftChildIndex = leftChildIndex(index);
+ int rightChildIndex = rightChildIndex(index);
+
+ if (!isValidIndex(rightChildIndex)) {
+ return leftChildIndex;
+ }
+
+ if (elementAt(leftChildIndex).compareTo(elementAt(rightChildIndex)) < 0) {
+ return leftChildIndex;
+ }
+
+ return rightChildIndex;
+ }
+
+ private boolean isLeaf(int index) {
+ return !isValidIndex(leftChildIndex(index));
+ }
+
+ private boolean isCorrectParent(int index) {
+ return isCorrect(index, leftChildIndex(index)) && isCorrect(index, rightChildIndex(index));
+ }
+
+ private boolean isCorrectChild(int index) {
+ return isCorrect(parentIndex(index), index);
+ }
+
+ private boolean isCorrect(int parentIndex, int childIndex) {
+ if (!isValidIndex(parentIndex) || !isValidIndex(childIndex)) {
+ return true;
+ }
+
+ return elementAt(parentIndex).compareTo(elementAt(childIndex)) < 0;
+ }
+
+ private boolean isValidIndex(int index) {
+ return index < elements.size();
+ }
+
+ private void swap(int index1, int index2) {
+ E element1 = elementAt(index1);
+ E element2 = elementAt(index2);
+ elements.set(index1, element2);
+ elements.set(index2, element1);
+ }
+
+ private E elementAt(int index) {
+ return elements.get(index);
+ }
+
+ private int parentIndex(int index) {
+ return (index - 1) / 2;
+ }
+
+ private int leftChildIndex(int index) {
+ return 2 * index + 1;
+ }
+
+ private int rightChildIndex(int index) {
+ return 2 * index + 2;
+ }
+
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
new file mode 100644
index 0000000000..be61802705
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
@@ -0,0 +1,127 @@
+package com.baeldung.algorithms.conversion;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import org.apache.commons.codec.DecoderException;
+import org.hamcrest.text.IsEqualIgnoringCase;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.algorithms.conversion.HexStringConverter;
+
+public class ByteArrayConverterUnitTest {
+
+ private HexStringConverter hexStringConverter;
+
+ @Before
+ public void setup() {
+ hexStringConverter = new HexStringConverter();
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringUsingBigIntegerToString() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ if(hexString.charAt(0) == '0') {
+ hexString = hexString.substring(1);
+ }
+ String output = hexStringConverter.encodeUsingBigIntegerToString(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringUsingBigIntegerStringFormat() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ String output = hexStringConverter.encodeUsingBigIntegerStringFormat(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldDecodeHexStringToByteArrayUsingBigInteger() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ byte[] output = hexStringConverter.decodeUsingBigInteger(hexString);
+ assertArrayEquals(bytes, output);
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringUsingCharacterConversion() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ String output = hexStringConverter.encodeHexString(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldDecodeHexStringToByteArrayUsingCharacterConversion() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ byte[] output = hexStringConverter.decodeHexString(hexString);
+ assertArrayEquals(bytes, output);
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void shouldDecodeHexToByteWithInvalidHexCharacter() {
+ hexStringConverter.hexToByte("fg");
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringDataTypeConverter() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ String output = hexStringConverter.encodeUsingDataTypeConverter(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldDecodeHexStringToByteArrayUsingDataTypeConverter() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ byte[] output = hexStringConverter.decodeUsingDataTypeConverter(hexString);
+ assertArrayEquals(bytes, output);
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringUsingGuava() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ String output = hexStringConverter.encodeUsingGuava(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldDecodeHexStringToByteArrayUsingGuava() {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ byte[] output = hexStringConverter.decodeUsingGuava(hexString);
+ assertArrayEquals(bytes, output);
+ }
+
+ @Test
+ public void shouldEncodeByteArrayToHexStringUsingApacheCommons() throws DecoderException {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ String output = hexStringConverter.encodeUsingApacheCommons(bytes);
+ assertThat(output, IsEqualIgnoringCase.equalToIgnoringCase(hexString));
+ }
+
+ @Test
+ public void shouldDecodeHexStringToByteArrayUsingApacheCommons() throws DecoderException {
+ byte[] bytes = getSampleBytes();
+ String hexString = getSampleHexString();
+ byte[] output = hexStringConverter.decodeUsingApacheCommons(hexString);
+ assertArrayEquals(bytes, output);
+ }
+
+ private String getSampleHexString() {
+ return "0af50c0e2d10";
+ }
+
+ private byte[] getSampleBytes() {
+ return new byte[] { 10, -11, 12, 14, 45, 16 };
+ }
+
+}
diff --git a/algorithms/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java b/algorithms/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java
new file mode 100644
index 0000000000..96e4936eaf
--- /dev/null
+++ b/algorithms/src/test/java/com/baeldung/algorithms/heapsort/HeapUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.algorithms.heapsort;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+public class HeapUnitTest {
+
+ @Test
+ public void givenNotEmptyHeap_whenPopCalled_thenItShouldReturnSmallestElement() {
+ // given
+ Heap heap = Heap.of(3, 5, 1, 4, 2);
+
+ // when
+ int head = heap.pop();
+
+ // then
+ assertThat(head).isEqualTo(1);
+ }
+
+ @Test
+ public void givenNotEmptyIterable_whenSortCalled_thenItShouldReturnElementsInSortedList() {
+ // given
+ List elements = Arrays.asList(3, 5, 1, 4, 2);
+
+ // when
+ List sortedElements = Heap.sort(elements);
+
+ // then
+ assertThat(sortedElements).isEqualTo(Arrays.asList(1, 2, 3, 4, 5));
+ }
+
+}
diff --git a/apache-pulsar/.gitignore b/apache-pulsar/.gitignore
new file mode 100755
index 0000000000..1c53e03007
--- /dev/null
+++ b/apache-pulsar/.gitignore
@@ -0,0 +1,8 @@
+.classpath
+.project
+.settings
+target
+.idea
+*.iml
+.gradle/
+build/
diff --git a/apache-pulsar/pom.xml b/apache-pulsar/pom.xml
new file mode 100644
index 0000000000..da004a7638
--- /dev/null
+++ b/apache-pulsar/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+ com.baeldung.pulsar
+ pulsar-java
+ 0.0.1
+
+
+
+ org.apache.pulsar
+ pulsar-client
+ 2.1.1-incubating
+ compile
+
+
+
+ 1.8
+ 1.8
+
+
diff --git a/apache-pulsar/src/main/java/com/baeldung/ConsumerTest.java b/apache-pulsar/src/main/java/com/baeldung/ConsumerTest.java
new file mode 100755
index 0000000000..72dc10b542
--- /dev/null
+++ b/apache-pulsar/src/main/java/com/baeldung/ConsumerTest.java
@@ -0,0 +1,48 @@
+package com.baeldung;
+
+import java.io.IOException;
+
+import org.apache.pulsar.client.api.Consumer;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.SubscriptionType;
+
+public class ConsumerTest {
+
+ private static final String SERVICE_URL = "pulsar://localhost:6650";
+ private static final String TOPIC_NAME = "test-topic";
+ private static final String SUBSCRIPTION_NAME = "test-subscription";
+
+ public static void main(String[] args) throws IOException {
+ // Create a Pulsar client instance. A single instance can be shared across many
+ // producers and consumer within the same application
+ PulsarClient client = PulsarClient.builder()
+ .serviceUrl(SERVICE_URL)
+ .build();
+
+ //Configure consumer specific settings.
+ Consumer consumer = client.newConsumer()
+ .topic(TOPIC_NAME)
+ // Allow multiple consumers to attach to the same subscription
+ // and get messages dispatched as a queue
+ .subscriptionType(SubscriptionType.Shared)
+ .subscriptionName(SUBSCRIPTION_NAME)
+ .subscribe();
+
+
+ // Once the consumer is created, it can be used for the entire application lifecycle
+ System.out.println("Created consumer for the topic "+ TOPIC_NAME);
+
+ do {
+ // Wait until a message is available
+ Message msg = consumer.receive();
+
+ // Extract the message as a printable string and then log
+ String content = new String(msg.getData());
+ System.out.println("Received message '"+content+"' with ID "+msg.getMessageId());
+
+ // Acknowledge processing of the message so that it can be deleted
+ consumer.acknowledge(msg);
+ } while (true);
+ }
+}
diff --git a/apache-pulsar/src/main/java/com/baeldung/ProducerTest.java b/apache-pulsar/src/main/java/com/baeldung/ProducerTest.java
new file mode 100755
index 0000000000..08ee0e89b9
--- /dev/null
+++ b/apache-pulsar/src/main/java/com/baeldung/ProducerTest.java
@@ -0,0 +1,58 @@
+package com.baeldung;
+
+import org.apache.pulsar.client.api.CompressionType;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageBuilder;
+import org.apache.pulsar.client.api.MessageId;
+import org.apache.pulsar.client.api.Producer;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.PulsarClientException;
+
+import java.io.IOException;
+import java.util.stream.IntStream;
+
+public class ProducerTest {
+
+ private static final String SERVICE_URL = "pulsar://localhost:6650";
+ private static final String TOPIC_NAME = "test-topic";
+
+ public static void main(String[] args) throws IOException {
+ // Create a Pulsar client instance. A single instance can be shared across many
+ // producers and consumer within the same application
+ PulsarClient client = PulsarClient.builder()
+ .serviceUrl(SERVICE_URL)
+ .build();
+
+ // Configure producer specific settings
+ Producer producer = client.newProducer()
+ // Set the topic
+ .topic(TOPIC_NAME)
+ // Enable compression
+ .compressionType(CompressionType.LZ4)
+ .create();
+
+ // Once the producer is created, it can be used for the entire application life-cycle
+ System.out.println("Created producer for the topic "+TOPIC_NAME);
+
+ // Send 5 test messages
+ IntStream.range(1, 5).forEach(i -> {
+ String content = String.format("hi-pulsar-%d", i);
+
+ // Build a message object
+ Message msg = MessageBuilder.create()
+ .setContent(content.getBytes())
+ .build();
+
+ // Send each message and log message content and ID when successfully received
+ try {
+ MessageId msgId = producer.send(msg);
+
+ System.out.println("Published message '"+content+"' with the ID "+msgId);
+ } catch (PulsarClientException e) {
+ System.out.println(e.getMessage());
+ }
+ });
+
+ client.close();
+ }
+}
diff --git a/apache-pulsar/src/main/java/com/baeldung/subscriptions/ExclusiveSubscriptionTest.java b/apache-pulsar/src/main/java/com/baeldung/subscriptions/ExclusiveSubscriptionTest.java
new file mode 100644
index 0000000000..efb898eaf4
--- /dev/null
+++ b/apache-pulsar/src/main/java/com/baeldung/subscriptions/ExclusiveSubscriptionTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.subscriptions;
+
+import org.apache.pulsar.client.api.ConsumerBuilder;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageBuilder;
+import org.apache.pulsar.client.api.Producer;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.PulsarClientException;
+import org.apache.pulsar.client.api.SubscriptionType;
+
+import java.util.stream.IntStream;
+
+public class ExclusiveSubscriptionTest {
+ private static final String SERVICE_URL = "pulsar://localhost:6650";
+ private static final String TOPIC_NAME = "test-topic";
+ private static final String SUBSCRIPTION_NAME = "test-subscription";
+ private static final SubscriptionType SUBSCRIPTION_TYPE = SubscriptionType.Exclusive;
+
+ public static void main(String[] args) throws PulsarClientException {
+ PulsarClient client = PulsarClient.builder()
+ .serviceUrl(SERVICE_URL)
+ .build();
+
+ Producer producer = client.newProducer()
+ .topic(TOPIC_NAME)
+ .create();
+
+ ConsumerBuilder consumer1 = client.newConsumer()
+ .topic(TOPIC_NAME)
+ .subscriptionName(SUBSCRIPTION_NAME)
+ .subscriptionType(SUBSCRIPTION_TYPE);
+
+ ConsumerBuilder consumer2 = client.newConsumer()
+ .topic(TOPIC_NAME)
+ .subscriptionName(SUBSCRIPTION_NAME)
+ .subscriptionType(SUBSCRIPTION_TYPE);
+
+ IntStream.range(0, 999).forEach(i -> {
+ Message msg = MessageBuilder.create()
+ .setContent(String.format("message-%d", i).getBytes())
+ .build();
+ try {
+ producer.send(msg);
+ } catch (PulsarClientException e) {
+ System.out.println(e.getMessage());
+ }
+ });
+
+ // Consumer 1 can subscribe to the topic
+ consumer1.subscribe();
+
+ // Consumer 2 cannot due to the exclusive subscription held by consumer 1
+ consumer2.subscribeAsync()
+ .handle((consumer, exception) -> {
+ System.out.println(exception.getMessage());
+ return null;
+ });
+ }
+}
diff --git a/apache-pulsar/src/main/java/com/baeldung/subscriptions/FailoverSubscriptionTest.java b/apache-pulsar/src/main/java/com/baeldung/subscriptions/FailoverSubscriptionTest.java
new file mode 100644
index 0000000000..545661e0c3
--- /dev/null
+++ b/apache-pulsar/src/main/java/com/baeldung/subscriptions/FailoverSubscriptionTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.subscriptions;
+
+import org.apache.pulsar.client.api.Consumer;
+import org.apache.pulsar.client.api.ConsumerBuilder;
+import org.apache.pulsar.client.api.Message;
+import org.apache.pulsar.client.api.MessageBuilder;
+import org.apache.pulsar.client.api.Producer;
+import org.apache.pulsar.client.api.PulsarClient;
+import org.apache.pulsar.client.api.PulsarClientException;
+import org.apache.pulsar.client.api.SubscriptionType;
+
+import java.util.stream.IntStream;
+
+public class FailoverSubscriptionTest {
+ private static final String SERVICE_URL = "pulsar://localhost:6650";
+ private static final String TOPIC_NAME = "failover-subscription-test-topic";
+ private static final String SUBSCRIPTION_NAME = "test-subscription";
+ private static final SubscriptionType SUBSCRIPTION_TYPE = SubscriptionType.Failover;
+ private static final int NUM_MSGS = 10;
+
+ public static void main(String[] args) throws PulsarClientException {
+ PulsarClient client = PulsarClient.builder()
+ .serviceUrl(SERVICE_URL)
+ .build();
+
+ Producer producer = client.newProducer()
+ .topic(TOPIC_NAME)
+ .create();
+
+ ConsumerBuilder consumerBuilder = client.newConsumer()
+ .topic(TOPIC_NAME)
+ .subscriptionName(SUBSCRIPTION_NAME)
+ .subscriptionType(SUBSCRIPTION_TYPE);
+
+ Consumer mainConsumer = consumerBuilder
+ .consumerName("consumer-a")
+ .messageListener((consumer, msg) -> {
+ System.out.println("Message received by main consumer");
+
+ try {
+ consumer.acknowledge(msg);
+ } catch (PulsarClientException e) {
+ System.out.println(e.getMessage());
+ }
+ })
+ .subscribe();
+
+ Consumer failoverConsumer = consumerBuilder
+ .consumerName("consumer-b")
+ .messageListener((consumer, msg) -> {
+ System.out.println("Message received by failover consumer");
+
+ try {
+ consumer.acknowledge(msg);
+ } catch (PulsarClientException e) {
+ System.out.println(e.getMessage());
+ }
+ })
+ .subscribe();
+
+ IntStream.range(0, NUM_MSGS).forEach(i -> {
+ Message msg = MessageBuilder.create()
+ .setContent(String.format("message-%d", i).getBytes())
+ .build();
+ try {
+ producer.send(msg);
+
+ Thread.sleep(100);
+
+ if (i > 5) mainConsumer.close();
+ } catch (InterruptedException | PulsarClientException e) {
+ System.out.println(e.getMessage());
+ }
+ });
+ }
+}
diff --git a/aws/README.md b/aws/README.md
index d23937a419..2c61928095 100644
--- a/aws/README.md
+++ b/aws/README.md
@@ -9,4 +9,4 @@
- [Integration Testing with a Local DynamoDB Instance](http://www.baeldung.com/dynamodb-local-integration-tests)
- [Using the JetS3t Java Client With Amazon S3](http://www.baeldung.com/jets3t-amazon-s3)
- [Managing Amazon SQS Queues in Java](http://www.baeldung.com/aws-queues-java)
-
+- [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java)
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 64d423aafe..ffd629a170 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -32,3 +32,4 @@
- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone)
- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
+- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
diff --git a/core-java-9/README.md b/core-java-9/README.md
index bf07cfcc86..38816471aa 100644
--- a/core-java-9/README.md
+++ b/core-java-9/README.md
@@ -26,3 +26,4 @@
- [Iterate Through a Range of Dates in Java](https://www.baeldung.com/java-iterate-date-range)
- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Java 9 Platform Logging API](https://www.baeldung.com/java-9-logging-api)
+- [Guide to java.lang.Process API](https://www.baeldung.com/java-process-api)
diff --git a/core-java-collections/README.md b/core-java-collections/README.md
index d9d768961c..684beda281 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -4,37 +4,23 @@
### Relevant Articles:
- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
-- [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array)
-- [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array)
-- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list)
-- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set)
- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
- [Random List Element](http://www.baeldung.com/java-random-list-element)
- [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections)
-- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap)
-- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap)
-- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap)
-- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap)
-- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap)
- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [HashSet and TreeSet Comparison](http://www.baeldung.com/java-hashset-vs-treeset)
-- [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map)
- [Collect a Java Stream to an Immutable Collection](http://www.baeldung.com/java-stream-immutable-collection)
-- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque)
- [A Guide to HashSet in Java](http://www.baeldung.com/java-hashset)
- [A Guide to TreeSet in Java](http://www.baeldung.com/java-tree-set)
-- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap)
- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list)
-- [How to Store Duplicate Keys in a Map in Java?](http://www.baeldung.com/java-map-duplicate-keys)
- [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size)
- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards)
- [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering)
- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list)
-- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
- [Initializing HashSet at the Time of Construction](http://www.baeldung.com/java-initialize-hashset)
- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
@@ -47,8 +33,8 @@
- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
-- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
-- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
- [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity)
+- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
+- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
diff --git a/core-java-collections/pom.xml b/core-java-collections/pom.xml
index b4a6e26d13..39ddc17684 100644
--- a/core-java-collections/pom.xml
+++ b/core-java-collections/pom.xml
@@ -14,22 +14,11 @@
-
- net.sourceforge.collections
- collections-generic
- ${collections-generic.version}
-
org.apache.commons
commons-collections4
${commons-collections4.version}
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
org.apache.commons
commons-lang3
@@ -67,12 +56,6 @@
commons-exec
1.3
-
-
- one.util
- streamex
- 0.6.5
-
diff --git a/core-java-collections/src/main/java/com/baeldung/enumset/EnumSets.java b/core-java-collections/src/main/java/com/baeldung/enumset/EnumSets.java
new file mode 100644
index 0000000000..7b93ed8737
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/enumset/EnumSets.java
@@ -0,0 +1,45 @@
+package com.baeldung.enumset;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
+public class EnumSets {
+
+ public enum Color {
+ RED, YELLOW, GREEN, BLUE, BLACK, WHITE
+ }
+
+ public static void main(String[] args) {
+ EnumSet allColors = EnumSet.allOf(Color.class);
+ System.out.println(allColors);
+
+ EnumSet noColors = EnumSet.noneOf(Color.class);
+ System.out.println(noColors);
+
+ EnumSet blackAndWhite = EnumSet.of(Color.BLACK, Color.WHITE);
+ System.out.println(blackAndWhite);
+
+ EnumSet noBlackOrWhite = EnumSet.complementOf(blackAndWhite);
+ System.out.println(noBlackOrWhite);
+
+ EnumSet range = EnumSet.range(Color.YELLOW, Color.BLUE);
+ System.out.println(range);
+
+ EnumSet blackAndWhiteCopy = EnumSet.copyOf(EnumSet.of(Color.BLACK, Color.WHITE));
+ System.out.println(blackAndWhiteCopy);
+
+ List colorsList = new ArrayList<>();
+ colorsList.add(Color.RED);
+ EnumSet listCopy = EnumSet.copyOf(colorsList);
+ System.out.println(listCopy);
+
+ EnumSet set = EnumSet.noneOf(Color.class);
+ set.add(Color.RED);
+ set.add(Color.YELLOW);
+ set.contains(Color.RED);
+ set.forEach(System.out::println);
+ set.remove(Color.RED);
+ }
+
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java b/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
new file mode 100644
index 0000000000..2f5e91596f
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
@@ -0,0 +1,19 @@
+package com.baeldung.removal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class CollectionRemoveIf {
+
+ public static void main(String args[]) {
+ Collection names = new ArrayList<>();
+ names.add("John");
+ names.add("Ana");
+ names.add("Mary");
+ names.add("Anthony");
+ names.add("Mark");
+
+ names.removeIf(e -> e.startsWith("A"));
+ System.out.println(String.join(",", names));
+ }
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java b/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
new file mode 100644
index 0000000000..86b91b3fdc
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
@@ -0,0 +1,28 @@
+package com.baeldung.removal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+public class Iterators {
+
+ public static void main(String args[]) {
+ Collection names = new ArrayList<>();
+ names.add("John");
+ names.add("Ana");
+ names.add("Mary");
+ names.add("Anthony");
+ names.add("Mark");
+
+ Iterator i = names.iterator();
+
+ while (i.hasNext()) {
+ String e = i.next();
+ if (e.startsWith("A")) {
+ i.remove();
+ }
+ }
+
+ System.out.println(String.join(",", names));
+ }
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java b/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
new file mode 100644
index 0000000000..bf6db68bae
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
@@ -0,0 +1,23 @@
+package com.baeldung.removal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+public class StreamFilterAndCollector {
+
+ public static void main(String args[]) {
+ Collection names = new ArrayList<>();
+ names.add("John");
+ names.add("Ana");
+ names.add("Mary");
+ names.add("Anthony");
+ names.add("Mark");
+
+ Collection filteredCollection = names
+ .stream()
+ .filter(e -> !e.startsWith("A"))
+ .collect(Collectors.toList());
+ System.out.println(String.join(",", filteredCollection));
+ }
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java b/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
new file mode 100644
index 0000000000..c77e996616
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
@@ -0,0 +1,28 @@
+package com.baeldung.removal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class StreamPartitioningBy {
+
+ public static void main(String args[]) {
+ Collection names = new ArrayList<>();
+ names.add("John");
+ names.add("Ana");
+ names.add("Mary");
+ names.add("Anthony");
+ names.add("Mark");
+
+ Map> classifiedElements = names
+ .stream()
+ .collect(Collectors.partitioningBy((String e) -> !e.startsWith("A")));
+
+ String matching = String.join(",", classifiedElements.get(Boolean.TRUE));
+ String nonMatching = String.join(",", classifiedElements.get(Boolean.FALSE));
+ System.out.println("Matching elements: " + matching);
+ System.out.println("Non matching elements: " + nonMatching);
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java b/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java
new file mode 100644
index 0000000000..326ea9fbe4
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java
@@ -0,0 +1,89 @@
+package com.baeldung.findItems;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+
+public class FindItemsBasedOnOtherStreamUnitTest {
+
+ private List employeeList = new ArrayList();
+
+ private List departmentList = new ArrayList();
+
+ @Test
+ public void givenDepartmentList_thenEmployeeListIsFilteredCorrectly() {
+ Integer expectedId = 1002;
+
+ populate(employeeList, departmentList);
+
+ List filteredList = employeeList.stream()
+ .filter(empl -> departmentList.stream()
+ .anyMatch(dept -> dept.getDepartment()
+ .equals("sales") && empl.getEmployeeId()
+ .equals(dept.getEmployeeId())))
+ .collect(Collectors.toList());
+
+ assertEquals(expectedId, filteredList.get(0)
+ .getEmployeeId());
+ }
+
+ private void populate(List EmplList, List deptList) {
+ Employee employee1 = new Employee(1001, "empl1");
+ Employee employee2 = new Employee(1002, "empl2");
+ Employee employee3 = new Employee(1003, "empl3");
+
+ Collections.addAll(EmplList, employee1, employee2, employee3);
+
+ Department department1 = new Department(1002, "sales");
+ Department department2 = new Department(1003, "marketing");
+ Department department3 = new Department(1004, "sales");
+
+ Collections.addAll(deptList, department1, department2, department3);
+ }
+}
+
+class Employee {
+ private Integer employeeId;
+ private String employeeName;
+
+ Employee(Integer employeeId, String employeeName) {
+ super();
+ this.employeeId = employeeId;
+ this.employeeName = employeeName;
+ }
+
+ Integer getEmployeeId() {
+ return employeeId;
+ }
+
+ public String getEmployeeName() {
+ return employeeName;
+ }
+
+}
+
+class Department {
+ private Integer employeeId;
+ private String department;
+
+ Department(Integer employeeId, String department) {
+ super();
+ this.employeeId = employeeId;
+ this.department = department;
+ }
+
+ Integer getEmployeeId() {
+ return employeeId;
+ }
+
+ String getDepartment() {
+ return department;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java b/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
new file mode 100644
index 0000000000..1b379f32de
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.removal;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+public class RemovalUnitTest {
+
+ Collection names;
+ Collection expected;
+ Collection removed;
+
+ @Before
+ public void setupTestData() {
+ names = new ArrayList<>();
+ expected = new ArrayList<>();
+ removed = new ArrayList<>();
+
+ names.add("John");
+ names.add("Ana");
+ names.add("Mary");
+ names.add("Anthony");
+ names.add("Mark");
+
+ expected.add("John");
+ expected.add("Mary");
+ expected.add("Mark");
+
+ removed.add("Ana");
+ removed.add("Anthony");
+ }
+
+ @Test
+ public void givenCollectionOfNames_whenUsingIteratorToRemoveAllNamesStartingWithLetterA_finalListShouldContainNoNamesStartingWithLetterA() {
+ Iterator i = names.iterator();
+
+ while (i.hasNext()) {
+ String e = i.next();
+ if (e.startsWith("A")) {
+ i.remove();
+ }
+ }
+
+ assertThat(names, is(expected));
+ }
+
+ @Test
+ public void givenCollectionOfNames_whenUsingRemoveIfToRemoveAllNamesStartingWithLetterA_finalListShouldContainNoNamesStartingWithLetterA() {
+ names.removeIf(e -> e.startsWith("A"));
+ assertThat(names, is(expected));
+ }
+
+ @Test
+ public void givenCollectionOfNames_whenUsingStreamToFilterAllNamesStartingWithLetterA_finalListShouldContainNoNamesStartingWithLetterA() {
+ Collection filteredCollection = names
+ .stream()
+ .filter(e -> !e.startsWith("A"))
+ .collect(Collectors.toList());
+ assertThat(filteredCollection, is(expected));
+ }
+
+ @Test
+ public void givenCollectionOfNames_whenUsingStreamAndPartitioningByToFindNamesThatStartWithLetterA_shouldFind3MatchingAnd2NonMatching() {
+ Map> classifiedElements = names
+ .stream()
+ .collect(Collectors.partitioningBy((String e) -> !e.startsWith("A")));
+
+ assertThat(classifiedElements.get(Boolean.TRUE), is(expected));
+ assertThat(classifiedElements.get(Boolean.FALSE), is(removed));
+ }
+
+}
diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md
index d775d24dff..eeb9a83748 100644
--- a/core-java-concurrency/README.md
+++ b/core-java-concurrency/README.md
@@ -29,3 +29,4 @@
- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer)
- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle)
- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable)
+- [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield)
diff --git a/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
index 45d2ec68e4..d9cf8ae019 100644
--- a/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
+++ b/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
@@ -184,5 +184,25 @@ public class CompletableFutureLongRunningUnitTest {
assertEquals("Hello World", future.get());
}
+
+ @Test
+ public void whenPassingTransformation_thenFunctionExecutionWithThenApply() throws InterruptedException, ExecutionException {
+ CompletableFuture finalResult = compute().thenApply(s -> s + 1);
+ assertTrue(finalResult.get() == 11);
+ }
+
+ @Test
+ public void whenPassingPreviousStage_thenFunctionExecutionWithThenCompose() throws InterruptedException, ExecutionException {
+ CompletableFuture finalResult = compute().thenCompose(this::computeAnother);
+ assertTrue(finalResult.get() == 20);
+ }
+
+ public CompletableFuture compute(){
+ return CompletableFuture.supplyAsync(() -> 10);
+ }
+
+ public CompletableFuture computeAnother(Integer i){
+ return CompletableFuture.supplyAsync(() -> 10 + i);
+ }
}
\ No newline at end of file
diff --git a/core-java-io/src/main/resources/zipTest/test1.txt b/core-java-io/src/main/resources/zipTest/test1.txt
new file mode 100644
index 0000000000..e88ded96ab
--- /dev/null
+++ b/core-java-io/src/main/resources/zipTest/test1.txt
@@ -0,0 +1 @@
+Test1
\ No newline at end of file
diff --git a/core-java-io/src/main/resources/zipTest/test2.txt b/core-java-io/src/main/resources/zipTest/test2.txt
new file mode 100644
index 0000000000..da8f209890
--- /dev/null
+++ b/core-java-io/src/main/resources/zipTest/test2.txt
@@ -0,0 +1 @@
+Test2
\ No newline at end of file
diff --git a/core-java/README.md b/core-java/README.md
index a117d1843d..1cbbfe2b39 100644
--- a/core-java/README.md
+++ b/core-java/README.md
@@ -29,7 +29,6 @@
- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
-- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng)
- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging)
@@ -150,3 +149,11 @@
- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception)
- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
+- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root)
+- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string)
+- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
+- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
+- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
+- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing)
+- [Java Switch Statement](https://www.baeldung.com/java-switch)
+- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
diff --git a/core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java b/core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
new file mode 100644
index 0000000000..7d7dec85b0
--- /dev/null
+++ b/core-java/src/main/java/com/baeldung/array/ArrayReferenceGuide.java
@@ -0,0 +1,159 @@
+package com.baeldung.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class ArrayReferenceGuide {
+
+ public static void main(String[] args) {
+ declaration();
+
+ initialization();
+
+ access();
+
+ iterating();
+
+ varargs();
+
+ transformIntoList();
+
+ transformIntoStream();
+
+ sort();
+
+ search();
+
+ merge();
+ }
+
+ private static void declaration() {
+ int[] anArray;
+ int anotherArray[];
+ }
+
+ private static void initialization() {
+ int[] anArray = new int[10];
+ anArray[0] = 10;
+ anArray[5] = 4;
+
+ int[] anotherArray = new int[] {1, 2, 3, 4, 5};
+ }
+
+ private static void access() {
+ int[] anArray = new int[10];
+ anArray[0] = 10;
+ anArray[5] = 4;
+
+ System.out.println(anArray[0]);
+ }
+
+ private static void iterating() {
+ int[] anArray = new int[] {1, 2, 3, 4, 5};
+ for (int i = 0; i < anArray.length; i++) {
+ System.out.println(anArray[i]);
+ }
+
+ for (int element : anArray) {
+ System.out.println(element);
+ }
+ }
+
+ private static void varargs() {
+ String[] groceries = new String[] {"Milk", "Tomato", "Chips"};
+ varargMethod(groceries);
+ varargMethod("Milk", "Tomato", "Chips");
+ }
+
+ private static void varargMethod(String... varargs) {
+ for (String element : varargs) {
+ System.out.println(element);
+ }
+ }
+
+ private static void transformIntoList() {
+ Integer[] anArray = new Integer[] {1, 2, 3, 4, 5};
+
+ // Naïve implementation
+ List aList = new ArrayList<>(); // We create an empty list
+ for (int element : anArray) {
+ // We iterate over array's elements and add them to the list
+ aList.add(element);
+ }
+
+ // Pretty implementation
+ aList = Arrays.asList(anArray);
+
+ // Drawbacks
+ try {
+ aList.remove(0);
+ } catch (UnsupportedOperationException e) {
+ System.out.println(e.getMessage());
+ }
+
+ try {
+ aList.add(6);
+ } catch (UnsupportedOperationException e) {
+ System.out.println(e.getMessage());
+ }
+
+ int[] anotherArray = new int[] {1, 2, 3, 4, 5};
+// List anotherList = Arrays.asList(anotherArray);
+ }
+
+ private static void transformIntoStream() {
+ int[] anArray = new int[] {1, 2, 3, 4, 5};
+ IntStream aStream = Arrays.stream(anArray);
+
+ Integer[] anotherArray = new Integer[] {1, 2, 3, 4, 5};
+ Stream anotherStream = Arrays.stream(anotherArray, 2, 4);
+ }
+
+ private static void sort() {
+ int[] anArray = new int[] {5, 2, 1, 4, 8};
+ Arrays.sort(anArray); // anArray is now {1, 2, 4, 5, 8}
+
+ Integer[] anotherArray = new Integer[] {5, 2, 1, 4, 8};
+ Arrays.sort(anotherArray); // anArray is now {1, 2, 4, 5, 8}
+
+ String[] yetAnotherArray = new String[] {"A", "E", "Z", "B", "C"};
+ Arrays.sort(yetAnotherArray, 1, 3, Comparator.comparing(String::toString).reversed()); // yetAnotherArray is now {"A", "Z", "E", "B", "C"}
+ }
+
+ private static void search() {
+ int[] anArray = new int[] {5, 2, 1, 4, 8};
+ for (int i = 0; i < anArray.length; i++) {
+ if (anArray[i] == 4) {
+ System.out.println("Found at index " + i);
+ break;
+ }
+ }
+
+ Arrays.sort(anArray);
+ int index = Arrays.binarySearch(anArray, 4);
+ System.out.println("Found at index " + index);
+ }
+
+ private static void merge() {
+ int[] anArray = new int[] {5, 2, 1, 4, 8};
+ int[] anotherArray = new int[] {10, 4, 9, 11, 2};
+
+ int[] resultArray = new int[anArray.length + anotherArray.length];
+ for (int i = 0; i < resultArray.length; i++) {
+ resultArray[i] = (i < anArray.length ? anArray[i] : anotherArray[i - anArray.length]);
+ }
+ for (int element : resultArray) {
+ System.out.println(element);
+ }
+
+ Arrays.setAll(resultArray, i -> (i < anArray.length ? anArray[i] : anotherArray[i - anArray.length]));
+ for (int element : resultArray) {
+ System.out.println(element);
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
new file mode 100644
index 0000000000..8b3685adf3
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.modulo;
+
+import org.junit.Test;
+import static org.assertj.core.api.Java6Assertions.*;
+
+public class ModuloUnitTest {
+
+ @Test
+ public void whenIntegerDivision_thenLosesRemainder(){
+ assertThat(11 / 4).isEqualTo(2);
+ }
+
+ @Test
+ public void whenDoubleDivision_thenKeepsRemainder(){
+ assertThat(11 / 4.0).isEqualTo(2.75);
+ }
+
+ @Test
+ public void whenModulo_thenReturnsRemainder(){
+ assertThat(11 % 4).isEqualTo(3);
+ }
+
+ @Test(expected = ArithmeticException.class)
+ public void whenDivisionByZero_thenArithmeticException(){
+ double result = 1 / 0;
+ }
+
+ @Test(expected = ArithmeticException.class)
+ public void whenModuloByZero_thenArithmeticException(){
+ double result = 1 % 0;
+ }
+
+ @Test
+ public void whenDivisorIsOddAndModulusIs2_thenResultIs1(){
+ assertThat(3 % 2).isEqualTo(1);
+ }
+
+ @Test
+ public void whenDivisorIsEvenAndModulusIs2_thenResultIs0(){
+ assertThat(4 % 2).isEqualTo(0);
+ }
+
+ @Test
+ public void whenItemsIsAddedToCircularQueue_thenNoArrayIndexOutOfBounds(){
+ int QUEUE_CAPACITY= 10;
+ int[] circularQueue = new int[QUEUE_CAPACITY];
+ int itemsInserted = 0;
+ for (int value = 0; value < 1000; value++) {
+ int writeIndex = ++itemsInserted % QUEUE_CAPACITY;
+ circularQueue[writeIndex] = value;
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java b/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
index 388bceef49..286dffb56a 100644
--- a/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
+++ b/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.nth.root.calculator;
+import static org.junit.Assert.assertEquals;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static org.junit.Assert.assertEquals;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class NthRootCalculatorUnitTest {
diff --git a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
new file mode 100644
index 0000000000..ba4ea32e21
--- /dev/null
+++ b/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung;
+
+import org.junit.Test;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+import java.util.logging.Logger;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+
+public class SimpleDateFormatUnitTest {
+
+ private static final Logger logger = Logger.getLogger(SimpleDateFormatUnitTest.class.getName());
+
+ @Test
+ public void givenSpecificDate_whenFormatted_thenCheckFormatCorrect() throws Exception {
+ SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
+ assertEquals("24-05-1977", formatter.format(new Date(233345223232L)));
+ }
+
+ @Test
+ public void givenSpecificDate_whenFormattedUsingDateFormat_thenCheckFormatCorrect() throws Exception {
+ DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT);
+ assertEquals("5/24/77", formatter.format(new Date(233345223232L)));
+ }
+
+ @Test
+ public void givenStringDate_whenParsed_thenCheckDateCorrect() throws Exception{
+ SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
+ Date myDate = new Date(233276400000L);
+ Date parsedDate = formatter.parse("24-05-1977");
+ assertEquals(myDate.getTime(), parsedDate.getTime());
+ }
+
+ @Test
+ public void givenFranceLocale_whenFormatted_thenCheckFormatCorrect() throws Exception{
+ SimpleDateFormat franceDateFormatter = new SimpleDateFormat("EEEEE dd-MMMMMMM-yyyy", Locale.FRANCE);
+ Date myWednesday = new Date(1539341312904L);
+ assertTrue(franceDateFormatter.format(myWednesday).startsWith("vendredi"));
+ }
+
+ @Test
+ public void given2TimeZones_whenFormatted_thenCheckTimeDifference() throws Exception {
+ Date now = new Date();
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE dd-MMM-yy HH:mm:ssZ");
+
+ simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Europe/London"));
+ logger.info(simpleDateFormat.format(now));
+ //change the date format
+ simpleDateFormat.setTimeZone(TimeZone.getTimeZone("America/New_York"));
+ logger.info(simpleDateFormat.format(now));
+ }
+}
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index 7d8d5213d1..523f5b6e78 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -37,3 +37,5 @@
- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor)
- [Fuel HTTP Library with Kotlin](https://www.baeldung.com/kotlin-fuel)
- [Introduction to Kovenant Library for Kotlin](https://www.baeldung.com/kotlin-kovenant)
+- [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class)
+- [Concatenate Strings in Kotlin](https://www.baeldung.com/kotlin-concatenate-strings)
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/interfaces/ConflictingInterfaces.kt b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/ConflictingInterfaces.kt
new file mode 100644
index 0000000000..630afbdae7
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/ConflictingInterfaces.kt
@@ -0,0 +1,23 @@
+package com.baeldung.interfaces
+
+interface BaseInterface {
+ fun someMethod(): String
+}
+
+interface FirstChildInterface : BaseInterface {
+ override fun someMethod(): String {
+ return("Hello, from someMethod in FirstChildInterface")
+ }
+}
+
+interface SecondChildInterface : BaseInterface {
+ override fun someMethod(): String {
+ return("Hello, from someMethod in SecondChildInterface")
+ }
+}
+
+class ChildClass : FirstChildInterface, SecondChildInterface {
+ override fun someMethod(): String {
+ return super.someMethod()
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/interfaces/InterfaceDelegation.kt b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/InterfaceDelegation.kt
new file mode 100644
index 0000000000..591fde0689
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/InterfaceDelegation.kt
@@ -0,0 +1,13 @@
+package com.baeldung.interfaces
+
+interface MyInterface {
+ fun someMethod(): String
+}
+
+class MyClass() : MyInterface {
+ override fun someMethod(): String {
+ return("Hello, World!")
+ }
+}
+
+class MyDerivedClass(myInterface: MyInterface) : MyInterface by myInterface
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/interfaces/MultipleInterfaces.kt b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/MultipleInterfaces.kt
new file mode 100644
index 0000000000..105a85cbb3
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/MultipleInterfaces.kt
@@ -0,0 +1,29 @@
+package com.baeldung.interfaces
+
+interface FirstInterface {
+ fun someMethod(): String
+
+ fun anotherMethod(): String {
+ return("Hello, from anotherMethod in FirstInterface")
+ }
+}
+
+interface SecondInterface {
+ fun someMethod(): String {
+ return("Hello, from someMethod in SecondInterface")
+ }
+
+ fun anotherMethod(): String {
+ return("Hello, from anotherMethod in SecondInterface")
+ }
+}
+
+class SomeClass: FirstInterface, SecondInterface {
+ override fun someMethod(): String {
+ return("Hello, from someMethod in SomeClass")
+ }
+
+ override fun anotherMethod(): String {
+ return("Hello, from anotherMethod in SomeClass")
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/interfaces/SimpleInterface.kt b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/SimpleInterface.kt
new file mode 100644
index 0000000000..0758549dde
--- /dev/null
+++ b/core-kotlin/src/main/kotlin/com/baeldung/interfaces/SimpleInterface.kt
@@ -0,0 +1,24 @@
+package com.baeldung.interfaces
+
+interface SimpleInterface {
+ val firstProp: String
+ val secondProp: String
+ get() = "Second Property"
+ fun firstMethod(): String
+ fun secondMethod(): String {
+ println("Hello, from: " + secondProp)
+ return ""
+ }
+}
+
+class SimpleClass: SimpleInterface {
+ override val firstProp: String = "First Property"
+ override val secondProp: String
+ get() = "Second Property, Overridden!"
+ override fun firstMethod(): String {
+ return("Hello, from: " + firstProp)
+ }
+ override fun secondMethod(): String {
+ return("Hello, from: " + secondProp + firstProp)
+ }
+}
\ No newline at end of file
diff --git a/core-kotlin/src/test/kotlin/com/baeldung/interfaces/InterfaceExamplesUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/interfaces/InterfaceExamplesUnitTest.kt
new file mode 100644
index 0000000000..96b99948b7
--- /dev/null
+++ b/core-kotlin/src/test/kotlin/com/baeldung/interfaces/InterfaceExamplesUnitTest.kt
@@ -0,0 +1,32 @@
+package com.baeldung.interfaces
+
+import org.junit.Test
+import kotlin.test.assertEquals
+
+class InterfaceExamplesUnitTest {
+ @Test
+ fun givenAnInterface_whenImplemented_thenBehavesAsOverridden() {
+ val simpleClass = SimpleClass()
+ assertEquals("Hello, from: First Property", simpleClass.firstMethod())
+ assertEquals("Hello, from: Second Property, Overridden!First Property", simpleClass.secondMethod())
+ }
+
+ @Test
+ fun givenMultipleInterfaces_whenImplemented_thenBehavesAsOverridden() {
+ val someClass = SomeClass()
+ assertEquals("Hello, from someMethod in SomeClass", someClass.someMethod())
+ assertEquals("Hello, from anotherMethod in SomeClass", someClass.anotherMethod())
+ }
+
+ @Test
+ fun givenConflictingInterfaces_whenImplemented_thenBehavesAsOverridden() {
+ val childClass = ChildClass()
+ assertEquals("Hello, from someMethod in SecondChildInterface", childClass.someMethod())
+ }
+
+ @Test
+ fun givenAnInterface_whenImplemented_thenBehavesAsDelegated() {
+ val myClass = MyClass()
+ assertEquals("Hello, World!", MyDerivedClass(myClass).someMethod())
+ }
+}
\ No newline at end of file
diff --git a/gradle/junit5/build.gradle b/gradle/junit5/build.gradle
new file mode 100644
index 0000000000..5f056d8c23
--- /dev/null
+++ b/gradle/junit5/build.gradle
@@ -0,0 +1,25 @@
+plugins {
+ // Apply the java-library plugin to add support for Java Library
+ id 'java-library'
+}
+
+dependencies {
+ testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
+
+ // Only necessary for JUnit 3 and 4 tests
+ testCompileOnly 'junit:junit:4.12'
+ testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.3.1'
+
+}
+
+repositories {
+ jcenter()
+}
+
+test {
+ useJUnitPlatform {
+ includeTags 'fast'
+ excludeTags 'slow'
+ }
+}
\ No newline at end of file
diff --git a/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java b/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java
new file mode 100644
index 0000000000..4cf63642ee
--- /dev/null
+++ b/gradle/junit5/src/test/java/com/example/CalculatorJUnit4Test.java
@@ -0,0 +1,12 @@
+package com.example;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class CalculatorJUnit4Test {
+ @Test
+ public void testAdd() {
+ assertEquals(42, Integer.sum(19, 23));
+ }
+}
diff --git a/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java b/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java
new file mode 100644
index 0000000000..59fdb0f8ae
--- /dev/null
+++ b/gradle/junit5/src/test/java/com/example/CalculatorJUnit5Test.java
@@ -0,0 +1,36 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;;
+
+public class CalculatorJUnit5Test {
+
+ @Tag("fast")
+ @Test
+ public void testAdd() {
+ assertEquals(42, Integer.sum(19, 23));
+ }
+
+ @Tag("slow")
+ @Test
+ public void testAddMaxInteger() {
+ assertEquals(2147483646, Integer.sum(2147183646, 300000));
+ }
+
+ @Tag("fast")
+ @Test
+ public void testAddZero() {
+ assertEquals(21, Integer.sum(21, 0));
+ }
+
+ @Tag("fast")
+ @Test
+ public void testDivide() {
+ assertThrows(ArithmeticException.class, () -> {
+ Integer.divideUnsigned(42, 0);
+ });
+ }
+}
diff --git a/gradle/settings.gradle b/gradle/settings.gradle
index 38704681bd..f1d64de58a 100644
--- a/gradle/settings.gradle
+++ b/gradle/settings.gradle
@@ -5,6 +5,6 @@ include 'greeting-library'
include 'greeting-library-java'
include 'greeter'
include 'gradletaskdemo'
-
+include 'junit5'
println 'This will be executed during the initialization phase.'
diff --git a/spring-hibernate4/src/test/resources/.gitignore b/guava-collections/.gitignore
similarity index 100%
rename from spring-hibernate4/src/test/resources/.gitignore
rename to guava-collections/.gitignore
diff --git a/guava-collections/README.md b/guava-collections/README.md
new file mode 100644
index 0000000000..fc9cf549c3
--- /dev/null
+++ b/guava-collections/README.md
@@ -0,0 +1,23 @@
+=========
+
+## Guava and Hamcrest Cookbooks and Examples
+
+
+### Relevant Articles:
+- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections)
+- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order)
+- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays)
+- [Partition a List in Java](http://www.baeldung.com/java-list-split)
+- [Filtering and Transforming Collections in Guava](http://www.baeldung.com/guava-filter-and-transform-a-collection)
+- [Guava – Join and Split Collections](http://www.baeldung.com/guava-joiner-and-splitter-tutorial)
+- [Guava – Lists](http://www.baeldung.com/guava-lists)
+- [Guava – Sets](http://www.baeldung.com/guava-sets)
+- [Guava – Maps](http://www.baeldung.com/guava-maps)
+- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap)
+- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset)
+- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap)
+- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
+- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial)
+- [Guide to Guava Table](http://www.baeldung.com/guava-table)
+- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map)
\ No newline at end of file
diff --git a/guava-collections/pom.xml b/guava-collections/pom.xml
new file mode 100644
index 0000000000..a717023156
--- /dev/null
+++ b/guava-collections/pom.xml
@@ -0,0 +1,66 @@
+
+ 4.0.0
+ com.baeldung
+ guava-collections
+ 0.1.0-SNAPSHOT
+ guava-collections
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ org.hamcrest
+ java-hamcrest
+ ${java-hamcrest.version}
+ test
+
+
+
+
+ guava
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 24.0-jre
+ 3.5
+ 4.1
+
+
+ 3.6.1
+ 2.0.0.0
+
+
+
\ No newline at end of file
diff --git a/spring-data-mongodb/src/main/resources/logback.xml b/guava-collections/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-mongodb/src/main/resources/logback.xml
rename to guava-collections/src/main/resources/logback.xml
diff --git a/guava/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMapFromSet.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaMapFromSet.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaMapFromSet.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaMapFromSet.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMapFromSetUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaMapFromSetUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaMapFromSetUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaMapFromSetUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaRangeSetUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeSetUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaRangeSetUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaRangeSetUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java b/guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java b/guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java b/guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java b/guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java
rename to guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java
diff --git a/guava-collections/src/test/resources/.gitignore b/guava-collections/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/guava-collections/src/test/resources/.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/guava-collections/src/test/resources/test.out b/guava-collections/src/test/resources/test.out
new file mode 100644
index 0000000000..7a79da3803
--- /dev/null
+++ b/guava-collections/src/test/resources/test.out
@@ -0,0 +1 @@
+John Jane Adam Tom
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/test1.in b/guava-collections/src/test/resources/test1.in
new file mode 100644
index 0000000000..70c379b63f
--- /dev/null
+++ b/guava-collections/src/test/resources/test1.in
@@ -0,0 +1 @@
+Hello world
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/test1_1.in b/guava-collections/src/test/resources/test1_1.in
new file mode 100644
index 0000000000..8318c86b35
--- /dev/null
+++ b/guava-collections/src/test/resources/test1_1.in
@@ -0,0 +1 @@
+Test
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/test2.in b/guava-collections/src/test/resources/test2.in
new file mode 100644
index 0000000000..622efea9e6
--- /dev/null
+++ b/guava-collections/src/test/resources/test2.in
@@ -0,0 +1,4 @@
+John
+Jane
+Adam
+Tom
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/test_copy.in b/guava-collections/src/test/resources/test_copy.in
new file mode 100644
index 0000000000..70c379b63f
--- /dev/null
+++ b/guava-collections/src/test/resources/test_copy.in
@@ -0,0 +1 @@
+Hello world
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/test_le.txt b/guava-collections/src/test/resources/test_le.txt
new file mode 100644
index 0000000000..f7cc484bf4
Binary files /dev/null and b/guava-collections/src/test/resources/test_le.txt differ
diff --git a/guava/README.md b/guava/README.md
index fe1a347d72..56e6aff50c 100644
--- a/guava/README.md
+++ b/guava/README.md
@@ -4,33 +4,16 @@
### Relevant Articles:
-- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections)
-- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order)
- [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates)
-- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays)
-- [Partition a List in Java](http://www.baeldung.com/java-list-split)
-- [Filtering and Transforming Collections in Guava](http://www.baeldung.com/guava-filter-and-transform-a-collection)
-- [Guava – Join and Split Collections](http://www.baeldung.com/guava-joiner-and-splitter-tutorial)
- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file)
-- [Guava – Lists](http://www.baeldung.com/guava-lists)
-- [Guava – Sets](http://www.baeldung.com/guava-sets)
-- [Guava – Maps](http://www.baeldung.com/guava-maps)
-- [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial)
- [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering)
- [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions)
- [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader)
- [Introduction to Guava Memoizer](http://www.baeldung.com/guava-memoizer)
- [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus)
-- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap)
-- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset)
-- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap)
-- [Guide to Guava Table](http://www.baeldung.com/guava-table)
- [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection)
-- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map)
-- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
- [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math)
- [Bloom Filter in Java using Guava](http://www.baeldung.com/guava-bloom-filter)
- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream)
- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers)
- [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter)
-- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
diff --git a/guava/pom.xml b/guava/pom.xml
index 60678608dd..1d37a79ab6 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -14,12 +14,6 @@
-
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
org.apache.commons
commons-lang3
@@ -56,7 +50,6 @@
24.0-jre
3.5
- 4.1
3.6.1
diff --git a/hibernate5/README.md b/hibernate5/README.md
index b90f885c78..fbf46eed50 100644
--- a/hibernate5/README.md
+++ b/hibernate5/README.md
@@ -16,3 +16,4 @@
- [Hibernate Entity Lifecycle](https://www.baeldung.com/hibernate-entity-lifecycle)
- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class)
- [@JoinColumn Annotation Explained](https://www.baeldung.com/jpa-join-column)
+- [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy)
diff --git a/hibernate5/pom.xml b/hibernate5/pom.xml
index 610c893bdc..748a106cca 100644
--- a/hibernate5/pom.xml
+++ b/hibernate5/pom.xml
@@ -44,6 +44,11 @@
mariaDB4j
${mariaDB4j.version}
+
+ org.hibernate
+ hibernate-testing
+ 5.2.2.Final
+
@@ -57,7 +62,7 @@
- 5.3.2.Final
+ 5.3.6.Final
6.0.6
2.2.3
1.4.196
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
index 2212e736ab..e0d1de591b 100644
--- a/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/HibernateUtil.java
@@ -5,6 +5,8 @@ import java.io.IOException;
import java.net.URL;
import java.util.Properties;
+import com.baeldung.hibernate.customtypes.LocalDateStringType;
+import com.baeldung.hibernate.customtypes.OfficeEmployee;
import com.baeldung.hibernate.entities.DeptEmployee;
import com.baeldung.hibernate.optimisticlocking.OptimisticLockingCourse;
import com.baeldung.hibernate.optimisticlocking.OptimisticLockingStudent;
@@ -18,8 +20,10 @@ import com.baeldung.hibernate.pojo.inheritance.*;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataBuilder;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import com.baeldung.hibernate.pojo.Course;
@@ -66,6 +70,7 @@ public class HibernateUtil {
private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+
metadataSources.addPackage("com.baeldung.hibernate.pojo");
metadataSources.addAnnotatedClass(Employee.class);
metadataSources.addAnnotatedClass(Phone.class);
@@ -102,8 +107,12 @@ public class HibernateUtil {
metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class);
metadataSources.addAnnotatedClass(OptimisticLockingCourse.class);
metadataSources.addAnnotatedClass(OptimisticLockingStudent.class);
+ metadataSources.addAnnotatedClass(OfficeEmployee.class);
+
+ Metadata metadata = metadataSources.getMetadataBuilder()
+ .applyBasicType(LocalDateStringType.INSTANCE)
+ .build();
- Metadata metadata = metadataSources.buildMetadata();
return metadata.getSessionFactoryBuilder()
.build();
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java
new file mode 100644
index 0000000000..d559e5a6c2
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Address.java
@@ -0,0 +1,69 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public class Address {
+
+ private String addressLine1;
+ private String addressLine2;
+ private String city;
+ private String country;
+ private int zipCode;
+
+ public String getAddressLine1() {
+ return addressLine1;
+ }
+
+ public String getAddressLine2() {
+ return addressLine2;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public int getZipCode() {
+ return zipCode;
+ }
+
+ public void setAddressLine1(String addressLine1) {
+ this.addressLine1 = addressLine1;
+ }
+
+ public void setAddressLine2(String addressLine2) {
+ this.addressLine2 = addressLine2;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public void setZipCode(int zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Address address = (Address) o;
+ return zipCode == address.zipCode &&
+ Objects.equals(addressLine1, address.addressLine1) &&
+ Objects.equals(addressLine2, address.addressLine2) &&
+ Objects.equals(city, address.city) &&
+ Objects.equals(country, address.country);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(addressLine1, addressLine2, city, country, zipCode);
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java
new file mode 100644
index 0000000000..c10c67df9a
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/AddressType.java
@@ -0,0 +1,169 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.type.IntegerType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+
+public class AddressType implements CompositeUserType {
+
+ @Override
+ public String[] getPropertyNames() {
+ return new String[]{"addressLine1", "addressLine2",
+ "city", "country", "zipcode"};
+ }
+
+ @Override
+ public Type[] getPropertyTypes() {
+ return new Type[]{StringType.INSTANCE, StringType.INSTANCE,
+ StringType.INSTANCE, StringType.INSTANCE, IntegerType.INSTANCE};
+ }
+
+ @Override
+ public Object getPropertyValue(Object component, int property) throws HibernateException {
+
+ Address empAdd = (Address) component;
+
+ switch (property) {
+ case 0:
+ return empAdd.getAddressLine1();
+ case 1:
+ return empAdd.getAddressLine2();
+ case 2:
+ return empAdd.getCity();
+ case 3:
+ return empAdd.getCountry();
+ case 4:
+ return Integer.valueOf(empAdd.getZipCode());
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+ }
+
+ @Override
+ public void setPropertyValue(Object component, int property, Object value) throws HibernateException {
+
+ Address empAdd = (Address) component;
+
+ switch (property) {
+ case 0:
+ empAdd.setAddressLine1((String) value);
+ case 1:
+ empAdd.setAddressLine2((String) value);
+ case 2:
+ empAdd.setCity((String) value);
+ case 3:
+ empAdd.setCountry((String) value);
+ case 4:
+ empAdd.setZipCode((Integer) value);
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Address.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x == y)
+ return true;
+
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+
+ Address empAdd = new Address();
+ empAdd.setAddressLine1(rs.getString(names[0]));
+
+ if (rs.wasNull())
+ return null;
+
+ empAdd.setAddressLine2(rs.getString(names[1]));
+ empAdd.setCity(rs.getString(names[2]));
+ empAdd.setCountry(rs.getString(names[3]));
+ empAdd.setZipCode(rs.getInt(names[4]));
+
+ return empAdd;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+ if (Objects.isNull(value))
+ st.setNull(index, Types.VARCHAR);
+ else {
+
+ Address empAdd = (Address) value;
+ st.setString(index, empAdd.getAddressLine1());
+ st.setString(index + 1, empAdd.getAddressLine2());
+ st.setString(index + 2, empAdd.getCity());
+ st.setString(index + 3, empAdd.getCountry());
+ st.setInt(index + 4, empAdd.getZipCode());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+
+ if (Objects.isNull(value))
+ return null;
+
+ Address oldEmpAdd = (Address) value;
+ Address newEmpAdd = new Address();
+
+ newEmpAdd.setAddressLine1(oldEmpAdd.getAddressLine1());
+ newEmpAdd.setAddressLine2(oldEmpAdd.getAddressLine2());
+ newEmpAdd.setCity(oldEmpAdd.getCity());
+ newEmpAdd.setCountry(oldEmpAdd.getCountry());
+ newEmpAdd.setZipCode(oldEmpAdd.getZipCode());
+
+ return newEmpAdd;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return true;
+ }
+
+ @Override
+ public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException {
+ return (Serializable) deepCopy(value);
+ }
+
+ @Override
+ public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return deepCopy(cached);
+ }
+
+ @Override
+ public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return original;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java
new file mode 100644
index 0000000000..56be9e693f
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringJavaDescriptor.java
@@ -0,0 +1,51 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.type.LocalDateType;
+import org.hibernate.type.descriptor.WrapperOptions;
+import org.hibernate.type.descriptor.java.AbstractTypeDescriptor;
+import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
+import org.hibernate.type.descriptor.java.MutabilityPlan;
+
+import java.time.LocalDate;
+
+public class LocalDateStringJavaDescriptor extends AbstractTypeDescriptor {
+
+ public static final LocalDateStringJavaDescriptor INSTANCE = new LocalDateStringJavaDescriptor();
+
+ public LocalDateStringJavaDescriptor() {
+ super(LocalDate.class, ImmutableMutabilityPlan.INSTANCE);
+ }
+
+ @Override
+ public String toString(LocalDate value) {
+ return LocalDateType.FORMATTER.format(value);
+ }
+
+ @Override
+ public LocalDate fromString(String string) {
+ return LocalDate.from(LocalDateType.FORMATTER.parse(string));
+ }
+
+ @Override
+ public X unwrap(LocalDate value, Class type, WrapperOptions options) {
+
+ if (value == null)
+ return null;
+
+ if (String.class.isAssignableFrom(type))
+ return (X) LocalDateType.FORMATTER.format(value);
+
+ throw unknownUnwrap(type);
+ }
+
+ @Override
+ public LocalDate wrap(X value, WrapperOptions options) {
+ if (value == null)
+ return null;
+
+ if(String.class.isInstance(value))
+ return LocalDate.from(LocalDateType.FORMATTER.parse((CharSequence) value));
+
+ throw unknownWrap(value.getClass());
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java
new file mode 100644
index 0000000000..c8d37073e8
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/LocalDateStringType.java
@@ -0,0 +1,34 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.type.AbstractSingleColumnStandardBasicType;
+import org.hibernate.type.DiscriminatorType;
+import org.hibernate.type.descriptor.java.LocalDateJavaDescriptor;
+import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
+
+import java.time.LocalDate;
+
+public class LocalDateStringType extends AbstractSingleColumnStandardBasicType implements DiscriminatorType {
+
+ public static final LocalDateStringType INSTANCE = new LocalDateStringType();
+
+ public LocalDateStringType() {
+ super(VarcharTypeDescriptor.INSTANCE, LocalDateStringJavaDescriptor.INSTANCE);
+ }
+
+ @Override
+ public String getName() {
+ return "LocalDateString";
+ }
+
+ @Override
+ public LocalDate stringToObject(String xml) throws Exception {
+ return fromString(xml);
+ }
+
+ @Override
+ public String objectToSQLString(LocalDate value, Dialect dialect) throws Exception {
+ return '\'' + toString(value) + '\'';
+ }
+
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
new file mode 100644
index 0000000000..3ca06e4316
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/OfficeEmployee.java
@@ -0,0 +1,88 @@
+package com.baeldung.hibernate.customtypes;
+
+import com.baeldung.hibernate.pojo.Phone;
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.time.LocalDate;
+
+@TypeDef(name = "PhoneNumber",
+ typeClass = PhoneNumberType.class,
+ defaultForType = PhoneNumber.class)
+@Entity
+@Table(name = "OfficeEmployee")
+public class OfficeEmployee {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ @Column
+ @Type(type = "LocalDateString")
+ private LocalDate dateOfJoining;
+
+ @Columns(columns = {@Column(name = "country_code"),
+ @Column(name = "city_code"),
+ @Column(name = "number")})
+ private PhoneNumber employeeNumber;
+
+ @Columns(columns = {@Column(name = "address_line_1"),
+ @Column(name = "address_line_2"),
+ @Column(name = "city"), @Column(name = "country"),
+ @Column(name = "zip_code")})
+ @Type(type = "com.baeldung.hibernate.customtypes.AddressType")
+ private Address empAddress;
+
+ @Type(type = "com.baeldung.hibernate.customtypes.SalaryType",
+ parameters = {@Parameter(name = "currency", value = "USD")})
+ @Columns(columns = {@Column(name = "amount"),
+ @Column(name = "currency")})
+ private Salary salary;
+
+ public Salary getSalary() {
+ return salary;
+ }
+
+ public void setSalary(Salary salary) {
+ this.salary = salary;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public LocalDate getDateOfJoining() {
+ return dateOfJoining;
+ }
+
+ public void setDateOfJoining(LocalDate dateOfJoining) {
+ this.dateOfJoining = dateOfJoining;
+ }
+
+ public PhoneNumber getEmployeeNumber() {
+ return employeeNumber;
+ }
+
+ public void setEmployeeNumber(PhoneNumber employeeNumber) {
+ this.employeeNumber = employeeNumber;
+ }
+
+ public Address getEmpAddress() {
+ return empAddress;
+ }
+
+ public void setEmpAddress(Address empAddress) {
+ this.empAddress = empAddress;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java
new file mode 100644
index 0000000000..0be6cbc910
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumber.java
@@ -0,0 +1,43 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public final class PhoneNumber {
+
+ private final int countryCode;
+ private final int cityCode;
+ private final int number;
+
+ public PhoneNumber(int countryCode, int cityCode, int number) {
+ this.countryCode = countryCode;
+ this.cityCode = cityCode;
+ this.number = number;
+ }
+
+ public int getCountryCode() {
+ return countryCode;
+ }
+
+ public int getCityCode() {
+ return cityCode;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ PhoneNumber that = (PhoneNumber) o;
+ return countryCode == that.countryCode &&
+ cityCode == that.cityCode &&
+ number == that.number;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(countryCode, cityCode, number);
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java
new file mode 100644
index 0000000000..9f09352bec
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/PhoneNumberType.java
@@ -0,0 +1,98 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.usertype.UserType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+
+
+public class PhoneNumberType implements UserType {
+ @Override
+ public int[] sqlTypes() {
+ return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER};
+ }
+
+ @Override
+ public Class returnedClass() {
+ return PhoneNumber.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if (x == y)
+ return true;
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+ int countryCode = rs.getInt(names[0]);
+
+ if (rs.wasNull())
+ return null;
+
+ int cityCode = rs.getInt(names[1]);
+ int number = rs.getInt(names[2]);
+ PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number);
+
+ return employeeNumber;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+ if (Objects.isNull(value)) {
+ st.setNull(index, Types.INTEGER);
+ } else {
+ PhoneNumber employeeNumber = (PhoneNumber) value;
+ st.setInt(index,employeeNumber.getCountryCode());
+ st.setInt(index+1,employeeNumber.getCityCode());
+ st.setInt(index+2,employeeNumber.getNumber());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+ if (Objects.isNull(value))
+ return null;
+
+ PhoneNumber empNumber = (PhoneNumber) value;
+ PhoneNumber newEmpNumber = new PhoneNumber(empNumber.getCountryCode(),empNumber.getCityCode(),empNumber.getNumber());
+
+ return newEmpNumber;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return false;
+ }
+
+ @Override
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ @Override
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ @Override
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java
new file mode 100644
index 0000000000..f9a7ac5902
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/Salary.java
@@ -0,0 +1,39 @@
+package com.baeldung.hibernate.customtypes;
+
+import java.util.Objects;
+
+public class Salary {
+
+ private Long amount;
+ private String currency;
+
+ public Long getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Long amount) {
+ this.amount = amount;
+ }
+
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Salary salary = (Salary) o;
+ return Objects.equals(amount, salary.amount) &&
+ Objects.equals(currency, salary.currency);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(amount, currency);
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java
new file mode 100644
index 0000000000..340c697c11
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryCurrencyConvertor.java
@@ -0,0 +1,15 @@
+package com.baeldung.hibernate.customtypes;
+
+public class SalaryCurrencyConvertor {
+
+ public static Long convert(Long amount, String oldCurr, String newCurr){
+ if (newCurr.equalsIgnoreCase(oldCurr))
+ return amount;
+
+ return convertTo();
+ }
+
+ private static Long convertTo() {
+ return 10L;
+ }
+}
diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java
new file mode 100644
index 0000000000..266b85140b
--- /dev/null
+++ b/hibernate5/src/main/java/com/baeldung/hibernate/customtypes/SalaryType.java
@@ -0,0 +1,161 @@
+package com.baeldung.hibernate.customtypes;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SharedSessionContractImplementor;
+import org.hibernate.type.LongType;
+import org.hibernate.type.StringType;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+import org.hibernate.usertype.DynamicParameterizedType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Objects;
+import java.util.Properties;
+
+public class SalaryType implements CompositeUserType, DynamicParameterizedType {
+
+ private String localCurrency;
+
+ @Override
+ public String[] getPropertyNames() {
+ return new String[]{"amount", "currency"};
+ }
+
+ @Override
+ public Type[] getPropertyTypes() {
+ return new Type[]{LongType.INSTANCE, StringType.INSTANCE};
+ }
+
+ @Override
+ public Object getPropertyValue(Object component, int property) throws HibernateException {
+
+ Salary salary = (Salary) component;
+
+ switch (property) {
+ case 0:
+ return salary.getAmount();
+ case 1:
+ return salary.getCurrency();
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+
+ @Override
+ public void setPropertyValue(Object component, int property, Object value) throws HibernateException {
+
+ Salary salary = (Salary) component;
+
+ switch (property) {
+ case 0:
+ salary.setAmount((Long) value);
+ case 1:
+ salary.setCurrency((String) value);
+ }
+
+ throw new IllegalArgumentException(property +
+ " is an invalid property index for class type " +
+ component.getClass().getName());
+
+ }
+
+ @Override
+ public Class returnedClass() {
+ return Salary.class;
+ }
+
+ @Override
+ public boolean equals(Object x, Object y) throws HibernateException {
+
+ if (x == y)
+ return true;
+
+ if (Objects.isNull(x) || Objects.isNull(y))
+ return false;
+
+ return x.equals(y);
+
+ }
+
+ @Override
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ @Override
+ public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException {
+
+ Salary salary = new Salary();
+ salary.setAmount(rs.getLong(names[0]));
+
+ if (rs.wasNull())
+ return null;
+
+ salary.setCurrency(rs.getString(names[1]));
+
+ return salary;
+ }
+
+ @Override
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException {
+
+
+ if (Objects.isNull(value))
+ st.setNull(index, Types.BIGINT);
+ else {
+
+ Salary salary = (Salary) value;
+ st.setLong(index, SalaryCurrencyConvertor.convert(salary.getAmount(),
+ salary.getCurrency(), localCurrency));
+ st.setString(index + 1, salary.getCurrency());
+ }
+ }
+
+ @Override
+ public Object deepCopy(Object value) throws HibernateException {
+
+ if (Objects.isNull(value))
+ return null;
+
+ Salary oldSal = (Salary) value;
+ Salary newSal = new Salary();
+
+ newSal.setAmount(oldSal.getAmount());
+ newSal.setCurrency(oldSal.getCurrency());
+
+ return newSal;
+ }
+
+ @Override
+ public boolean isMutable() {
+ return true;
+ }
+
+ @Override
+ public Serializable disassemble(Object value, SharedSessionContractImplementor session) throws HibernateException {
+ return (Serializable) deepCopy(value);
+ }
+
+ @Override
+ public Object assemble(Serializable cached, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return deepCopy(cached);
+ }
+
+ @Override
+ public Object replace(Object original, Object target, SharedSessionContractImplementor session, Object owner) throws HibernateException {
+ return original;
+ }
+
+ @Override
+ public void setParameterValues(Properties parameters) {
+ this.localCurrency = parameters.getProperty("currency");
+ }
+}
diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesUnitTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesUnitTest.java
new file mode 100644
index 0000000000..f0179701df
--- /dev/null
+++ b/hibernate5/src/test/java/com/baeldung/hibernate/customtypes/HibernateCustomTypesUnitTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.hibernate.customtypes;
+
+import com.baeldung.hibernate.HibernateUtil;
+import org.hibernate.SessionFactory;
+import org.hibernate.query.Query;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.time.LocalDate;
+
+import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
+
+public class HibernateCustomTypesUnitTest {
+
+ @Test
+ public void givenEmployee_whenSavedWithCustomTypes_thenEntityIsSaved() throws IOException {
+
+ final OfficeEmployee e = new OfficeEmployee();
+ e.setDateOfJoining(LocalDate.now());
+
+ PhoneNumber number = new PhoneNumber(1, 222, 8781902);
+ e.setEmployeeNumber(number);
+
+ Address empAdd = new Address();
+ empAdd.setAddressLine1("Street");
+ empAdd.setAddressLine2("Area");
+ empAdd.setCity("City");
+ empAdd.setCountry("Country");
+ empAdd.setZipCode(100);
+
+ e.setEmpAddress(empAdd);
+
+ Salary empSalary = new Salary();
+ empSalary.setAmount(1000L);
+ empSalary.setCurrency("USD");
+ e.setSalary(empSalary);
+
+ doInHibernate(this::sessionFactory, session -> {
+ session.save(e);
+ boolean contains = session.contains(e);
+ Assert.assertTrue(contains);
+ });
+
+ }
+
+ @Test
+ public void givenEmployee_whenCustomTypeInQuery_thenReturnEntity() throws IOException {
+
+ final OfficeEmployee e = new OfficeEmployee();
+ e.setDateOfJoining(LocalDate.now());
+
+ PhoneNumber number = new PhoneNumber(1, 222, 8781902);
+ e.setEmployeeNumber(number);
+
+ Address empAdd = new Address();
+ empAdd.setAddressLine1("Street");
+ empAdd.setAddressLine2("Area");
+ empAdd.setCity("City");
+ empAdd.setCountry("Country");
+ empAdd.setZipCode(100);
+ e.setEmpAddress(empAdd);
+
+ Salary empSalary = new Salary();
+ empSalary.setAmount(1000L);
+ empSalary.setCurrency("USD");
+ e.setSalary(empSalary);
+
+ doInHibernate(this::sessionFactory, session -> {
+ session.save(e);
+
+ Query query = session.createQuery("FROM OfficeEmployee OE WHERE OE.empAddress.zipcode = :pinCode");
+ query.setParameter("pinCode",100);
+ int size = query.list().size();
+
+ Assert.assertEquals(1, size);
+ });
+
+ }
+
+ private SessionFactory sessionFactory() {
+ try {
+ return HibernateUtil.getSessionFactory("hibernate-customtypes.properties");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+}
diff --git a/hibernate5/src/test/resources/hibernate-customtypes.properties b/hibernate5/src/test/resources/hibernate-customtypes.properties
new file mode 100644
index 0000000000..345f3d37b0
--- /dev/null
+++ b/hibernate5/src/test/resources/hibernate-customtypes.properties
@@ -0,0 +1,10 @@
+hibernate.connection.driver_class=org.postgresql.Driver
+hibernate.connection.url=jdbc:postgresql://localhost:5432/test
+hibernate.connection.username=postgres
+hibernate.connection.password=thule
+hibernate.connection.autocommit=true
+jdbc.password=thule
+
+hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/jackson/src/test/java/com/baeldung/jackson/xmlToJson/XmlToJsonUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/xmlToJson/XmlToJsonUnitTest.java
index 295bb9d6e8..6329a8ed2f 100644
--- a/jackson/src/test/java/com/baeldung/jackson/xmlToJson/XmlToJsonUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/xmlToJson/XmlToJsonUnitTest.java
@@ -1,7 +1,5 @@
package com.baeldung.jackson.xmlToJson;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
@@ -14,43 +12,32 @@ import java.io.IOException;
public class XmlToJsonUnitTest {
@Test
- public void givenAnXML_whenUseDataBidingToConvertToJSON_thenReturnDataOK() {
+ public void givenAnXML_whenUseDataBidingToConvertToJSON_thenReturnDataOK() throws IOException{
String flowerXML = "PoppyRED9";
- try {
- XmlMapper xmlMapper = new XmlMapper();
- Flower poppy = xmlMapper.readValue(flowerXML, Flower.class);
+ XmlMapper xmlMapper = new XmlMapper();
+ Flower poppy = xmlMapper.readValue(flowerXML, Flower.class);
- assertEquals(poppy.getName(), "Poppy");
- assertEquals(poppy.getColor(), Color.RED);
- assertEquals(poppy.getPetals(), new Integer(9));
+ assertEquals(poppy.getName(), "Poppy");
+ assertEquals(poppy.getColor(), Color.RED);
+ assertEquals(poppy.getPetals(), new Integer(9));
- ObjectMapper mapper = new ObjectMapper();
- String json = mapper.writeValueAsString(poppy);
+ ObjectMapper mapper = new ObjectMapper();
+ String json = mapper.writeValueAsString(poppy);
- assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":9}");
- System.out.println(json);
- } catch(IOException e) {
- e.printStackTrace();
- }
+ assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":9}");
}
@Test
- public void givenAnXML_whenUseATreeConvertToJSON_thenReturnDataOK() {
+ public void givenAnXML_whenUseATreeConvertToJSON_thenReturnDataOK() throws IOException {
String flowerXML = "PoppyRED9";
- try {
- XmlMapper xmlMapper = new XmlMapper();
- JsonNode node = xmlMapper.readTree(flowerXML.getBytes());
+ XmlMapper xmlMapper = new XmlMapper();
+ JsonNode node = xmlMapper.readTree(flowerXML.getBytes());
- ObjectMapper jsonMapper = new ObjectMapper();
- String json = jsonMapper.writeValueAsString(node);
+ ObjectMapper jsonMapper = new ObjectMapper();
+ String json = jsonMapper.writeValueAsString(node);
- System.out.println(json);
-
- assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":\"9\"}");
- } catch(IOException e) {
- e.printStackTrace();
- }
+ assertEquals(json, "{\"name\":\"Poppy\",\"color\":\"RED\",\"petals\":\"9\"}");
}
}
diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md
new file mode 100644
index 0000000000..761a78d7b0
--- /dev/null
+++ b/java-collections-conversions/README.md
@@ -0,0 +1,11 @@
+=========
+
+## Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array)
+- [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array)
+- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list)
+- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set)
+- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
+- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
\ No newline at end of file
diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml
new file mode 100644
index 0000000000..9b54652001
--- /dev/null
+++ b/java-collections-conversions/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ java-collections-conversions
+ 0.1.0-SNAPSHOT
+ jar
+ java-collections-conversions
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 3.5
+ 4.1
+ 3.6.1
+
+
diff --git a/core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java b/java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
rename to java-collections-conversions/src/main/java/com/baeldung/convertcollectiontoarraylist/Foo.java
diff --git a/core-java-collections/src/main/java/com/baeldung/convertlisttomap/Animal.java b/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/convertlisttomap/Animal.java
rename to java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/Animal.java
diff --git a/core-java-collections/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java b/java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
rename to java-collections-conversions/src/main/java/com/baeldung/convertlisttomap/ConvertListToMapService.java
diff --git a/core-java-persistence/src/main/resources/logback.xml b/java-collections-conversions/src/main/resources/logback.xml
similarity index 100%
rename from core-java-persistence/src/main/resources/logback.xml
rename to java-collections-conversions/src/main/resources/logback.xml
diff --git a/core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListToMapServiceUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java b/java-collections-conversions/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java
rename to java-collections-conversions/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListToSTring.java b/java-collections-conversions/src/test/java/org/baeldung/java/lists/ListToSTring.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListToSTring.java
rename to java-collections-conversions/src/test/java/org/baeldung/java/lists/ListToSTring.java
diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md
new file mode 100644
index 0000000000..ca7fee1d21
--- /dev/null
+++ b/java-collections-maps/README.md
@@ -0,0 +1,18 @@
+=========
+
+## Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap)
+- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap)
+- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap)
+- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap)
+- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap)
+- [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map)
+- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap)
+- [How to Store Duplicate Keys in a Map in Java?](http://www.baeldung.com/java-map-duplicate-keys)
+- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
+- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
+- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
+- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps)
diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml
new file mode 100644
index 0000000000..0803866c51
--- /dev/null
+++ b/java-collections-maps/pom.xml
@@ -0,0 +1,54 @@
+
+ 4.0.0
+ java-collections-maps
+ 0.1.0-SNAPSHOT
+ jar
+ java-collections-maps
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ one.util
+ streamex
+ 0.6.5
+
+
+
+
+ 3.5
+ 4.1
+ 4.01
+ 1.7.0
+ 3.6.1
+ 7.1.0
+
+
diff --git a/core-java-collections/src/main/java/com/baeldung/java/map/MapUtil.java b/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/map/MapUtil.java
rename to java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/map/MyKey.java b/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/map/MyKey.java
rename to java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java b/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
rename to java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java b/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
rename to java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
diff --git a/core-java-collections/src/main/java/com/baeldung/map/iteration/MapIteration.java b/java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/map/iteration/MapIteration.java
rename to java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java
diff --git a/core-java-collections/src/main/java/com/baeldung/map/java_8/MergeMaps.java b/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/map/java_8/MergeMaps.java
rename to java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
diff --git a/core-java-collections/src/main/java/com/baeldung/map/util/MapMax.java b/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/map/util/MapMax.java
rename to java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
diff --git a/core-java-collections/src/main/java/com/baeldung/sort/Employee.java b/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/sort/Employee.java
rename to java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
diff --git a/core-java-collections/src/main/java/com/baeldung/sort/SortHashMap.java b/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/sort/SortHashMap.java
rename to java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
diff --git a/deltaspike/src/main/resources/logback.xml b/java-collections-maps/src/main/resources/logback.xml
similarity index 100%
rename from deltaspike/src/main/resources/logback.xml
rename to java-collections-maps/src/main/resources/logback.xml
diff --git a/core-java-collections/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
rename to java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
diff --git a/core-java/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/guava/GuavaBiMapUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/map/MapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/map/MapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
index 58d192bfdb..92da22cc95 100644
--- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
+++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
@@ -51,6 +51,15 @@ public class DateDiffUnitTest {
assertEquals(diff, 6);
}
+ @Test
+ public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
+ LocalDateTime ldt = LocalDateTime.now();
+ ZonedDateTime now = ldt.atZone(ZoneId.of("America/Montreal"));
+ ZonedDateTime sixDaysBehind = now.withZoneSameInstant(ZoneId.of("Asia/Singapore")).minusDays(6);
+ long diff = ChronoUnit.DAYS.between(sixDaysBehind, now);
+ assertEquals(diff, 6);
+ }
+
@Test
public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() {
org.joda.time.LocalDate now = org.joda.time.LocalDate.now();
diff --git a/java-numbers/src/test/java/com/baeldung/maths/MathSinUnitTest.java b/java-numbers/src/test/java/com/baeldung/maths/MathSinUnitTest.java
index 111b2f4465..03d200bb6b 100644
--- a/java-numbers/src/test/java/com/baeldung/maths/MathSinUnitTest.java
+++ b/java-numbers/src/test/java/com/baeldung/maths/MathSinUnitTest.java
@@ -1,6 +1,7 @@
package com.baeldung.maths;
-import static org.junit.Assert.assertTrue;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
import org.junit.jupiter.api.Test;
@@ -11,10 +12,10 @@ public class MathSinUnitTest {
double angleInDegrees = 30;
double sinForDegrees = Math.sin(Math.toRadians(angleInDegrees)); // 0.5
- double thirtyDegreesInRadians = 1/6 * Math.PI;
+ double thirtyDegreesInRadians = (double) 1 / 6 * Math.PI;
double sinForRadians = Math.sin(thirtyDegreesInRadians); // 0.5
- assertTrue(sinForDegrees == sinForRadians);
+ assertThat(sinForDegrees, is(sinForRadians));
}
}
diff --git a/java-streams/README.md b/java-streams/README.md
index 548d4b6a33..2550f08650 100644
--- a/java-streams/README.md
+++ b/java-streams/README.md
@@ -13,3 +13,4 @@
- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices)
- [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams)
- [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering)
+- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
diff --git a/java-strings/README.md b/java-strings/README.md
index b12fc75f30..603f70d2f1 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -27,7 +27,10 @@
- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
- [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string)
+- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [Get Substring from String in Java](https://www.baeldung.com/java-substring)
- [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string)
- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
+- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
+- [String Performance Hints](https://www.baeldung.com/java-string-performance)
diff --git a/java-strings/pom.xml b/java-strings/pom.xml
index b1ba49b33a..a43490ce5c 100644
--- a/java-strings/pom.xml
+++ b/java-strings/pom.xml
@@ -68,7 +68,17 @@
emoji-java
4.0.0
-
+
+
+ org.passay
+ passay
+ 1.3.1
+
+
+ org.apache.commons
+ commons-text
+ 1.4
+
diff --git a/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java b/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
new file mode 100644
index 0000000000..46af4d7c51
--- /dev/null
+++ b/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
@@ -0,0 +1,152 @@
+package com.baeldung.string.password;
+
+import java.security.SecureRandom;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.text.RandomStringGenerator;
+import org.passay.CharacterData;
+import org.passay.CharacterRule;
+import org.passay.EnglishCharacterData;
+import org.passay.PasswordGenerator;
+
+public class RandomPasswordGenerator {
+
+ /**
+ * Special characters allowed in password.
+ */
+ public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+";
+
+ public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS";
+
+ Random random = new SecureRandom();
+
+ public String generatePassayPassword() {
+ PasswordGenerator gen = new PasswordGenerator();
+ CharacterData lowerCaseChars = EnglishCharacterData.LowerCase;
+ CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars);
+ lowerCaseRule.setNumberOfCharacters(2);
+ CharacterData upperCaseChars = EnglishCharacterData.UpperCase;
+ CharacterRule upperCaseRule = new CharacterRule(upperCaseChars);
+ upperCaseRule.setNumberOfCharacters(2);
+ CharacterData digitChars = EnglishCharacterData.Digit;
+ CharacterRule digitRule = new CharacterRule(digitChars);
+ digitRule.setNumberOfCharacters(2);
+ CharacterData specialChars = new CharacterData() {
+ public String getErrorCode() {
+ return ERROR_CODE;
+ }
+
+ public String getCharacters() {
+ return ALLOWED_SPL_CHARACTERS;
+ }
+ };
+ CharacterRule splCharRule = new CharacterRule(specialChars);
+ splCharRule.setNumberOfCharacters(2);
+ String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule);
+ return password;
+ }
+
+ public String generateCommonTextPassword() {
+ String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2))
+ .concat(generateRandomAlphabet(2, true))
+ .concat(generateRandomAlphabet(2, false))
+ .concat(generateRandomCharacters(2));
+ List pwChars = pwString.chars()
+ .mapToObj(data -> (char) data)
+ .collect(Collectors.toList());
+ Collections.shuffle(pwChars);
+ String password = pwChars.stream()
+ .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
+ .toString();
+ return password;
+ }
+
+ public String generateCommonsLang3Password() {
+ String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true);
+ String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true);
+ String numbers = RandomStringUtils.randomNumeric(2);
+ String specialChar = RandomStringUtils.random(2, 33, 47, false, false);
+ String totalChars = RandomStringUtils.randomAlphanumeric(2);
+ String combinedChars = upperCaseLetters.concat(lowerCaseLetters)
+ .concat(numbers)
+ .concat(specialChar)
+ .concat(totalChars);
+ List pwdChars = combinedChars.chars()
+ .mapToObj(c -> (char) c)
+ .collect(Collectors.toList());
+ Collections.shuffle(pwdChars);
+ String password = pwdChars.stream()
+ .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
+ .toString();
+ return password;
+ }
+
+ public String generateSecureRandomPassword() {
+ Stream pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false))));
+ List charList = pwdStream.collect(Collectors.toList());
+ Collections.shuffle(charList);
+ String password = charList.stream()
+ .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
+ .toString();
+ return password;
+ }
+
+ public String generateRandomSpecialCharacters(int length) {
+ RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45)
+ .build();
+ return pwdGenerator.generate(length);
+ }
+
+ public String generateRandomNumbers(int length) {
+ RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57)
+ .build();
+ return pwdGenerator.generate(length);
+ }
+
+ public String generateRandomCharacters(int length) {
+ RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57)
+ .build();
+ return pwdGenerator.generate(length);
+ }
+
+ public String generateRandomAlphabet(int length, boolean lowerCase) {
+ int low;
+ int hi;
+ if (lowerCase) {
+ low = 97;
+ hi = 122;
+ } else {
+ low = 65;
+ hi = 90;
+ }
+ RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi)
+ .build();
+ return pwdGenerator.generate(length);
+ }
+
+ public Stream getRandomAlphabets(int count, boolean upperCase) {
+ IntStream characters = null;
+ if (upperCase) {
+ characters = random.ints(count, 65, 90);
+ } else {
+ characters = random.ints(count, 97, 122);
+ }
+ return characters.mapToObj(data -> (char) data);
+ }
+
+ public Stream getRandomNumbers(int count) {
+ IntStream numbers = random.ints(count, 48, 57);
+ return numbers.mapToObj(data -> (char) data);
+ }
+
+ public Stream getRandomSpecialChars(int count) {
+ IntStream specialChars = random.ints(count, 33, 45);
+ return specialChars.mapToObj(data -> (char) data);
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java
new file mode 100644
index 0000000000..c5f7051c25
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.java8.base64;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.Base64;
+
+import javax.xml.bind.DatatypeConverter;
+
+import org.junit.Test;
+
+public class StringToByteArrayUnitTest {
+
+ @Test
+ public void whenConvertStringToByteArrayUsingStringClass_thenOk() {
+ final String originalInput = "test input";
+ byte[] result = originalInput.getBytes();
+ System.out.println(Arrays.toString(result));
+
+ assertEquals(originalInput.length(), result.length);
+ }
+
+ @Test
+ public void givenCharset_whenConvertStringToByteArrayUsingStringClass_thenOk() throws UnsupportedEncodingException {
+ final String originalInput = "test input";
+ byte[] result = originalInput.getBytes(StandardCharsets.UTF_16);
+ System.out.println(Arrays.toString(result));
+
+ assertTrue(originalInput.length() < result.length);
+ }
+
+ @Test
+ public void whenConvertStringToByteArrayUsingBase64Decoder_thenOk() {
+ final String originalInput = "dGVzdCBpbnB1dA==";
+ byte[] result = Base64.getDecoder().decode(originalInput);
+
+ assertEquals("test input", new String(result));
+ }
+
+ @Test
+ public void whenConvertStringToByteArrayUsingDatatypeConverter_thenOk() {
+ final String originalInput = "dGVzdCBpbnB1dA==";
+ byte[] result = DatatypeConverter.parseBase64Binary(originalInput);
+
+ assertEquals("test input", new String(result));
+ }
+
+ @Test
+ public void whenConvertStringToByteArray_thenOk(){
+ String originalInput = "7465737420696E707574";
+ byte[] result = DatatypeConverter.parseHexBinary(originalInput);
+ System.out.println(Arrays.toString(result));
+
+ assertEquals("test input", new String(result));
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
new file mode 100644
index 0000000000..bfd4b0fe8e
--- /dev/null
+++ b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.string.password;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Examples of passwords conforming to various specifications, using different libraries.
+ *
+ */
+public class StringPasswordUnitTest {
+
+ RandomPasswordGenerator passGen = new RandomPasswordGenerator();
+
+ @Test
+ public void whenPasswordGeneratedUsingPassay_thenSuccessful() {
+ String password = passGen.generatePassayPassword();
+ int specialCharCount = 0;
+ for (char c : password.toCharArray()) {
+ if (c >= 33 || c <= 47) {
+ specialCharCount++;
+ }
+ }
+ assertTrue("Password validation failed in Passay", specialCharCount >= 2);
+ }
+
+ @Test
+ public void whenPasswordGeneratedUsingCommonsText_thenSuccessful() {
+ RandomPasswordGenerator passGen = new RandomPasswordGenerator();
+ String password = passGen.generateCommonTextPassword();
+ int lowerCaseCount = 0;
+ for (char c : password.toCharArray()) {
+ if (c >= 97 || c <= 122) {
+ lowerCaseCount++;
+ }
+ }
+ assertTrue("Password validation failed in commons-text ", lowerCaseCount >= 2);
+ }
+
+ @Test
+ public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful() {
+ String password = passGen.generateCommonsLang3Password();
+ int numCount = 0;
+ for (char c : password.toCharArray()) {
+ if (c >= 48 || c <= 57) {
+ numCount++;
+ }
+ }
+ assertTrue("Password validation failed in commons-lang3", numCount >= 2);
+ }
+
+ @Test
+ public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful() {
+ String password = passGen.generateSecureRandomPassword();
+ int specialCharCount = 0;
+ for (char c : password.toCharArray()) {
+ if (c >= 33 || c <= 47) {
+ specialCharCount++;
+ }
+ }
+ assertTrue("Password validation failed in Secure Random", specialCharCount >= 2);
+ }
+
+}
diff --git a/javaxval/README.md b/javaxval/README.md
index 3153546c7d..3a975022ad 100644
--- a/javaxval/README.md
+++ b/javaxval/README.md
@@ -9,3 +9,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Java Bean Validation Basics](http://www.baeldung.com/javax-validation)
- [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements)
- [Method Constraints with Bean Validation 2.0](http://www.baeldung.com/javax-validation-method-constraints)
+- [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank)
diff --git a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java
index c55362487b..1a648290a3 100644
--- a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java
+++ b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java
@@ -54,4 +54,9 @@ public class Fruit {
public void setSerial(String serial) {
this.serial = serial;
}
+
+ @Override
+ public String toString() {
+ return "Fruit [name: " + getName() + " colour: " + getColour() + "]";
+ }
}
diff --git a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java
index ee34cdd3ca..88692dcc55 100644
--- a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java
+++ b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java
@@ -16,6 +16,8 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import org.glassfish.jersey.server.mvc.ErrorTemplate;
import org.glassfish.jersey.server.mvc.Template;
@@ -86,6 +88,16 @@ public class FruitResource {
public void createFruit(@Valid Fruit fruit) {
SimpleStorageService.storeFruit(fruit);
}
+
+ @POST
+ @Path("/created")
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Response createNewFruit(@Valid Fruit fruit) {
+ String result = "Fruit saved : " + fruit;
+ return Response.status(Status.CREATED.getStatusCode())
+ .entity(result)
+ .build();
+ }
@GET
@Valid
diff --git a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java
new file mode 100644
index 0000000000..8953f4161c
--- /dev/null
+++ b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.jersey.server;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.junit.Test;
+
+public class GreetingsResourceIntegrationTest extends JerseyTest {
+
+ @Override
+ protected Application configure() {
+ return new ResourceConfig(Greetings.class);
+ }
+
+ @Test
+ public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi() {
+ Response response = target("/greetings/hi").request()
+ .get();
+
+ assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus());
+ assertEquals("Http Content-Type should be: ", MediaType.TEXT_HTML, response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+ String content = response.readEntity(String.class);
+ assertEquals("Content of ressponse is: ", "hi", content);
+ }
+}
diff --git a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java
index 2eeb5710cb..376c8c1e75 100644
--- a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java
+++ b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java
@@ -10,6 +10,7 @@ import javax.ws.rs.core.Application;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.TestProperties;
@@ -63,6 +64,15 @@ public class FruitResourceIntegrationTest extends JerseyTest {
assertEquals("Http Response should be 400 ", 400, response.getStatus());
assertThat(response.readEntity(String.class), containsString("Fruit colour must not be null"));
}
+
+ @Test
+ public void givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated() {
+ Response response = target("fruit/created").request()
+ .post(Entity.json("{\"name\":\"strawberry\",\"weight\":20}"));
+
+ assertEquals("Http Response should be 201 ", Status.CREATED.getStatusCode(), response.getStatus());
+ assertThat(response.readEntity(String.class), containsString("Fruit saved : Fruit [name: strawberry colour: null]"));
+ }
@Test
public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() {
@@ -102,6 +112,23 @@ public class FruitResourceIntegrationTest extends JerseyTest {
.get(String.class);
assertThat(json, containsString("{\"name\":\"strawberry\",\"weight\":20}"));
}
+
+ @Test
+ public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity() {
+ Fruit fruit = new Fruit();
+ fruit.setName("strawberry");
+ fruit.setWeight(20);
+ Response response = target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE)
+ .post(Entity.entity(fruit, MediaType.APPLICATION_JSON_TYPE));
+
+ assertEquals("Http Response should be 204 ", 204, response.getStatus());
+
+ final Fruit entity = target("fruit/search/strawberry").request()
+ .get(Fruit.class);
+
+ assertEquals("Fruit name: ", "strawberry", entity.getName());
+ assertEquals("Fruit weight: ", Integer.valueOf(20), entity.getWeight());
+ }
@Test
public void givenFruit_whenFruitIsInvalid_thenReponseContainsCustomExceptions() {
diff --git a/jib/pom.xml b/jib/pom.xml
new file mode 100644
index 0000000000..e71250f157
--- /dev/null
+++ b/jib/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ jib
+ 0.1-SNAPSHOT
+ jib
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ com.google.cloud.tools
+ jib-maven-plugin
+ 0.9.10
+
+
+ registry.hub.docker.com/baeldungjib/jib-spring-boot-app
+
+
+
+
+
+
+
+
+ spring-releases
+ https://repo.spring.io/libs-release
+
+
+
+
+ spring-releases
+ https://repo.spring.io/libs-release
+
+
+
diff --git a/jib/src/main/java/com/baeldung/Application.java b/jib/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..8c087476bf
--- /dev/null
+++ b/jib/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,12 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+}
\ No newline at end of file
diff --git a/jib/src/main/java/com/baeldung/Greeting.java b/jib/src/main/java/com/baeldung/Greeting.java
new file mode 100644
index 0000000000..62834d9752
--- /dev/null
+++ b/jib/src/main/java/com/baeldung/Greeting.java
@@ -0,0 +1,20 @@
+package com.baeldung;
+
+public class Greeting {
+
+ private final long id;
+ private final String content;
+
+ public Greeting(long id, String content) {
+ this.id = id;
+ this.content = content;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public String getContent() {
+ return content;
+ }
+}
\ No newline at end of file
diff --git a/jib/src/main/java/com/baeldung/GreetingController.java b/jib/src/main/java/com/baeldung/GreetingController.java
new file mode 100644
index 0000000000..0b082b0001
--- /dev/null
+++ b/jib/src/main/java/com/baeldung/GreetingController.java
@@ -0,0 +1,20 @@
+package com.baeldung;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+@RestController
+public class GreetingController {
+
+ private static final String template = "Hello Docker, %s!";
+ private final AtomicLong counter = new AtomicLong();
+
+ @GetMapping("/greeting")
+ public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
+ return new Greeting(counter.incrementAndGet(),
+ String.format(template, name));
+ }
+}
\ No newline at end of file
diff --git a/libraries-security/README.md b/libraries-security/README.md
new file mode 100644
index 0000000000..c42e91a888
--- /dev/null
+++ b/libraries-security/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- [Guide to ScribeJava](https://www.baeldung.com/scribejava)
diff --git a/libraries/README.md b/libraries/README.md
index c2c4b2718a..fcf687d806 100644
--- a/libraries/README.md
+++ b/libraries/README.md
@@ -81,6 +81,8 @@
- [Guide to Resilience4j](http://www.baeldung.com/resilience4j)
- [Parsing YAML with SnakeYAML](http://www.baeldung.com/java-snake-yaml)
- [Guide to JMapper](http://www.baeldung.com/jmapper)
+- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
+- [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once)
The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own.
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 91c54b6113..8ffd33272d 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -358,6 +358,7 @@
org.codehaus.groovy
groovy-all
+ pom
${groovy.version}
@@ -710,6 +711,12 @@
${snakeyaml.version}
+
+ com.numericalmethod
+ suanshu
+ ${suanshu.version}
+
+
@@ -730,6 +737,12 @@
Apache Staging
https://repository.apache.org/content/groups/staging
+
+ nm-repo
+ Numerical Method's Maven Repository
+ http://repo.numericalmethod.com/maven/
+ default
+
@@ -834,6 +847,7 @@
+ 4.0.0
1.21
1.23.0
0.1.0
@@ -922,7 +936,7 @@
2.3.0
0.9.12
1.19
- 2.4.10
+ 2.5.2
1.1.0
3.9.0
2.0.4
diff --git a/libraries/src/main/java/com/baeldung/suanshu/SuanShuMath.java b/libraries/src/main/java/com/baeldung/suanshu/SuanShuMath.java
new file mode 100644
index 0000000000..46af24692d
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/suanshu/SuanShuMath.java
@@ -0,0 +1,142 @@
+package com.baeldung.suanshu;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.numericalmethod.suanshu.algebra.linear.matrix.doubles.Matrix;
+import com.numericalmethod.suanshu.algebra.linear.vector.doubles.Vector;
+import com.numericalmethod.suanshu.algebra.linear.vector.doubles.dense.DenseVector;
+import com.numericalmethod.suanshu.algebra.linear.matrix.doubles.matrixtype.dense.DenseMatrix;
+import com.numericalmethod.suanshu.algebra.linear.matrix.doubles.operation.Inverse;
+import com.numericalmethod.suanshu.analysis.function.polynomial.Polynomial;
+import com.numericalmethod.suanshu.analysis.function.polynomial.root.PolyRoot;
+import com.numericalmethod.suanshu.analysis.function.polynomial.root.PolyRootSolver;
+import com.numericalmethod.suanshu.number.complex.Complex;
+
+class SuanShuMath {
+
+ private static final Logger log = LoggerFactory.getLogger(SuanShuMath.class);
+
+ public static void main(String[] args) throws Exception {
+ SuanShuMath math = new SuanShuMath();
+
+ math.addingVectors();
+ math.scaleVector();
+ math.innerProductVectors();
+ math.addingIncorrectVectors();
+
+ math.addingMatrices();
+ math.multiplyMatrices();
+ math.multiplyIncorrectMatrices();
+ math.inverseMatrix();
+
+ Polynomial p = math.createPolynomial();
+ math.evaluatePolynomial(p);
+ math.solvePolynomial();
+ }
+
+ public void addingVectors() throws Exception {
+ Vector v1 = new DenseVector(new double[]{1, 2, 3, 4, 5});
+ Vector v2 = new DenseVector(new double[]{5, 4, 3, 2, 1});
+ Vector v3 = v1.add(v2);
+ log.info("Adding vectors: {}", v3);
+ }
+
+ public void scaleVector() throws Exception {
+ Vector v1 = new DenseVector(new double[]{1, 2, 3, 4, 5});
+ Vector v2 = v1.scaled(2.0);
+ log.info("Scaling a vector: {}", v2);
+ }
+
+ public void innerProductVectors() throws Exception {
+ Vector v1 = new DenseVector(new double[]{1, 2, 3, 4, 5});
+ Vector v2 = new DenseVector(new double[]{5, 4, 3, 2, 1});
+ double inner = v1.innerProduct(v2);
+ log.info("Vector inner product: {}", inner);
+ }
+
+ public void addingIncorrectVectors() throws Exception {
+ Vector v1 = new DenseVector(new double[]{1, 2, 3});
+ Vector v2 = new DenseVector(new double[]{5, 4});
+ Vector v3 = v1.add(v2);
+ log.info("Adding vectors: {}", v3);
+ }
+
+ public void addingMatrices() throws Exception {
+ Matrix m1 = new DenseMatrix(new double[][]{
+ {1, 2, 3},
+ {4, 5, 6}
+ });
+
+ Matrix m2 = new DenseMatrix(new double[][]{
+ {3, 2, 1},
+ {6, 5, 4}
+ });
+
+ Matrix m3 = m1.add(m2);
+ log.info("Adding matrices: {}", m3);
+ }
+
+ public void multiplyMatrices() throws Exception {
+ Matrix m1 = new DenseMatrix(new double[][]{
+ {1, 2, 3},
+ {4, 5, 6}
+ });
+
+ Matrix m2 = new DenseMatrix(new double[][]{
+ {1, 4},
+ {2, 5},
+ {3, 6}
+ });
+
+ Matrix m3 = m1.multiply(m2);
+ log.info("Multiplying matrices: {}", m3);
+ }
+
+ public void multiplyIncorrectMatrices() throws Exception {
+ Matrix m1 = new DenseMatrix(new double[][]{
+ {1, 2, 3},
+ {4, 5, 6}
+ });
+
+ Matrix m2 = new DenseMatrix(new double[][]{
+ {3, 2, 1},
+ {6, 5, 4}
+ });
+
+ Matrix m3 = m1.multiply(m2);
+ log.info("Multiplying matrices: {}", m3);
+ }
+
+ public void inverseMatrix() {
+ Matrix m1 = new DenseMatrix(new double[][]{
+ {1, 2},
+ {3, 4}
+ });
+
+ Inverse m2 = new Inverse(m1);
+ log.info("Inverting a matrix: {}", m2);
+ log.info("Verifying a matrix inverse: {}", m1.multiply(m2));
+ }
+
+ public Polynomial createPolynomial() {
+ return new Polynomial(new double[]{3, -5, 1});
+ }
+
+ public void evaluatePolynomial(Polynomial p) {
+ // Evaluate using a real number
+ log.info("Evaluating a polynomial using a real number: {}", p.evaluate(5));
+ // Evaluate using a complex number
+ log.info("Evaluating a polynomial using a complex number: {}", p.evaluate(new Complex(1, 2)));
+ }
+
+ public void solvePolynomial() {
+ Polynomial p = new Polynomial(new double[]{2, 2, -4});
+ PolyRootSolver solver = new PolyRoot();
+ List extends Number> roots = solver.solve(p);
+ log.info("Finding polynomial roots: {}", roots);
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsUnitTest.java b/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java
similarity index 86%
rename from libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsUnitTest.java
rename to libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java
index 0efe97f912..cb45ebc24d 100644
--- a/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsUnitTest.java
+++ b/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java
@@ -6,8 +6,10 @@ import org.apache.commons.lang3.SystemUtils;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
-public class SystemsUtilsUnitTest {
+public class SystemsUtilsManualTest {
+ // the paths depend on the OS and installed version of Java
+
@Test
public void givenSystemUtilsClass_whenCalledgetJavaHome_thenCorrect() {
assertThat(SystemUtils.getJavaHome()).isEqualTo(new File("/usr/lib/jvm/java-8-oracle/jre"));
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/application.properties b/logging-modules/log4j2/${sys
similarity index 100%
rename from spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/application.properties
rename to logging-modules/log4j2/${sys
diff --git a/lombok/pom.xml b/lombok/pom.xml
index eba140122a..7ad2e3dc83 100644
--- a/lombok/pom.xml
+++ b/lombok/pom.xml
@@ -59,6 +59,7 @@
${project.basedir}/src/main/java
+ ${project.build.directory}/delombok
false
skip
diff --git a/lombok/src/main/java/com/baeldung/lombok/builder/defaultvalue/Pojo.java b/lombok/src/main/java/com/baeldung/lombok/builder/defaultvalue/Pojo.java
new file mode 100644
index 0000000000..feaade9cd5
--- /dev/null
+++ b/lombok/src/main/java/com/baeldung/lombok/builder/defaultvalue/Pojo.java
@@ -0,0 +1,17 @@
+package com.baeldung.lombok.builder.defaultvalue;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@Builder(toBuilder = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class Pojo {
+ private String name = "foo";
+ private boolean original = true;
+}
diff --git a/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java
new file mode 100644
index 0000000000..d9184f605c
--- /dev/null
+++ b/lombok/src/test/java/com/baeldung/lombok/builder/defaultvalue/BuilderWithDefaultValueUnitTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.lombok.builder.defaultvalue;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BuilderWithDefaultValueUnitTest {
+
+ @Test
+ public void givenBuilderWithDefaultValue_ThanDefaultValueIsPresent() {
+ Pojo build = new Pojo().toBuilder()
+ .build();
+ Assert.assertEquals("foo", build.getName());
+ Assert.assertTrue(build.isOriginal());
+ }
+
+ @Test
+ public void givenBuilderWithDefaultValue_NoArgsWorksAlso() {
+ Pojo build = new Pojo().toBuilder()
+ .build();
+ Pojo pojo = new Pojo();
+ Assert.assertEquals(build.getName(), pojo.getName());
+ Assert.assertTrue(build.isOriginal() == pojo.isOriginal());
+ }
+
+}
diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml
index 7742841d07..c61b791ef3 100644
--- a/parent-boot-1/pom.xml
+++ b/parent-boot-1/pom.xml
@@ -17,7 +17,7 @@
org.springframework.boot
spring-boot-dependencies
- 1.5.15.RELEASE
+ ${spring-boot.version}
pom
import
@@ -42,7 +42,7 @@
org.springframework.boot
spring-boot-maven-plugin
- 1.5.15.RELEASE
+ ${spring-boot.version}
@@ -50,6 +50,7 @@
3.1.0
+ 1.5.16.RELEASE
-
-
\ No newline at end of file
+
+
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index de6cb5d068..bcfcfdec44 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -17,7 +17,7 @@
org.springframework.boot
spring-boot-dependencies
- 2.0.4.RELEASE
+ ${spring-boot.version}
pom
import
@@ -41,7 +41,7 @@
org.springframework.boot
spring-boot-maven-plugin
- 2.0.4.RELEASE
+ ${spring-boot.version}
@@ -73,6 +73,6 @@
3.1.0
1.0.11.RELEASE
+ 2.0.5.RELEASE
-
-
\ No newline at end of file
+
diff --git a/parent-spring-4/pom.xml b/parent-spring-4/pom.xml
index d1b1298013..9b3c42599b 100644
--- a/parent-spring-4/pom.xml
+++ b/parent-spring-4/pom.xml
@@ -29,7 +29,7 @@
- 4.3.17.RELEASE
+ 4.3.20.RELEASE
5.0.2
diff --git a/core-java-persistence/README.md b/persistence-modules/core-java-persistence/README.md
similarity index 100%
rename from core-java-persistence/README.md
rename to persistence-modules/core-java-persistence/README.md
diff --git a/core-java-persistence/pom.xml b/persistence-modules/core-java-persistence/pom.xml
similarity index 95%
rename from core-java-persistence/pom.xml
rename to persistence-modules/core-java-persistence/pom.xml
index 7279fd763b..f012d60ee6 100644
--- a/core-java-persistence/pom.xml
+++ b/persistence-modules/core-java-persistence/pom.xml
@@ -1,71 +1,71 @@
-
- 4.0.0
- com.baeldung.core-java-persistence
- core-java-persistence
- 0.1.0-SNAPSHOT
- jar
- core-java-persistence
-
- com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../parent-java
-
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
- com.h2database
- h2
- ${h2database.version}
-
-
- org.apache.commons
- commons-dbcp2
- ${commons-dbcp2.version}
-
-
- com.zaxxer
- HikariCP
- ${HikariCP.version}
-
-
- com.mchange
- c3p0
- ${c3p0.version}
-
-
- org.springframework
- spring-web
- ${springframework.spring-web.version}
-
-
- org.springframework.boot
- spring-boot-starter
- ${springframework.boot.spring-boot-starter.version}
-
-
-
- core-java-persistence
-
-
- src/main/resources
- true
-
-
-
-
- 3.10.0
- 1.4.197
- 2.4.0
- 3.2.0
- 0.9.5.2
- 1.5.8.RELEASE
- 4.3.4.RELEASE
-
+
+ 4.0.0
+ com.baeldung.core-java-persistence
+ core-java-persistence
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-persistence
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ com.h2database
+ h2
+ ${h2database.version}
+
+
+ org.apache.commons
+ commons-dbcp2
+ ${commons-dbcp2.version}
+
+
+ com.zaxxer
+ HikariCP
+ ${HikariCP.version}
+
+
+ com.mchange
+ c3p0
+ ${c3p0.version}
+
+
+ org.springframework
+ spring-web
+ ${springframework.spring-web.version}
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${springframework.boot.spring-boot-starter.version}
+
+
+
+ core-java-persistence
+
+
+ src/main/resources
+ true
+
+
+
+
+ 3.10.0
+ 1.4.197
+ 2.4.0
+ 3.2.0
+ 0.9.5.2
+ 1.5.8.RELEASE
+ 4.3.4.RELEASE
+
\ No newline at end of file
diff --git a/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/BasicConnectionPool.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/C3poDataSource.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/connectionpool/ConnectionPool.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/ConnectionPool.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/connectionpool/ConnectionPool.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/ConnectionPool.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/connectionpool/DBCPDataSource.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/DBCPDataSource.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/connectionpool/DBCPDataSource.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/DBCPDataSource.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/connectionpool/HikariCPDataSource.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/HikariCPDataSource.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/connectionpool/HikariCPDataSource.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/connectionpool/HikariCPDataSource.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbc/BatchProcessing.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbc/BatchProcessing.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbc/BatchProcessing.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbc/BatchProcessing.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbc/Employee.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbc/Employee.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbc/Employee.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbc/Employee.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/DatabaseConfiguration.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/ExampleListener.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/FilterExample.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/FilterExample.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbcrowset/FilterExample.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/FilterExample.java
diff --git a/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java
similarity index 100%
rename from core-java-persistence/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java
rename to persistence-modules/core-java-persistence/src/main/java/com/baeldung/jdbcrowset/JdbcRowsetApplication.java
diff --git a/influxdb/src/main/resources/logback.xml b/persistence-modules/core-java-persistence/src/main/resources/logback.xml
similarity index 100%
rename from influxdb/src/main/resources/logback.xml
rename to persistence-modules/core-java-persistence/src/main/resources/logback.xml
diff --git a/core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
similarity index 97%
rename from core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
index 479cd0db25..3b3c9870fb 100644
--- a/core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java
@@ -1,67 +1,67 @@
-package com.baeldung.connectionpool;
-
-import java.sql.Connection;
-import java.sql.SQLException;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class BasicConnectionPoolUnitTest {
-
- private static ConnectionPool connectionPool;
-
- @BeforeClass
- public static void setUpBasicConnectionPoolInstance() throws SQLException {
- connectionPool = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenCalledgetConnection_thenCorrect() throws Exception {
- assertTrue(connectionPool.getConnection().isValid(1));
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenCalledreleaseConnection_thenCorrect() throws Exception {
- Connection connection = connectionPool.getConnection();
- assertThat(connectionPool.releaseConnection(connection)).isTrue();
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenCalledgetUrl_thenCorrect() {
- assertThat(connectionPool.getUrl()).isEqualTo("jdbc:h2:mem:test");
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenCalledgetUser_thenCorrect() {
- assertThat(connectionPool.getUser()).isEqualTo("user");
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenCalledgetPassword_thenCorrect() {
- assertThat(connectionPool.getPassword()).isEqualTo("password");
- }
-
- @Test(expected = RuntimeException.class)
- public void givenBasicConnectionPoolInstance_whenAskedForMoreThanMax_thenError() throws Exception {
- // this test needs to be independent so it doesn't share the same connection pool as other tests
- ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
- final int MAX_POOL_SIZE = 20;
- for (int i = 0; i < MAX_POOL_SIZE + 1; i++) {
- cp.getConnection();
- }
- fail();
- }
-
- @Test
- public void givenBasicConnectionPoolInstance_whenSutdown_thenEmpty() throws Exception {
- ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
- assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(10);
-
- ((BasicConnectionPool) cp).shutdown();
- assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(0);
- }
-}
+package com.baeldung.connectionpool;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class BasicConnectionPoolUnitTest {
+
+ private static ConnectionPool connectionPool;
+
+ @BeforeClass
+ public static void setUpBasicConnectionPoolInstance() throws SQLException {
+ connectionPool = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetConnection_thenCorrect() throws Exception {
+ assertTrue(connectionPool.getConnection().isValid(1));
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledreleaseConnection_thenCorrect() throws Exception {
+ Connection connection = connectionPool.getConnection();
+ assertThat(connectionPool.releaseConnection(connection)).isTrue();
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetUrl_thenCorrect() {
+ assertThat(connectionPool.getUrl()).isEqualTo("jdbc:h2:mem:test");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetUser_thenCorrect() {
+ assertThat(connectionPool.getUser()).isEqualTo("user");
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenCalledgetPassword_thenCorrect() {
+ assertThat(connectionPool.getPassword()).isEqualTo("password");
+ }
+
+ @Test(expected = RuntimeException.class)
+ public void givenBasicConnectionPoolInstance_whenAskedForMoreThanMax_thenError() throws Exception {
+ // this test needs to be independent so it doesn't share the same connection pool as other tests
+ ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ final int MAX_POOL_SIZE = 20;
+ for (int i = 0; i < MAX_POOL_SIZE + 1; i++) {
+ cp.getConnection();
+ }
+ fail();
+ }
+
+ @Test
+ public void givenBasicConnectionPoolInstance_whenSutdown_thenEmpty() throws Exception {
+ ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password");
+ assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(10);
+
+ ((BasicConnectionPool) cp).shutdown();
+ assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(0);
+ }
+}
diff --git a/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
similarity index 96%
rename from core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
index a07fa9e74b..acad9fe5e4 100644
--- a/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java
@@ -1,13 +1,13 @@
-package com.baeldung.connectionpool;
-
-import java.sql.SQLException;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-
-public class C3poDataSourceUnitTest {
-
- @Test
- public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
- assertTrue(C3poDataSource.getConnection().isValid(1));
- }
+package com.baeldung.connectionpool;
+
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class C3poDataSourceUnitTest {
+
+ @Test
+ public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(C3poDataSource.getConnection().isValid(1));
+ }
}
\ No newline at end of file
diff --git a/core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
similarity index 96%
rename from core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
index 43aaf330b6..4882d2af73 100644
--- a/core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java
@@ -1,13 +1,13 @@
-package com.baeldung.connectionpool;
-
-import java.sql.SQLException;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-
-public class DBCPDataSourceUnitTest {
-
- @Test
- public void givenDBCPDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
- assertTrue(DBCPDataSource.getConnection().isValid(1));
- }
+package com.baeldung.connectionpool;
+
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class DBCPDataSourceUnitTest {
+
+ @Test
+ public void givenDBCPDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(DBCPDataSource.getConnection().isValid(1));
+ }
}
\ No newline at end of file
diff --git a/core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
similarity index 96%
rename from core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
index b20ce70efd..885743ab2b 100644
--- a/core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java
@@ -1,13 +1,13 @@
-package com.baeldung.connectionpool;
-
-import java.sql.SQLException;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
-
-public class HikariCPDataSourceUnitTest {
-
- @Test
- public void givenHikariDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
- assertTrue(HikariCPDataSource.getConnection().isValid(1));
- }
+package com.baeldung.connectionpool;
+
+import java.sql.SQLException;
+import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+
+public class HikariCPDataSourceUnitTest {
+
+ @Test
+ public void givenHikariDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException {
+ assertTrue(HikariCPDataSource.getConnection().isValid(1));
+ }
}
\ No newline at end of file
diff --git a/core-java-persistence/src/test/java/com/baeldung/jdbc/BatchProcessingLiveTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbc/BatchProcessingLiveTest.java
similarity index 100%
rename from core-java-persistence/src/test/java/com/baeldung/jdbc/BatchProcessingLiveTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbc/BatchProcessingLiveTest.java
diff --git a/core-java-persistence/src/test/java/com/baeldung/jdbc/JdbcLiveTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbc/JdbcLiveTest.java
similarity index 100%
rename from core-java-persistence/src/test/java/com/baeldung/jdbc/JdbcLiveTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbc/JdbcLiveTest.java
diff --git a/core-java-persistence/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetLiveTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetLiveTest.java
similarity index 100%
rename from core-java-persistence/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetLiveTest.java
rename to persistence-modules/core-java-persistence/src/test/java/com/baeldung/jdbcrowset/JdbcRowSetLiveTest.java
diff --git a/deltaspike/.gitignore b/persistence-modules/deltaspike/.gitignore
similarity index 100%
rename from deltaspike/.gitignore
rename to persistence-modules/deltaspike/.gitignore
diff --git a/deltaspike/README.md b/persistence-modules/deltaspike/README.md
similarity index 100%
rename from deltaspike/README.md
rename to persistence-modules/deltaspike/README.md
diff --git a/deltaspike/pom.xml b/persistence-modules/deltaspike/pom.xml
similarity index 99%
rename from deltaspike/pom.xml
rename to persistence-modules/deltaspike/pom.xml
index 8ab3e3fd80..b798d2f39e 100644
--- a/deltaspike/pom.xml
+++ b/persistence-modules/deltaspike/pom.xml
@@ -14,6 +14,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/deltaspike/src/main/java/baeldung/controller/MemberController.java b/persistence-modules/deltaspike/src/main/java/baeldung/controller/MemberController.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/controller/MemberController.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/controller/MemberController.java
diff --git a/deltaspike/src/main/java/baeldung/data/EntityManagerProducer.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/EntityManagerProducer.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/EntityManagerProducer.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/EntityManagerProducer.java
diff --git a/deltaspike/src/main/java/baeldung/data/MemberListProducer.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/MemberListProducer.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/MemberListProducer.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/MemberListProducer.java
diff --git a/deltaspike/src/main/java/baeldung/data/MemberRepository.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/MemberRepository.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/MemberRepository.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/MemberRepository.java
diff --git a/deltaspike/src/main/java/baeldung/data/QueryDslRepositoryExtension.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/QueryDslRepositoryExtension.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/QueryDslRepositoryExtension.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/QueryDslRepositoryExtension.java
diff --git a/deltaspike/src/main/java/baeldung/data/QueryDslSupport.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/QueryDslSupport.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/QueryDslSupport.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/QueryDslSupport.java
diff --git a/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerProducer.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerProducer.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerProducer.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerProducer.java
diff --git a/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerResolver.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerResolver.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerResolver.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryEntityManagerResolver.java
diff --git a/deltaspike/src/main/java/baeldung/data/SecondaryPersistenceUnit.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryPersistenceUnit.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/SecondaryPersistenceUnit.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/SecondaryPersistenceUnit.java
diff --git a/deltaspike/src/main/java/baeldung/data/SimpleUserRepository.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/SimpleUserRepository.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/SimpleUserRepository.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/SimpleUserRepository.java
diff --git a/deltaspike/src/main/java/baeldung/data/UserRepository.java b/persistence-modules/deltaspike/src/main/java/baeldung/data/UserRepository.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/data/UserRepository.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/data/UserRepository.java
diff --git a/deltaspike/src/main/java/baeldung/model/Address.java b/persistence-modules/deltaspike/src/main/java/baeldung/model/Address.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/model/Address.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/model/Address.java
diff --git a/deltaspike/src/main/java/baeldung/model/Member.java b/persistence-modules/deltaspike/src/main/java/baeldung/model/Member.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/model/Member.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/model/Member.java
diff --git a/deltaspike/src/main/java/baeldung/model/User.java b/persistence-modules/deltaspike/src/main/java/baeldung/model/User.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/model/User.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/model/User.java
diff --git a/deltaspike/src/main/java/baeldung/rest/JaxRsActivator.java b/persistence-modules/deltaspike/src/main/java/baeldung/rest/JaxRsActivator.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/rest/JaxRsActivator.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/rest/JaxRsActivator.java
diff --git a/deltaspike/src/main/java/baeldung/rest/MemberResourceRESTService.java b/persistence-modules/deltaspike/src/main/java/baeldung/rest/MemberResourceRESTService.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/rest/MemberResourceRESTService.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/rest/MemberResourceRESTService.java
diff --git a/deltaspike/src/main/java/baeldung/service/MemberRegistration.java b/persistence-modules/deltaspike/src/main/java/baeldung/service/MemberRegistration.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/service/MemberRegistration.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/service/MemberRegistration.java
diff --git a/deltaspike/src/main/java/baeldung/util/Resources.java b/persistence-modules/deltaspike/src/main/java/baeldung/util/Resources.java
similarity index 100%
rename from deltaspike/src/main/java/baeldung/util/Resources.java
rename to persistence-modules/deltaspike/src/main/java/baeldung/util/Resources.java
diff --git a/deltaspike/src/main/resources/META-INF/apache-deltaspike.properties b/persistence-modules/deltaspike/src/main/resources/META-INF/apache-deltaspike.properties
similarity index 100%
rename from deltaspike/src/main/resources/META-INF/apache-deltaspike.properties
rename to persistence-modules/deltaspike/src/main/resources/META-INF/apache-deltaspike.properties
diff --git a/deltaspike/src/main/resources/META-INF/beans.xml b/persistence-modules/deltaspike/src/main/resources/META-INF/beans.xml
similarity index 100%
rename from deltaspike/src/main/resources/META-INF/beans.xml
rename to persistence-modules/deltaspike/src/main/resources/META-INF/beans.xml
diff --git a/deltaspike/src/main/resources/META-INF/persistence.xml b/persistence-modules/deltaspike/src/main/resources/META-INF/persistence.xml
similarity index 100%
rename from deltaspike/src/main/resources/META-INF/persistence.xml
rename to persistence-modules/deltaspike/src/main/resources/META-INF/persistence.xml
diff --git a/deltaspike/src/main/resources/import.sql b/persistence-modules/deltaspike/src/main/resources/import.sql
similarity index 100%
rename from deltaspike/src/main/resources/import.sql
rename to persistence-modules/deltaspike/src/main/resources/import.sql
diff --git a/influxdb/src/test/resources/logback.xml b/persistence-modules/deltaspike/src/main/resources/logback.xml
similarity index 100%
rename from influxdb/src/test/resources/logback.xml
rename to persistence-modules/deltaspike/src/main/resources/logback.xml
diff --git a/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-ds.xml b/persistence-modules/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-ds.xml
similarity index 100%
rename from deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-ds.xml
rename to persistence-modules/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-ds.xml
diff --git a/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-secondary-ds.xml b/persistence-modules/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-secondary-ds.xml
similarity index 100%
rename from deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-secondary-ds.xml
rename to persistence-modules/deltaspike/src/main/webapp/WEB-INF/baeldung-jee7-seed-secondary-ds.xml
diff --git a/deltaspike/src/main/webapp/WEB-INF/beans.xml b/persistence-modules/deltaspike/src/main/webapp/WEB-INF/beans.xml
similarity index 100%
rename from deltaspike/src/main/webapp/WEB-INF/beans.xml
rename to persistence-modules/deltaspike/src/main/webapp/WEB-INF/beans.xml
diff --git a/deltaspike/src/main/webapp/WEB-INF/faces-config.xml b/persistence-modules/deltaspike/src/main/webapp/WEB-INF/faces-config.xml
similarity index 100%
rename from deltaspike/src/main/webapp/WEB-INF/faces-config.xml
rename to persistence-modules/deltaspike/src/main/webapp/WEB-INF/faces-config.xml
diff --git a/deltaspike/src/main/webapp/WEB-INF/templates/default.xhtml b/persistence-modules/deltaspike/src/main/webapp/WEB-INF/templates/default.xhtml
similarity index 100%
rename from deltaspike/src/main/webapp/WEB-INF/templates/default.xhtml
rename to persistence-modules/deltaspike/src/main/webapp/WEB-INF/templates/default.xhtml
diff --git a/deltaspike/src/main/webapp/index.html b/persistence-modules/deltaspike/src/main/webapp/index.html
similarity index 100%
rename from deltaspike/src/main/webapp/index.html
rename to persistence-modules/deltaspike/src/main/webapp/index.html
diff --git a/deltaspike/src/main/webapp/index.xhtml b/persistence-modules/deltaspike/src/main/webapp/index.xhtml
similarity index 100%
rename from deltaspike/src/main/webapp/index.xhtml
rename to persistence-modules/deltaspike/src/main/webapp/index.xhtml
diff --git a/deltaspike/src/main/webapp/resources/css/screen.css b/persistence-modules/deltaspike/src/main/webapp/resources/css/screen.css
similarity index 100%
rename from deltaspike/src/main/webapp/resources/css/screen.css
rename to persistence-modules/deltaspike/src/main/webapp/resources/css/screen.css
diff --git a/deltaspike/src/main/webapp/resources/gfx/asidebkg.png b/persistence-modules/deltaspike/src/main/webapp/resources/gfx/asidebkg.png
similarity index 100%
rename from deltaspike/src/main/webapp/resources/gfx/asidebkg.png
rename to persistence-modules/deltaspike/src/main/webapp/resources/gfx/asidebkg.png
diff --git a/deltaspike/src/main/webapp/resources/gfx/bkg-blkheader.png b/persistence-modules/deltaspike/src/main/webapp/resources/gfx/bkg-blkheader.png
similarity index 100%
rename from deltaspike/src/main/webapp/resources/gfx/bkg-blkheader.png
rename to persistence-modules/deltaspike/src/main/webapp/resources/gfx/bkg-blkheader.png
diff --git a/deltaspike/src/main/webapp/resources/gfx/dualbrand_logo.png b/persistence-modules/deltaspike/src/main/webapp/resources/gfx/dualbrand_logo.png
similarity index 100%
rename from deltaspike/src/main/webapp/resources/gfx/dualbrand_logo.png
rename to persistence-modules/deltaspike/src/main/webapp/resources/gfx/dualbrand_logo.png
diff --git a/deltaspike/src/main/webapp/resources/gfx/headerbkg.png b/persistence-modules/deltaspike/src/main/webapp/resources/gfx/headerbkg.png
similarity index 100%
rename from deltaspike/src/main/webapp/resources/gfx/headerbkg.png
rename to persistence-modules/deltaspike/src/main/webapp/resources/gfx/headerbkg.png
diff --git a/deltaspike/src/main/webapp/resources/gfx/wildfly_400x130.jpg b/persistence-modules/deltaspike/src/main/webapp/resources/gfx/wildfly_400x130.jpg
similarity index 100%
rename from deltaspike/src/main/webapp/resources/gfx/wildfly_400x130.jpg
rename to persistence-modules/deltaspike/src/main/webapp/resources/gfx/wildfly_400x130.jpg
diff --git a/deltaspike/src/test/java/baeldung/ValidatorProducer.java b/persistence-modules/deltaspike/src/test/java/baeldung/ValidatorProducer.java
similarity index 100%
rename from deltaspike/src/test/java/baeldung/ValidatorProducer.java
rename to persistence-modules/deltaspike/src/test/java/baeldung/ValidatorProducer.java
diff --git a/deltaspike/src/test/java/baeldung/data/TestEntityManagerProducer.java b/persistence-modules/deltaspike/src/test/java/baeldung/data/TestEntityManagerProducer.java
similarity index 100%
rename from deltaspike/src/test/java/baeldung/data/TestEntityManagerProducer.java
rename to persistence-modules/deltaspike/src/test/java/baeldung/data/TestEntityManagerProducer.java
diff --git a/deltaspike/src/test/java/baeldung/test/MemberRegistrationLiveTest.java b/persistence-modules/deltaspike/src/test/java/baeldung/test/MemberRegistrationLiveTest.java
similarity index 100%
rename from deltaspike/src/test/java/baeldung/test/MemberRegistrationLiveTest.java
rename to persistence-modules/deltaspike/src/test/java/baeldung/test/MemberRegistrationLiveTest.java
diff --git a/deltaspike/src/test/java/baeldung/test/SimpleUserRepositoryUnitTest.java b/persistence-modules/deltaspike/src/test/java/baeldung/test/SimpleUserRepositoryUnitTest.java
similarity index 100%
rename from deltaspike/src/test/java/baeldung/test/SimpleUserRepositoryUnitTest.java
rename to persistence-modules/deltaspike/src/test/java/baeldung/test/SimpleUserRepositoryUnitTest.java
diff --git a/deltaspike/src/test/java/baeldung/test/UserRepositoryUnitTest.java b/persistence-modules/deltaspike/src/test/java/baeldung/test/UserRepositoryUnitTest.java
similarity index 100%
rename from deltaspike/src/test/java/baeldung/test/UserRepositoryUnitTest.java
rename to persistence-modules/deltaspike/src/test/java/baeldung/test/UserRepositoryUnitTest.java
diff --git a/deltaspike/src/test/resources/META-INF/apache-deltaspike.properties b/persistence-modules/deltaspike/src/test/resources/META-INF/apache-deltaspike.properties
similarity index 100%
rename from deltaspike/src/test/resources/META-INF/apache-deltaspike.properties
rename to persistence-modules/deltaspike/src/test/resources/META-INF/apache-deltaspike.properties
diff --git a/deltaspike/src/test/resources/META-INF/beans.xml b/persistence-modules/deltaspike/src/test/resources/META-INF/beans.xml
similarity index 100%
rename from deltaspike/src/test/resources/META-INF/beans.xml
rename to persistence-modules/deltaspike/src/test/resources/META-INF/beans.xml
diff --git a/deltaspike/src/test/resources/META-INF/persistence.xml b/persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml
similarity index 100%
rename from deltaspike/src/test/resources/META-INF/persistence.xml
rename to persistence-modules/deltaspike/src/test/resources/META-INF/persistence.xml
diff --git a/deltaspike/src/test/resources/arquillian.xml b/persistence-modules/deltaspike/src/test/resources/arquillian.xml
similarity index 100%
rename from deltaspike/src/test/resources/arquillian.xml
rename to persistence-modules/deltaspike/src/test/resources/arquillian.xml
diff --git a/deltaspike/src/test/resources/import.sql b/persistence-modules/deltaspike/src/test/resources/import.sql
similarity index 100%
rename from deltaspike/src/test/resources/import.sql
rename to persistence-modules/deltaspike/src/test/resources/import.sql
diff --git a/deltaspike/src/test/resources/test-ds.xml b/persistence-modules/deltaspike/src/test/resources/test-ds.xml
similarity index 100%
rename from deltaspike/src/test/resources/test-ds.xml
rename to persistence-modules/deltaspike/src/test/resources/test-ds.xml
diff --git a/deltaspike/src/test/resources/test-secondary-ds.xml b/persistence-modules/deltaspike/src/test/resources/test-secondary-ds.xml
similarity index 100%
rename from deltaspike/src/test/resources/test-secondary-ds.xml
rename to persistence-modules/deltaspike/src/test/resources/test-secondary-ds.xml
diff --git a/influxdb/README.md b/persistence-modules/influxdb/README.md
similarity index 100%
rename from influxdb/README.md
rename to persistence-modules/influxdb/README.md
diff --git a/influxdb/pom.xml b/persistence-modules/influxdb/pom.xml
similarity index 96%
rename from influxdb/pom.xml
rename to persistence-modules/influxdb/pom.xml
index 5bb94bb6e2..5043d61897 100644
--- a/influxdb/pom.xml
+++ b/persistence-modules/influxdb/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java b/persistence-modules/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java
similarity index 100%
rename from influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java
rename to persistence-modules/influxdb/src/main/java/com/baeldung/influxdb/MemoryPoint.java
diff --git a/orientdb/src/main/resources/logback.xml b/persistence-modules/influxdb/src/main/resources/logback.xml
similarity index 100%
rename from orientdb/src/main/resources/logback.xml
rename to persistence-modules/influxdb/src/main/resources/logback.xml
diff --git a/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java b/persistence-modules/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
similarity index 100%
rename from influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
rename to persistence-modules/influxdb/src/test/java/com/baeldung/influxdb/InfluxDBConnectionLiveTest.java
diff --git a/spring-boot-persistence/src/main/resources/logback.xml b/persistence-modules/influxdb/src/test/resources/logback.xml
similarity index 100%
rename from spring-boot-persistence/src/main/resources/logback.xml
rename to persistence-modules/influxdb/src/test/resources/logback.xml
diff --git a/orientdb/.gitignore b/persistence-modules/orientdb/.gitignore
similarity index 100%
rename from orientdb/.gitignore
rename to persistence-modules/orientdb/.gitignore
diff --git a/orientdb/.mvn/wrapper/maven-wrapper.jar b/persistence-modules/orientdb/.mvn/wrapper/maven-wrapper.jar
similarity index 100%
rename from orientdb/.mvn/wrapper/maven-wrapper.jar
rename to persistence-modules/orientdb/.mvn/wrapper/maven-wrapper.jar
diff --git a/orientdb/.mvn/wrapper/maven-wrapper.properties b/persistence-modules/orientdb/.mvn/wrapper/maven-wrapper.properties
similarity index 100%
rename from orientdb/.mvn/wrapper/maven-wrapper.properties
rename to persistence-modules/orientdb/.mvn/wrapper/maven-wrapper.properties
diff --git a/orientdb/README.md b/persistence-modules/orientdb/README.md
similarity index 100%
rename from orientdb/README.md
rename to persistence-modules/orientdb/README.md
diff --git a/orientdb/mvnw b/persistence-modules/orientdb/mvnw
old mode 100755
new mode 100644
similarity index 100%
rename from orientdb/mvnw
rename to persistence-modules/orientdb/mvnw
diff --git a/orientdb/mvnw.cmd b/persistence-modules/orientdb/mvnw.cmd
similarity index 100%
rename from orientdb/mvnw.cmd
rename to persistence-modules/orientdb/mvnw.cmd
diff --git a/orientdb/pom.xml b/persistence-modules/orientdb/pom.xml
similarity index 97%
rename from orientdb/pom.xml
rename to persistence-modules/orientdb/pom.xml
index e1c7ac42bb..e4bc9a0585 100644
--- a/orientdb/pom.xml
+++ b/persistence-modules/orientdb/pom.xml
@@ -12,6 +12,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/orientdb/src/main/java/com/baeldung/orientdb/Author.java b/persistence-modules/orientdb/src/main/java/com/baeldung/orientdb/Author.java
similarity index 100%
rename from orientdb/src/main/java/com/baeldung/orientdb/Author.java
rename to persistence-modules/orientdb/src/main/java/com/baeldung/orientdb/Author.java
diff --git a/spring-data-jpa/src/main/resources/logback.xml b/persistence-modules/orientdb/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-jpa/src/main/resources/logback.xml
rename to persistence-modules/orientdb/src/main/resources/logback.xml
diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPILiveTest.java b/persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPILiveTest.java
similarity index 100%
rename from orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPILiveTest.java
rename to persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBDocumentAPILiveTest.java
diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPILiveTest.java b/persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPILiveTest.java
similarity index 100%
rename from orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPILiveTest.java
rename to persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBGraphAPILiveTest.java
diff --git a/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPILiveTest.java b/persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPILiveTest.java
similarity index 100%
rename from orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPILiveTest.java
rename to persistence-modules/orientdb/src/test/java/com/baeldung/orientdb/OrientDBObjectAPILiveTest.java
diff --git a/spring-boot-persistence/.gitignore b/persistence-modules/spring-boot-persistence/.gitignore
similarity index 89%
rename from spring-boot-persistence/.gitignore
rename to persistence-modules/spring-boot-persistence/.gitignore
index 88e3308e9d..da7c2c5c0a 100644
--- a/spring-boot-persistence/.gitignore
+++ b/persistence-modules/spring-boot-persistence/.gitignore
@@ -1,5 +1,5 @@
-/target/
-.settings/
-.classpath
-.project
-
+/target/
+.settings/
+.classpath
+.project
+
diff --git a/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties b/persistence-modules/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties
old mode 100755
new mode 100644
similarity index 100%
rename from spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties
rename to persistence-modules/spring-boot-persistence/.mvn/wrapper/maven-wrapper.properties
diff --git a/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD
similarity index 100%
rename from spring-boot-persistence/README.MD
rename to persistence-modules/spring-boot-persistence/README.MD
diff --git a/spring-boot-persistence/mvnw b/persistence-modules/spring-boot-persistence/mvnw
old mode 100755
new mode 100644
similarity index 100%
rename from spring-boot-persistence/mvnw
rename to persistence-modules/spring-boot-persistence/mvnw
diff --git a/spring-boot-persistence/mvnw.cmd b/persistence-modules/spring-boot-persistence/mvnw.cmd
old mode 100755
new mode 100644
similarity index 97%
rename from spring-boot-persistence/mvnw.cmd
rename to persistence-modules/spring-boot-persistence/mvnw.cmd
index 4f0b068a03..6a6eec39ba
--- a/spring-boot-persistence/mvnw.cmd
+++ b/persistence-modules/spring-boot-persistence/mvnw.cmd
@@ -1,145 +1,145 @@
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements. See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership. The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License. You may obtain a copy of the License at
-@REM
-@REM http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied. See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Maven2 Start Up Batch script
-@REM
-@REM Required ENV vars:
-@REM JAVA_HOME - location of a JDK home dir
-@REM
-@REM Optional ENV vars
-@REM M2_HOME - location of maven2's installed home dir
-@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
-@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
-@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
-@REM e.g. to debug Maven itself, use
-@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
-@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
-@REM ----------------------------------------------------------------------------
-
-@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
-@echo off
-@REM set title of command window
-title %0
-@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
-@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
-
-@REM set %HOME% to equivalent of $HOME
-if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
-
-@REM Execute a user defined script before this one
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
-@REM check for pre script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
-if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
-:skipRcPre
-
-@setlocal
-
-set ERROR_CODE=0
-
-@REM To isolate internal variables from possible post scripts, we use another setlocal
-@setlocal
-
-@REM ==== START VALIDATION ====
-if not "%JAVA_HOME%" == "" goto OkJHome
-
-echo.
-echo Error: JAVA_HOME not found in your environment. >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-:OkJHome
-if exist "%JAVA_HOME%\bin\java.exe" goto init
-
-echo.
-echo Error: JAVA_HOME is set to an invalid directory. >&2
-echo JAVA_HOME = "%JAVA_HOME%" >&2
-echo Please set the JAVA_HOME variable in your environment to match the >&2
-echo location of your Java installation. >&2
-echo.
-goto error
-
-@REM ==== END VALIDATION ====
-
-:init
-
-@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
-@REM Fallback to current working directory if not found.
-
-set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
-IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
-
-set EXEC_DIR=%CD%
-set WDIR=%EXEC_DIR%
-:findBaseDir
-IF EXIST "%WDIR%"\.mvn goto baseDirFound
-cd ..
-IF "%WDIR%"=="%CD%" goto baseDirNotFound
-set WDIR=%CD%
-goto findBaseDir
-
-:baseDirFound
-set MAVEN_PROJECTBASEDIR=%WDIR%
-cd "%EXEC_DIR%"
-goto endDetectBaseDir
-
-:baseDirNotFound
-set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
-cd "%EXEC_DIR%"
-
-:endDetectBaseDir
-
-IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
-
-@setlocal EnableExtensions EnableDelayedExpansion
-for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
-@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
-
-:endReadAdditionalConfig
-
-SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
-
-set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
-set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
-
-%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
-if ERRORLEVEL 1 goto error
-goto end
-
-:error
-set ERROR_CODE=1
-
-:end
-@endlocal & set ERROR_CODE=%ERROR_CODE%
-
-if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
-@REM check for post script, once with legacy .bat ending and once with .cmd ending
-if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
-if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
-:skipRcPost
-
-@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
-if "%MAVEN_BATCH_PAUSE%" == "on" pause
-
-if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
-
-exit /B %ERROR_CODE%
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml
similarity index 93%
rename from spring-boot-persistence/pom.xml
rename to persistence-modules/spring-boot-persistence/pom.xml
index 08989edfa9..b34e33e38a 100644
--- a/spring-boot-persistence/pom.xml
+++ b/persistence-modules/spring-boot-persistence/pom.xml
@@ -1,75 +1,75 @@
-
-
- 4.0.0
-
- com.baeldung
- spring-boot-persistence
- 0.1.0
-
-
- parent-boot-2
- com.baeldung
- 0.0.1-SNAPSHOT
- ../parent-boot-2
-
-
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- com.zaxxer
- HikariCP
-
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.apache.tomcat
- tomcat-jdbc
- ${tomcat-jdbc.version}
-
-
- mysql
- mysql-connector-java
- ${mysql-connector-java.version}
-
-
- com.h2database
- h2
- ${h2database.version}
- runtime
-
-
-
-
- UTF-8
- 1.8
- 8.0.12
- 9.0.10
- 1.4.197
-
-
-
- spring-boot-persistence
-
-
- src/main/resources
- true
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-boot-persistence
+ 0.1.0
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.zaxxer
+ HikariCP
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.apache.tomcat
+ tomcat-jdbc
+ ${tomcat-jdbc.version}
+
+
+ mysql
+ mysql-connector-java
+ ${mysql-connector-java.version}
+
+
+ com.h2database
+ h2
+ ${h2database.version}
+ runtime
+
+
+
+
+ UTF-8
+ 1.8
+ 8.0.12
+ 9.0.10
+ 1.4.197
+
+
+
+ spring-boot-persistence
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/Application.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/com/baeldung/Application.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/Application.java
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/Country.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/domain/Country.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/com/baeldung/domain/Country.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/domain/Country.java
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/User.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/domain/User.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/com/baeldung/domain/User.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/domain/User.java
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/repository/UserRepository.java
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
similarity index 97%
rename from spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
index ff37442cd4..5be61b972f 100644
--- a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/SpringBootConsoleApplication.java
@@ -1,22 +1,22 @@
-package com.baeldung.tomcatconnectionpool.application;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.domain.EntityScan;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-@SpringBootApplication
-@EnableAutoConfiguration
-@ComponentScan(basePackages={"com.baeldung.tomcatconnectionpool.application"})
-@EnableJpaRepositories(basePackages="com.baeldung.tomcatconnectionpool.application.repositories")
-@EnableTransactionManagement
-@EntityScan(basePackages="com.baeldung.tomcatconnectionpool.application.entities")
-public class SpringBootConsoleApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(SpringBootConsoleApplication.class);
- }
-}
+package com.baeldung.tomcatconnectionpool.application;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableAutoConfiguration
+@ComponentScan(basePackages={"com.baeldung.tomcatconnectionpool.application"})
+@EnableJpaRepositories(basePackages="com.baeldung.tomcatconnectionpool.application.repositories")
+@EnableTransactionManagement
+@EntityScan(basePackages="com.baeldung.tomcatconnectionpool.application.entities")
+public class SpringBootConsoleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootConsoleApplication.class);
+ }
+}
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
similarity index 95%
rename from spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
index 4003d5aca9..712506eb98 100644
--- a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/entities/Customer.java
@@ -1,53 +1,53 @@
-package com.baeldung.tomcatconnectionpool.application.entities;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity
-@Table(name = "customers")
-public class Customer {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private long id;
- @Column(name = "first_name")
- private String firstName;
- @Column(name = "last_name")
- private String lastName;
-
- public Customer() {}
-
- public Customer(String firstName, String lastName) {
- this.firstName = firstName;
- this.lastName = lastName;
- }
-
- public long getId() {
- return id;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- @Override
- public String toString() {
- return "Customer{" + "id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + '}';
- }
-}
+package com.baeldung.tomcatconnectionpool.application.entities;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "customers")
+public class Customer {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+ @Column(name = "first_name")
+ private String firstName;
+ @Column(name = "last_name")
+ private String lastName;
+
+ public Customer() {}
+
+ public Customer(String firstName, String lastName) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ @Override
+ public String toString() {
+ return "Customer{" + "id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + '}';
+ }
+}
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
similarity index 97%
rename from spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
index 770906439c..c461243cf8 100644
--- a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/repositories/CustomerRepository.java
@@ -1,12 +1,12 @@
-package com.baeldung.tomcatconnectionpool.application.repositories;
-
-import com.baeldung.tomcatconnectionpool.application.entities.Customer;
-import java.util.List;
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface CustomerRepository extends CrudRepository {
-
- List findByLastName(String lastName);
-}
+package com.baeldung.tomcatconnectionpool.application.repositories;
+
+import com.baeldung.tomcatconnectionpool.application.entities.Customer;
+import java.util.List;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CustomerRepository extends CrudRepository {
+
+ List findByLastName(String lastName);
+}
diff --git a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
similarity index 97%
rename from spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
index 9666bac5a5..722c7582a1 100644
--- a/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
+++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/tomcatconnectionpool/application/runners/CommandLineCrudRunner.java
@@ -1,37 +1,37 @@
-package com.baeldung.tomcatconnectionpool.application.runners;
-
-import com.baeldung.tomcatconnectionpool.application.entities.Customer;
-import com.baeldung.tomcatconnectionpool.application.repositories.CustomerRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CommandLineCrudRunner implements CommandLineRunner {
-
- private static final Logger logger = LoggerFactory.getLogger(CommandLineCrudRunner.class);
-
- @Autowired
- private CustomerRepository customerRepository;
-
- @Override
- public void run(String... args) throws Exception {
- customerRepository.save(new Customer("John", "Doe"));
- customerRepository.save(new Customer("Jennifer", "Wilson"));
-
- logger.info("Customers found with findAll():");
- customerRepository.findAll().forEach(c -> logger.info(c.toString()));
-
- logger.info("Customer found with findById(1L):");
- Customer customer = customerRepository.findById(1L)
- .orElseGet(() -> new Customer("Non-existing customer", ""));
- logger.info(customer.toString());
-
- logger.info("Customer found with findByLastName('Wilson'):");
- customerRepository.findByLastName("Wilson").forEach(c -> {
- logger.info(c.toString());
- });
- }
-}
+package com.baeldung.tomcatconnectionpool.application.runners;
+
+import com.baeldung.tomcatconnectionpool.application.entities.Customer;
+import com.baeldung.tomcatconnectionpool.application.repositories.CustomerRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CommandLineCrudRunner implements CommandLineRunner {
+
+ private static final Logger logger = LoggerFactory.getLogger(CommandLineCrudRunner.class);
+
+ @Autowired
+ private CustomerRepository customerRepository;
+
+ @Override
+ public void run(String... args) throws Exception {
+ customerRepository.save(new Customer("John", "Doe"));
+ customerRepository.save(new Customer("Jennifer", "Wilson"));
+
+ logger.info("Customers found with findAll():");
+ customerRepository.findAll().forEach(c -> logger.info(c.toString()));
+
+ logger.info("Customer found with findById(1L):");
+ Customer customer = customerRepository.findById(1L)
+ .orElseGet(() -> new Customer("Non-existing customer", ""));
+ logger.info(customer.toString());
+
+ logger.info("Customer found with findByLastName('Wilson'):");
+ customerRepository.findByLastName("Wilson").forEach(c -> {
+ logger.info(c.toString());
+ });
+ }
+}
diff --git a/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java b/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java
rename to persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java
diff --git a/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java
similarity index 100%
rename from spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java
rename to persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java
diff --git a/spring-boot-persistence/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-persistence/src/main/resources/application.properties
rename to persistence-modules/spring-boot-persistence/src/main/resources/application.properties
diff --git a/spring-boot-persistence/src/main/resources/data.sql b/persistence-modules/spring-boot-persistence/src/main/resources/data.sql
similarity index 100%
rename from spring-boot-persistence/src/main/resources/data.sql
rename to persistence-modules/spring-boot-persistence/src/main/resources/data.sql
diff --git a/spring-data-keyvalue/src/main/resources/logback.xml b/persistence-modules/spring-boot-persistence/src/main/resources/logback.xml
similarity index 100%
rename from spring-data-keyvalue/src/main/resources/logback.xml
rename to persistence-modules/spring-boot-persistence/src/main/resources/logback.xml
diff --git a/spring-boot-persistence/src/main/resources/persistence-generic-entity.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-generic-entity.properties
similarity index 100%
rename from spring-boot-persistence/src/main/resources/persistence-generic-entity.properties
rename to persistence-modules/spring-boot-persistence/src/main/resources/persistence-generic-entity.properties
diff --git a/spring-boot-persistence/src/main/resources/schema.sql b/persistence-modules/spring-boot-persistence/src/main/resources/schema.sql
similarity index 100%
rename from spring-boot-persistence/src/main/resources/schema.sql
rename to persistence-modules/spring-boot-persistence/src/main/resources/schema.sql
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
similarity index 100%
rename from spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
similarity index 100%
rename from spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java
similarity index 100%
rename from spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java
rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
similarity index 100%
rename from spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/repository/UserRepositoryIntegrationTest.java
diff --git a/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
similarity index 97%
rename from spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
index c68e137fb0..eb000bbc09 100644
--- a/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
+++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/tomcatconnectionpool/test/application/SpringBootTomcatConnectionPoolIntegrationTest.java
@@ -1,22 +1,22 @@
-package com.baeldung.tomcatconnectionpool.test.application;
-
-import javax.sql.DataSource;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.junit4.SpringRunner;
-import static org.assertj.core.api.Assertions.*;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SpringBootTomcatConnectionPoolIntegrationTest {
-
- @Autowired
- private DataSource dataSource;
-
- @Test
- public void givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect() {
- assertThat(dataSource.getClass().getName()).isEqualTo("org.apache.tomcat.jdbc.pool.DataSource");
- }
-}
+package com.baeldung.tomcatconnectionpool.test.application;
+
+import javax.sql.DataSource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit4.SpringRunner;
+import static org.assertj.core.api.Assertions.*;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SpringBootTomcatConnectionPoolIntegrationTest {
+
+ @Autowired
+ private DataSource dataSource;
+
+ @Test
+ public void givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect() {
+ assertThat(dataSource.getClass().getName()).isEqualTo("org.apache.tomcat.jdbc.pool.DataSource");
+ }
+}
diff --git a/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java b/persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java
similarity index 100%
rename from spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java
rename to persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java
diff --git a/spring-boot-persistence/src/test/resources/application.properties b/persistence-modules/spring-boot-persistence/src/test/resources/application.properties
similarity index 100%
rename from spring-boot-persistence/src/test/resources/application.properties
rename to persistence-modules/spring-boot-persistence/src/test/resources/application.properties
diff --git a/spring-boot-persistence/src/test/resources/import_active_users.sql b/persistence-modules/spring-boot-persistence/src/test/resources/import_active_users.sql
similarity index 100%
rename from spring-boot-persistence/src/test/resources/import_active_users.sql
rename to persistence-modules/spring-boot-persistence/src/test/resources/import_active_users.sql
diff --git a/spring-boot-persistence/src/test/resources/import_inactive_users.sql b/persistence-modules/spring-boot-persistence/src/test/resources/import_inactive_users.sql
similarity index 100%
rename from spring-boot-persistence/src/test/resources/import_inactive_users.sql
rename to persistence-modules/spring-boot-persistence/src/test/resources/import_inactive_users.sql
diff --git a/spring-boot-persistence/src/test/resources/migrated_users.sql b/persistence-modules/spring-boot-persistence/src/test/resources/migrated_users.sql
similarity index 100%
rename from spring-boot-persistence/src/test/resources/migrated_users.sql
rename to persistence-modules/spring-boot-persistence/src/test/resources/migrated_users.sql
diff --git a/spring-data-elasticsearch/README.md b/persistence-modules/spring-data-elasticsearch/README.md
similarity index 100%
rename from spring-data-elasticsearch/README.md
rename to persistence-modules/spring-data-elasticsearch/README.md
diff --git a/spring-data-elasticsearch/pom.xml b/persistence-modules/spring-data-elasticsearch/pom.xml
similarity index 98%
rename from spring-data-elasticsearch/pom.xml
rename to persistence-modules/spring-data-elasticsearch/pom.xml
index 99d8a70807..ee9e71a1cb 100644
--- a/spring-data-elasticsearch/pom.xml
+++ b/persistence-modules/spring-data-elasticsearch/pom.xml
@@ -11,7 +11,7 @@
com.baeldung
parent-spring-5
0.0.1-SNAPSHOT
- ../parent-spring-5
+ ../../parent-spring-5
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/elasticsearch/Person.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/config/Config.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Article.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Author.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Author.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Author.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/model/Author.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/repository/ArticleRepository.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleService.java
diff --git a/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java b/persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java
similarity index 100%
rename from spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java
rename to persistence-modules/spring-data-elasticsearch/src/main/java/com/baeldung/spring/data/es/service/ArticleServiceImpl.java
diff --git a/spring-data-elasticsearch/src/main/resources/log4j2.properties b/persistence-modules/spring-data-elasticsearch/src/main/resources/log4j2.properties
similarity index 100%
rename from spring-data-elasticsearch/src/main/resources/log4j2.properties
rename to persistence-modules/spring-data-elasticsearch/src/main/resources/log4j2.properties
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java
similarity index 100%
rename from spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java
rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/ElasticSearchManualTest.java
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
similarity index 100%
rename from spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/elasticsearch/GeoQueriesIntegrationTest.java
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java
similarity index 100%
rename from spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java
rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchIntegrationTest.java
diff --git a/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java
similarity index 100%
rename from spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java
rename to persistence-modules/spring-data-elasticsearch/src/test/java/com/baeldung/spring/data/es/ElasticSearchQueryIntegrationTest.java
diff --git a/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-data-elasticsearch/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md
similarity index 93%
rename from spring-data-jpa/README.md
rename to persistence-modules/spring-data-jpa/README.md
index 8817020eec..44ce240da3 100644
--- a/spring-data-jpa/README.md
+++ b/persistence-modules/spring-data-jpa/README.md
@@ -14,6 +14,7 @@
- [Auditing with JPA, Hibernate, and Spring Data JPA](https://www.baeldung.com/database-auditing-jpa)
- [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date)
- [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd)
+- [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml
similarity index 95%
rename from spring-data-jpa/pom.xml
rename to persistence-modules/spring-data-jpa/pom.xml
index 8691ce1f09..643210ab89 100644
--- a/spring-data-jpa/pom.xml
+++ b/persistence-modules/spring-data-jpa/pom.xml
@@ -2,15 +2,16 @@
+ 4.0.0
+ com.baeldung
+ spring-data-jpa
+
parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../../parent-boot-2
- 4.0.0
-
- spring-data-jpa
diff --git a/spring-data-jpa/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/Application.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/Application.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/Application.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceProductConfiguration.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceUserConfiguration.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/IFooDao.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ArticleRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/CustomItemTypeRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ExtendedStudentRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/IBarCrudRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InventoryRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ItemTypeRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/LocationRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/ReadOnlyLocationRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/StoreRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemRepositoryImpl.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/CustomItemTypeRepositoryImpl.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/ExtendedRepositoryImpl.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/PossessionRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/user/UserRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2Repository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2Repository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2Repository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate2Repository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3Repository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3Repository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3Repository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/Aggregate3Repository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/AggregateRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/AggregateRepository.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/AggregateRepository.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/AggregateRepository.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DddConfig.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DddConfig.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/DddConfig.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DddConfig.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainEvent.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainEvent.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainEvent.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainEvent.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/ddd/event/DomainService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Article.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Article.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Article.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Article.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Bar.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Foo.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Item.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Item.java
similarity index 94%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Item.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Item.java
index 97ce14d92d..1e58fb25ba 100644
--- a/spring-data-jpa/src/main/java/com/baeldung/domain/Item.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Item.java
@@ -1,81 +1,81 @@
-package com.baeldung.domain;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-@Entity
-public class Item {
-
- private String color;
- private String grade;
-
- @Id
- private Long id;
-
- @ManyToOne
- private ItemType itemType;
-
- private String name;
- private BigDecimal price;
- @ManyToOne
- private Store store;
-
- public String getColor() {
- return color;
- }
-
- public String getGrade() {
- return grade;
- }
-
- public Long getId() {
- return id;
- }
-
- public ItemType getItemType() {
- return itemType;
- }
-
- public String getName() {
- return name;
- }
-
- public BigDecimal getPrice() {
- return price;
- }
-
- public Store getStore() {
- return store;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
- public void setGrade(String grade) {
- this.grade = grade;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public void setItemType(ItemType itemType) {
- this.itemType = itemType;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
-
- public void setStore(Store store) {
- this.store = store;
- }
-}
+package com.baeldung.domain;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class Item {
+
+ private String color;
+ private String grade;
+
+ @Id
+ private Long id;
+
+ @ManyToOne
+ private ItemType itemType;
+
+ private String name;
+ private BigDecimal price;
+ @ManyToOne
+ private Store store;
+
+ public String getColor() {
+ return color;
+ }
+
+ public String getGrade() {
+ return grade;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public ItemType getItemType() {
+ return itemType;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public Store getStore() {
+ return store;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public void setGrade(String grade) {
+ this.grade = grade;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void setItemType(ItemType itemType) {
+ this.itemType = itemType;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public void setStore(Store store) {
+ this.store = store;
+ }
+}
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java
similarity index 94%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java
index 412079c2ae..b0349e0471 100644
--- a/spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/ItemType.java
@@ -1,46 +1,46 @@
-package com.baeldung.domain;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-
-@Entity
-public class ItemType {
-
- @Id
- private Long id;
- @OneToMany(cascade = CascadeType.ALL)
- @JoinColumn(name = "ITEM_TYPE_ID")
- private List- items = new ArrayList<>();
-
- private String name;
-
- public Long getId() {
- return id;
- }
-
- public List
- getItems() {
- return items;
- }
-
- public String getName() {
- return name;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public void setItems(List
- items) {
- this.items = items;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
+package com.baeldung.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+@Entity
+public class ItemType {
+
+ @Id
+ private Long id;
+ @OneToMany(cascade = CascadeType.ALL)
+ @JoinColumn(name = "ITEM_TYPE_ID")
+ private List
- items = new ArrayList<>();
+
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/KVTag.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Location.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Location.java
similarity index 95%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Location.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Location.java
index 2178d378eb..4ca7295986 100644
--- a/spring-data-jpa/src/main/java/com/baeldung/domain/Location.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Location.java
@@ -1,55 +1,55 @@
-package com.baeldung.domain;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-
-@Entity
-public class Location {
-
- private String city;
- private String country;
- @Id
- private Long id;
-
- @OneToMany(cascade = CascadeType.ALL)
- @JoinColumn(name = "LOCATION_ID")
- private List stores = new ArrayList<>();
-
- public String getCity() {
- return city;
- }
-
- public String getCountry() {
- return country;
- }
-
- public Long getId() {
- return id;
- }
-
- public List getStores() {
- return stores;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public void setStores(List stores) {
- this.stores = stores;
- }
-}
+package com.baeldung.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+@Entity
+public class Location {
+
+ private String city;
+ private String country;
+ @Id
+ private Long id;
+
+ @OneToMany(cascade = CascadeType.ALL)
+ @JoinColumn(name = "LOCATION_ID")
+ private List stores = new ArrayList<>();
+
+ public String getCity() {
+ return city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public List getStores() {
+ return stores;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void setStores(List stores) {
+ this.stores = stores;
+ }
+}
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/MerchandiseEntity.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/SkillTag.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Store.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Store.java
similarity index 95%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Store.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Store.java
index e04684c479..4172051c71 100644
--- a/spring-data-jpa/src/main/java/com/baeldung/domain/Store.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Store.java
@@ -1,76 +1,76 @@
-package com.baeldung.domain;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
-@Entity
-public class Store {
-
- private Boolean active;
- @Id
- private Long id;
- @OneToMany(cascade = CascadeType.ALL)
- @JoinColumn(name = "STORE_ID")
- private List
- items = new ArrayList<>();
- private Long itemsSold;
-
- @ManyToOne
- private Location location;
-
- private String name;
-
- public Boolean getActive() {
- return active;
- }
-
- public Long getId() {
- return id;
- }
-
- public List
- getItems() {
- return items;
- }
-
- public Long getItemsSold() {
- return itemsSold;
- }
-
- public Location getLocation() {
- return location;
- }
-
- public String getName() {
- return name;
- }
-
- public void setActive(Boolean active) {
- this.active = active;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public void setItems(List
- items) {
- this.items = items;
- }
-
- public void setItemsSold(Long itemsSold) {
- this.itemsSold = itemsSold;
- }
-
- public void setLocation(Location location) {
- this.location = location;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
+package com.baeldung.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+@Entity
+public class Store {
+
+ private Boolean active;
+ @Id
+ private Long id;
+ @OneToMany(cascade = CascadeType.ALL)
+ @JoinColumn(name = "STORE_ID")
+ private List
- items = new ArrayList<>();
+ private Long itemsSold;
+
+ @ManyToOne
+ private Location location;
+
+ private String name;
+
+ public Boolean getActive() {
+ return active;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public List
- getItems() {
+ return items;
+ }
+
+ public Long getItemsSold() {
+ return itemsSold;
+ }
+
+ public Location getLocation() {
+ return location;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setActive(Boolean active) {
+ this.active = active;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void setItems(List
- items) {
+ this.items = items;
+ }
+
+ public void setItemsSold(Long itemsSold) {
+ this.itemsSold = itemsSold;
+ }
+
+ public void setLocation(Location location) {
+ this.location = location;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/Student.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Student.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/Student.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Student.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/Possession.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/user/User.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IBarService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IFooService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/IOperations.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/AbstractSpringDataJpaService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/BarSpringDataJpaService.java
diff --git a/spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java
similarity index 100%
rename from spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java
rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/services/impl/FooService.java
diff --git a/spring-data-jpa/src/main/resources/application.properties b/persistence-modules/spring-data-jpa/src/main/resources/application.properties
similarity index 100%
rename from spring-data-jpa/src/main/resources/application.properties
rename to persistence-modules/spring-data-jpa/src/main/resources/application.properties
diff --git a/spring-data-jpa/src/main/resources/ddd.properties b/persistence-modules/spring-data-jpa/src/main/resources/ddd.properties
similarity index 100%
rename from spring-data-jpa/src/main/resources/ddd.properties
rename to persistence-modules/spring-data-jpa/src/main/resources/ddd.properties
diff --git a/spring-hibernate3/src/main/resources/logback.xml b/persistence-modules/spring-data-jpa/src/main/resources/logback.xml
similarity index 100%
rename from spring-hibernate3/src/main/resources/logback.xml
rename to persistence-modules/spring-data-jpa/src/main/resources/logback.xml
diff --git a/spring-data-jpa/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-data-jpa/src/main/resources/persistence-multiple-db.properties
similarity index 100%
rename from spring-data-jpa/src/main/resources/persistence-multiple-db.properties
rename to persistence-modules/spring-data-jpa/src/main/resources/persistence-multiple-db.properties
diff --git a/spring-data-jpa/src/main/resources/persistence.properties b/persistence-modules/spring-data-jpa/src/main/resources/persistence.properties
similarity index 100%
rename from spring-data-jpa/src/main/resources/persistence.properties
rename to persistence-modules/spring-data-jpa/src/main/resources/persistence.properties
diff --git a/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ArticleRepositoryIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/ExtendedStudentRepositoryIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/InventoryRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/InventoryRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/dao/repositories/InventoryRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/InventoryRepositoryIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/JpaRepositoriesIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/UserRepositoryIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate2EventsIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate2EventsIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate2EventsIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate2EventsIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate3EventsIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate3EventsIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate3EventsIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/Aggregate3EventsIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/ddd/event/AggregateEventsIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/AggregateEventsIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/ddd/event/AggregateEventsIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/AggregateEventsIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/ddd/event/TestEventHandler.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/TestEventHandler.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/ddd/event/TestEventHandler.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/ddd/event/TestEventHandler.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/AbstractServicePersistenceIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/FooServicePersistenceIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/JpaMultipleDBIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/services/SpringDataJPABarAuditIntegrationTest.java
diff --git a/spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java
similarity index 100%
rename from spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java
rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/util/IDUtil.java
diff --git a/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/spring-data-jpa/src/test/resources/import_entities.sql b/persistence-modules/spring-data-jpa/src/test/resources/import_entities.sql
similarity index 100%
rename from spring-data-jpa/src/test/resources/import_entities.sql
rename to persistence-modules/spring-data-jpa/src/test/resources/import_entities.sql
diff --git a/spring-data-keyvalue/README.md b/persistence-modules/spring-data-keyvalue/README.md
similarity index 100%
rename from spring-data-keyvalue/README.md
rename to persistence-modules/spring-data-keyvalue/README.md
diff --git a/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml
similarity index 93%
rename from spring-data-keyvalue/pom.xml
rename to persistence-modules/spring-data-keyvalue/pom.xml
index edd8967b97..6675595f2b 100644
--- a/spring-data-keyvalue/pom.xml
+++ b/persistence-modules/spring-data-keyvalue/pom.xml
@@ -7,7 +7,7 @@
parent-boot-2
com.baeldung
0.0.1-SNAPSHOT
- ../parent-boot-2
+ ../../parent-boot-2
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/Configurations.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/Configurations.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/Configurations.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/Configurations.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/SpringDataKeyValueApplication.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/SpringDataKeyValueApplication.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/SpringDataKeyValueApplication.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/SpringDataKeyValueApplication.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/repositories/EmployeeRepository.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/repositories/EmployeeRepository.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/repositories/EmployeeRepository.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/repositories/EmployeeRepository.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/EmployeeService.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/EmployeeService.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/EmployeeService.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/EmployeeService.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithKeyValueTemplate.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithKeyValueTemplate.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithKeyValueTemplate.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithKeyValueTemplate.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithRepository.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithRepository.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithRepository.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/services/impl/EmployeeServicesWithRepository.java
diff --git a/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/vo/Employee.java b/persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/vo/Employee.java
similarity index 100%
rename from spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/vo/Employee.java
rename to persistence-modules/spring-data-keyvalue/src/main/java/com/baeldung/spring/data/keyvalue/vo/Employee.java
diff --git a/persistence-modules/spring-data-keyvalue/src/main/resources/logback.xml b/persistence-modules/spring-data-keyvalue/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-data-keyvalue/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithKeyValueRepositoryIntegrationTest.java b/persistence-modules/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithKeyValueRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithKeyValueRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithKeyValueRepositoryIntegrationTest.java
diff --git a/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithRepositoryIntegrationTest.java b/persistence-modules/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithRepositoryIntegrationTest.java
similarity index 100%
rename from spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-keyvalue/src/test/java/com/baeldung/spring/data/keyvalue/services/test/EmployeeServicesWithRepositoryIntegrationTest.java
diff --git a/spring-data-keyvalue/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-keyvalue/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-data-keyvalue/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-data-keyvalue/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md
similarity index 100%
rename from spring-data-mongodb/README.md
rename to persistence-modules/spring-data-mongodb/README.md
diff --git a/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml
similarity index 98%
rename from spring-data-mongodb/pom.xml
rename to persistence-modules/spring-data-mongodb/pom.xml
index 072ed7a2ac..466acf5a43 100644
--- a/spring-data-mongodb/pom.xml
+++ b/persistence-modules/spring-data-mongodb/pom.xml
@@ -10,7 +10,7 @@
com.baeldung
parent-spring-5
0.0.1-SNAPSHOT
- ../parent-spring-5
+ ../../parent-spring-5
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/annotation/CascadeSave.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/annotation/CascadeSave.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/annotation/CascadeSave.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/annotation/CascadeSave.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoConfig.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/config/MongoReactiveConfig.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoReactiveConfig.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/config/MongoReactiveConfig.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/MongoReactiveConfig.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/config/SimpleMongoConfig.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/SimpleMongoConfig.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/config/SimpleMongoConfig.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/config/SimpleMongoConfig.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/converter/UserWriterConverter.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/converter/UserWriterConverter.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/converter/UserWriterConverter.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/converter/UserWriterConverter.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeCallback.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeCallback.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/event/CascadeCallback.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeCallback.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeSaveMongoEventListener.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeSaveMongoEventListener.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/event/CascadeSaveMongoEventListener.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/CascadeSaveMongoEventListener.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/event/FieldCallback.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/FieldCallback.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/event/FieldCallback.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/FieldCallback.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/event/UserCascadeSaveMongoEventListener.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/UserCascadeSaveMongoEventListener.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/event/UserCascadeSaveMongoEventListener.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/event/UserCascadeSaveMongoEventListener.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/model/EmailAddress.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/EmailAddress.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/model/EmailAddress.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/EmailAddress.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/model/User.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/User.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/model/User.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/model/User.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/reactive/repository/UserRepository.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/reactive/repository/UserRepository.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/reactive/repository/UserRepository.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/reactive/repository/UserRepository.java
diff --git a/spring-data-mongodb/src/main/java/com/baeldung/repository/UserRepository.java b/persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/UserRepository.java
similarity index 100%
rename from spring-data-mongodb/src/main/java/com/baeldung/repository/UserRepository.java
rename to persistence-modules/spring-data-mongodb/src/main/java/com/baeldung/repository/UserRepository.java
diff --git a/spring-hibernate4/src/main/resources/logback.xml b/persistence-modules/spring-data-mongodb/src/main/resources/logback.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/logback.xml
rename to persistence-modules/spring-data-mongodb/src/main/resources/logback.xml
diff --git a/spring-data-mongodb/src/main/resources/mongoConfig.xml b/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml
similarity index 100%
rename from spring-data-mongodb/src/main/resources/mongoConfig.xml
rename to persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml
diff --git a/spring-data-mongodb/src/main/resources/test.png b/persistence-modules/spring-data-mongodb/src/main/resources/test.png
similarity index 100%
rename from spring-data-mongodb/src/main/resources/test.png
rename to persistence-modules/spring-data-mongodb/src/main/resources/test.png
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/ZipsAggregationLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/aggregation/model/StatePopulation.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/model/StatePopulation.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/aggregation/model/StatePopulation.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/aggregation/model/StatePopulation.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/gridfs/GridFSLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/DocumentQueryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateProjectionLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/mongotemplate/MongoTemplateQueryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/BaseQueryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/DSLQueryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/JSONQueryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/QueryMethodsLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/repository/UserRepositoryProjectionLiveTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java
diff --git a/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java
diff --git a/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/spring-data-mongodb/src/test/resources/zips.json b/persistence-modules/spring-data-mongodb/src/test/resources/zips.json
similarity index 100%
rename from spring-data-mongodb/src/test/resources/zips.json
rename to persistence-modules/spring-data-mongodb/src/test/resources/zips.json
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index 5981bf41e0..bee3d683b8 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -7,17 +7,61 @@
jar
+ parent-boot-2
com.baeldung
- parent-spring-5
0.0.1-SNAPSHOT
- ../../parent-spring-5
+ ../../parent-boot-2
- org.springframework.data
- spring-data-redis
- ${spring-data-redis}
+ org.springframework.boot
+ spring-boot-starter-data-redis-reactive
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+
+ org.springframework
+ spring-test
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ test
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ ${junit.platform.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
@@ -33,42 +77,12 @@
jar
-
- org.springframework
- spring-core
- ${spring.version}
-
-
- commons-logging
- commons-logging
-
-
-
-
-
- org.springframework
- spring-context
- ${spring.version}
-
-
-
- org.springframework
- spring-test
- ${spring.version}
- test
-
-
com.lordofthejars
nosqlunit-redis
${nosqlunit.version}
-
- org.springframework.data
- spring-data-commons
- ${spring-data-commons.version}
-
com.github.kstyrc
embedded-redis
@@ -77,12 +91,13 @@
- 2.0.3.RELEASE
3.2.4
2.9.0
0.10.0
2.0.3.RELEASE
0.6
+ 1.0.0
+ 5.0.2
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java
new file mode 100644
index 0000000000..8b1f892f67
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/SpringRedisReactiveApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.data.reactive.redis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringRedisReactiveApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringRedisReactiveApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
new file mode 100644
index 0000000000..d23d0092eb
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
@@ -0,0 +1,56 @@
+package com.baeldung.spring.data.reactive.redis.config;
+
+
+import com.baeldung.spring.data.reactive.redis.model.Employee;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.ReactiveKeyCommands;
+import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
+import org.springframework.data.redis.connection.ReactiveStringCommands;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import javax.annotation.PreDestroy;
+
+@Configuration
+public class RedisConfig {
+
+ @Autowired
+ RedisConnectionFactory factory;
+
+ @Bean
+ public ReactiveRedisTemplate reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
+ Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Employee.class);
+ RedisSerializationContext.RedisSerializationContextBuilder builder = RedisSerializationContext.newSerializationContext(new StringRedisSerializer());
+ RedisSerializationContext context = builder.value(serializer)
+ .build();
+ return new ReactiveRedisTemplate<>(factory, context);
+ }
+
+ @Bean
+ public ReactiveRedisTemplate reactiveRedisTemplateString(ReactiveRedisConnectionFactory connectionFactory) {
+ return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
+ }
+
+ @Bean
+ public ReactiveKeyCommands keyCommands(final ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
+ return reactiveRedisConnectionFactory.getReactiveConnection()
+ .keyCommands();
+ }
+
+ @Bean
+ public ReactiveStringCommands stringCommands(final ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
+ return reactiveRedisConnectionFactory.getReactiveConnection()
+ .stringCommands();
+ }
+
+ @PreDestroy
+ public void cleanRedis() {
+ factory.getConnection()
+ .flushDb();
+ }
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java
new file mode 100644
index 0000000000..9178f6e112
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/model/Employee.java
@@ -0,0 +1,21 @@
+package com.baeldung.spring.data.reactive.redis.model;
+
+import java.io.Serializable;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+
+@Data
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode
+public class Employee implements Serializable {
+ private static final long serialVersionUID = 1603714798906422731L;
+ private String id;
+ private String name;
+ private String department;
+}
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
index 62a7886f46..6fdb3c5bef 100644
--- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/config/RedisConfig.java
@@ -1,6 +1,8 @@
package com.baeldung.spring.data.redis.config;
-import org.springframework.beans.factory.annotation.Value;
+import com.baeldung.spring.data.redis.queue.MessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@@ -13,10 +15,6 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
-import com.baeldung.spring.data.redis.queue.MessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
-
@Configuration
@ComponentScan("com.baeldung.spring.data.redis")
@EnableRedisRepositories(basePackages = "com.baeldung.spring.data.redis.repo")
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java
new file mode 100644
index 0000000000..e48aa1e06a
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisKeyCommandsIntegrationTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.connection.ReactiveKeyCommands;
+import org.springframework.data.redis.connection.ReactiveStringCommands;
+import org.springframework.data.redis.connection.ReactiveStringCommands.SetCommand;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+import java.nio.ByteBuffer;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisKeyCommandsIntegrationTest {
+
+ @Autowired
+ private ReactiveKeyCommands keyCommands;
+
+ @Autowired
+ private ReactiveStringCommands stringCommands;
+
+ @Test
+ public void givenFluxOfKeys_whenPerformOperations_thenPerformOperations() {
+ Flux keys = Flux.just("key1", "key2", "key3", "key4");
+
+ Flux generator = keys.map(String::getBytes)
+ .map(ByteBuffer::wrap)
+ .map(key -> SetCommand.set(key)
+ .value(key));
+
+ StepVerifier.create(stringCommands.set(generator))
+ .expectNextCount(4L)
+ .verifyComplete();
+
+ Mono keyCount = keyCommands.keys(ByteBuffer.wrap("key*".getBytes()))
+ .flatMapMany(Flux::fromIterable)
+ .count();
+
+ StepVerifier.create(keyCount)
+ .expectNext(4L)
+ .verifyComplete();
+
+ }
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
new file mode 100644
index 0000000000..3ebeff87b1
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.ReactiveListOperations;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisTemplateListOpsIntegrationTest {
+
+ private static final String LIST_NAME = "demo_list";
+
+ @Autowired
+ private ReactiveRedisTemplate redisTemplate;
+
+ private ReactiveListOperations reactiveListOps;
+
+ @Before
+ public void setup() {
+ reactiveListOps = redisTemplate.opsForList();
+ }
+
+ @Test
+ public void givenListAndValues_whenLeftPushAndLeftPop_thenLeftPushAndLeftPop() {
+ Mono lPush = reactiveListOps.leftPushAll(LIST_NAME, "first", "second")
+ .log("Pushed");
+
+ StepVerifier.create(lPush)
+ .expectNext(2L)
+ .verifyComplete();
+
+ Mono lPop = reactiveListOps.leftPop(LIST_NAME)
+ .log("Popped");
+
+ StepVerifier.create(lPop)
+ .expectNext("second")
+ .verifyComplete();
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java
new file mode 100644
index 0000000000..9490568089
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateValueOpsIntegrationTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.spring.data.reactive.redis.template;
+
+
+import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
+import com.baeldung.spring.data.reactive.redis.model.Employee;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.core.ReactiveValueOperations;
+import org.springframework.test.context.junit4.SpringRunner;
+import reactor.core.publisher.Mono;
+import reactor.test.StepVerifier;
+
+import java.time.Duration;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
+public class RedisTemplateValueOpsIntegrationTest {
+
+ @Autowired
+ private ReactiveRedisTemplate redisTemplate;
+
+ private ReactiveValueOperations reactiveValueOps;
+
+ @Before
+ public void setup() {
+ reactiveValueOps = redisTemplate.opsForValue();
+ }
+
+ @Test
+ public void givenEmployee_whenSet_thenSet() {
+
+ Mono result = reactiveValueOps.set("123", new Employee("123", "Bill", "Accounts"));
+
+ StepVerifier.create(result)
+ .expectNext(true)
+ .verifyComplete();
+ }
+
+ @Test
+ public void givenEmployeeId_whenGet_thenReturnsEmployee() {
+
+ Mono fetchedEmployee = reactiveValueOps.get("123");
+
+ StepVerifier.create(fetchedEmployee)
+ .expectNext(new Employee("123", "Bill", "Accounts"))
+ .verifyComplete();
+ }
+
+ @Test
+ public void givenEmployee_whenSetWithExpiry_thenSetsWithExpiryTime() throws InterruptedException {
+
+ Mono result = reactiveValueOps.set("129", new Employee("129", "John", "Programming"), Duration.ofSeconds(1));
+
+ Mono fetchedEmployee = reactiveValueOps.get("129");
+
+ StepVerifier.create(result)
+ .expectNext(true)
+ .verifyComplete();
+
+ Thread.sleep(2000L);
+
+ StepVerifier.create(fetchedEmployee)
+ .expectNextCount(0L)
+ .verifyComplete();
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
index 5bc70069c5..99febb6430 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
@@ -31,7 +31,7 @@ public class RedisMessageListenerIntegrationTest {
@BeforeClass
public static void startRedisServer() throws IOException {
- redisServer = new redis.embedded.RedisServer(6379);
+ redisServer = new redis.embedded.RedisServer(6380);
redisServer.start();
}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
index 48832a8de9..43aadefc01 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/repo/StudentRepositoryIntegrationTest.java
@@ -32,7 +32,7 @@ public class StudentRepositoryIntegrationTest {
@BeforeClass
public static void startRedisServer() throws IOException {
- redisServer = new redis.embedded.RedisServer(6379);
+ redisServer = new redis.embedded.RedisServer(6380);
redisServer.start();
}
diff --git a/spring-hibernate3/README.md b/persistence-modules/spring-hibernate3/README.md
similarity index 100%
rename from spring-hibernate3/README.md
rename to persistence-modules/spring-hibernate3/README.md
diff --git a/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java b/persistence-modules/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java
similarity index 97%
rename from spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java
rename to persistence-modules/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java
index a128d8848c..f38da21dc0 100644
--- a/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java
+++ b/persistence-modules/spring-hibernate3/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java
@@ -1,81 +1,81 @@
-package org.baeldung.spring;
-
-import java.util.Properties;
-
-import javax.sql.DataSource;
-
-import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
-import org.hibernate.SessionFactory;
-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.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
-import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
-import org.springframework.orm.hibernate3.HibernateTransactionManager;
-import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
-
-import com.google.common.base.Preconditions;
-
-@Configuration
-@EnableTransactionManagement
-@PropertySource({ "classpath:persistence-h2.properties" })
-@ComponentScan({ "org.baeldung.persistence.dao", "org.baeldung.persistence.service" })
-public class PersistenceConfigHibernate3 {
-
- @Autowired
- private Environment env;
-
- public PersistenceConfigHibernate3() {
- super();
- }
-
- @Bean
- public LocalSessionFactoryBean sessionFactory() {
- final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
- Resource config = new ClassPathResource("exceptionDemo.cfg.xml");
- sessionFactory.setDataSource(dataSource());
- sessionFactory.setConfigLocation(config);
- sessionFactory.setHibernateProperties(hibernateProperties());
-
- return sessionFactory;
- }
-
- @Bean
- public DataSource dataSource() {
- final BasicDataSource dataSource = new BasicDataSource();
- dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
- dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
- dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
- dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
-
- return dataSource;
- }
-
- @Bean
- @Autowired
- public HibernateTransactionManager transactionManager(final SessionFactory sessionFactory) {
- final HibernateTransactionManager txManager = new HibernateTransactionManager();
- txManager.setSessionFactory(sessionFactory);
-
- return txManager;
- }
-
- @Bean
- public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
- return new PersistenceExceptionTranslationPostProcessor();
- }
-
- 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.globally_quoted_identifiers", "true");
- return hibernateProperties;
- }
-
-}
+package org.baeldung.spring;
+
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
+import org.hibernate.SessionFactory;
+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.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.orm.hibernate3.HibernateTransactionManager;
+import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import com.google.common.base.Preconditions;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "org.baeldung.persistence.dao", "org.baeldung.persistence.service" })
+public class PersistenceConfigHibernate3 {
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceConfigHibernate3() {
+ super();
+ }
+
+ @Bean
+ public LocalSessionFactoryBean sessionFactory() {
+ final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
+ Resource config = new ClassPathResource("exceptionDemo.cfg.xml");
+ sessionFactory.setDataSource(dataSource());
+ sessionFactory.setConfigLocation(config);
+ sessionFactory.setHibernateProperties(hibernateProperties());
+
+ return sessionFactory;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final BasicDataSource dataSource = new BasicDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ @Autowired
+ public HibernateTransactionManager transactionManager(final SessionFactory sessionFactory) {
+ final HibernateTransactionManager txManager = new HibernateTransactionManager();
+ txManager.setSessionFactory(sessionFactory);
+
+ return txManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ 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.globally_quoted_identifiers", "true");
+ return hibernateProperties;
+ }
+
+}
diff --git a/persistence-modules/spring-hibernate3/src/main/resources/logback.xml b/persistence-modules/spring-hibernate3/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-hibernate3/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java b/persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java
similarity index 97%
rename from spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java
rename to persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java
index d53c4445a8..bbbf074c1a 100644
--- a/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java
+++ b/persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java
@@ -1,43 +1,43 @@
-package org.baeldung.persistence.service;
-
-import java.util.List;
-
-import org.baeldung.persistence.model.Event;
-import org.baeldung.spring.PersistenceConfigHibernate3;
-import org.hamcrest.core.IsInstanceOf;
-import org.hibernate.HibernateException;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-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;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfigHibernate3.class }, loader = AnnotationConfigContextLoader.class)
-public class HibernateExceptionScen1MainIntegrationTest {
-
- @Autowired
- EventService service;
-
- @Rule
- public ExpectedException expectedEx = ExpectedException.none();
-
- @Test
- public final void whenEntityIsCreated_thenNoExceptions() {
- service.create(new Event("from LocalSessionFactoryBean"));
- }
-
- @Test
- @Ignore
- public final void whenNoTransBoundToSession_thenException() {
- expectedEx.expectCause(IsInstanceOf.instanceOf(HibernateException.class));
- expectedEx.expectMessage("No Hibernate Session bound to thread, "
- + "and configuration does not allow creation "
- + "of non-transactional one here");
- service.create(new Event("from LocalSessionFactoryBean"));
- }
-}
+package org.baeldung.persistence.service;
+
+import java.util.List;
+
+import org.baeldung.persistence.model.Event;
+import org.baeldung.spring.PersistenceConfigHibernate3;
+import org.hamcrest.core.IsInstanceOf;
+import org.hibernate.HibernateException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+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;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceConfigHibernate3.class }, loader = AnnotationConfigContextLoader.class)
+public class HibernateExceptionScen1MainIntegrationTest {
+
+ @Autowired
+ EventService service;
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Test
+ public final void whenEntityIsCreated_thenNoExceptions() {
+ service.create(new Event("from LocalSessionFactoryBean"));
+ }
+
+ @Test
+ @Ignore
+ public final void whenNoTransBoundToSession_thenException() {
+ expectedEx.expectCause(IsInstanceOf.instanceOf(HibernateException.class));
+ expectedEx.expectMessage("No Hibernate Session bound to thread, "
+ + "and configuration does not allow creation "
+ + "of non-transactional one here");
+ service.create(new Event("from LocalSessionFactoryBean"));
+ }
+}
diff --git a/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java b/persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java
similarity index 97%
rename from spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java
rename to persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java
index 84cafe0536..d8810f0e90 100644
--- a/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java
+++ b/persistence-modules/spring-hibernate3/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java
@@ -1,45 +1,45 @@
-package org.baeldung.persistence.service;
-
-import java.util.List;
-
-import org.baeldung.persistence.model.Event;
-import org.baeldung.spring.PersistenceConfig;
-import org.hamcrest.core.IsInstanceOf;
-import org.hibernate.HibernateException;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-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;
-
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
-public class HibernateExceptionScen2MainIntegrationTest {
-
- @Autowired
- EventService service;
-
- @Rule
- public ExpectedException expectedEx = ExpectedException.none();
-
- @Test
- public final void whenEntityIsCreated_thenNoExceptions() {
- service.create(new Event("from AnnotationSessionFactoryBean"));
- }
-
- @Test
- @Ignore
- public final void whenNoTransBoundToSession_thenException() {
- expectedEx.expectCause(IsInstanceOf.instanceOf(HibernateException.class));
- expectedEx.expectMessage("No Hibernate Session bound to thread, "
- + "and configuration does not allow creation "
- + "of non-transactional one here");
- service.create(new Event("from AnnotationSessionFactoryBean"));
- }
-
-}
+package org.baeldung.persistence.service;
+
+import java.util.List;
+
+import org.baeldung.persistence.model.Event;
+import org.baeldung.spring.PersistenceConfig;
+import org.hamcrest.core.IsInstanceOf;
+import org.hibernate.HibernateException;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+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;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class HibernateExceptionScen2MainIntegrationTest {
+
+ @Autowired
+ EventService service;
+
+ @Rule
+ public ExpectedException expectedEx = ExpectedException.none();
+
+ @Test
+ public final void whenEntityIsCreated_thenNoExceptions() {
+ service.create(new Event("from AnnotationSessionFactoryBean"));
+ }
+
+ @Test
+ @Ignore
+ public final void whenNoTransBoundToSession_thenException() {
+ expectedEx.expectCause(IsInstanceOf.instanceOf(HibernateException.class));
+ expectedEx.expectMessage("No Hibernate Session bound to thread, "
+ + "and configuration does not allow creation "
+ + "of non-transactional one here");
+ service.create(new Event("from AnnotationSessionFactoryBean"));
+ }
+
+}
diff --git a/spring-hibernate4/.gitignore b/persistence-modules/spring-hibernate4/.gitignore
similarity index 100%
rename from spring-hibernate4/.gitignore
rename to persistence-modules/spring-hibernate4/.gitignore
diff --git a/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md
similarity index 100%
rename from spring-hibernate4/README.md
rename to persistence-modules/spring-hibernate4/README.md
diff --git a/spring-hibernate4/pom.xml b/persistence-modules/spring-hibernate4/pom.xml
similarity index 99%
rename from spring-hibernate4/pom.xml
rename to persistence-modules/spring-hibernate4/pom.xml
index 505a218a94..fad84870df 100644
--- a/spring-hibernate4/pom.xml
+++ b/persistence-modules/spring-hibernate4/pom.xml
@@ -10,6 +10,7 @@
com.baeldung
parent-modules
1.0.0-SNAPSHOT
+ ../../
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/criteria/model/Item.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/OrderDetail.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserEager.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/model/UserLazy.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/util/HibernateUtil.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/fetching/view/FetchingAppView.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/config/HibernateAnnotationUtil.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMain.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Cart.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/Items.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarAuditableDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarAuditableDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarAuditableDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarAuditableDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarCrudRepository.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IBarDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IChildDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IChildDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IChildDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IChildDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooAuditableDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooAuditableDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooAuditableDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooAuditableDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IFooDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IParentDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IParentDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IParentDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/IParentDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateAuditableDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateAuditableDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateAuditableDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateAuditableDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractHibernateDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/AbstractJpaDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/GenericHibernateDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/GenericHibernateDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/GenericHibernateDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/GenericHibernateDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IAuditOperations.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IAuditOperations.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IAuditOperations.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IAuditOperations.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IGenericDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IGenericDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IGenericDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IGenericDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IOperations.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/common/IOperations.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarAuditableDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarAuditableDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarAuditableDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarAuditableDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarJpaDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarJpaDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarJpaDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/BarJpaDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ChildDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ChildDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ChildDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ChildDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooAuditableDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooAuditableDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooAuditableDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooAuditableDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/FooDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ParentDao.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ParentDao.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ParentDao.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/dao/impl/ParentDao.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Bar.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Child.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Child.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/model/Child.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Child.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Foo.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Parent.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Parent.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/model/Parent.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Parent.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/model/Person.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarAuditableService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarAuditableService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarAuditableService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarAuditableService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IBarService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IChildService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IChildService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IChildService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IChildService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooAuditableService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooAuditableService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooAuditableService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooAuditableService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IFooService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IParentService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IParentService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/IParentService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/IParentService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateAuditableService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractHibernateService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractJpaService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractJpaService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractJpaService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractJpaService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/common/AbstractSpringDataJpaService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarAuditableService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarAuditableService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarAuditableService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarAuditableService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarJpaService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarJpaService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarJpaService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarJpaService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/BarSpringDataJpaService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ChildService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ChildService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ChildService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ChildService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooAuditableService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooAuditableService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooAuditableService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooAuditableService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/FooService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ParentService.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ParentService.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ParentService.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/persistence/service/impl/ParentService.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceConfig.java
diff --git a/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
similarity index 100%
rename from spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
rename to persistence-modules/spring-hibernate4/src/main/java/com/baeldung/spring/PersistenceXmlConfig.java
diff --git a/spring-hibernate4/src/main/resources/fetching.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/fetching.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/fetching.cfg.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/fetching.cfg.xml
diff --git a/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/fetchingLazy.cfg.xml
diff --git a/spring-hibernate4/src/main/resources/fetching_create_queries.sql b/persistence-modules/spring-hibernate4/src/main/resources/fetching_create_queries.sql
similarity index 100%
rename from spring-hibernate4/src/main/resources/fetching_create_queries.sql
rename to persistence-modules/spring-hibernate4/src/main/resources/fetching_create_queries.sql
diff --git a/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml
diff --git a/spring-hibernate4/src/main/resources/hibernate4Config.xml b/persistence-modules/spring-hibernate4/src/main/resources/hibernate4Config.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/hibernate4Config.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/hibernate4Config.xml
diff --git a/spring-hibernate4/src/main/resources/immutable.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/immutable.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/immutable.cfg.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/immutable.cfg.xml
diff --git a/spring-hibernate4/src/main/resources/insert_statements.sql b/persistence-modules/spring-hibernate4/src/main/resources/insert_statements.sql
similarity index 100%
rename from spring-hibernate4/src/main/resources/insert_statements.sql
rename to persistence-modules/spring-hibernate4/src/main/resources/insert_statements.sql
diff --git a/persistence-modules/spring-hibernate4/src/main/resources/logback.xml b/persistence-modules/spring-hibernate4/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/persistence-modules/spring-hibernate4/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/one_to_many.sql b/persistence-modules/spring-hibernate4/src/main/resources/one_to_many.sql
similarity index 100%
rename from spring-hibernate4/src/main/resources/one_to_many.sql
rename to persistence-modules/spring-hibernate4/src/main/resources/one_to_many.sql
diff --git a/spring-hibernate4/src/main/resources/persistence-mysql.properties b/persistence-modules/spring-hibernate4/src/main/resources/persistence-mysql.properties
similarity index 100%
rename from spring-hibernate4/src/main/resources/persistence-mysql.properties
rename to persistence-modules/spring-hibernate4/src/main/resources/persistence-mysql.properties
diff --git a/spring-hibernate4/src/main/resources/stored_procedure.sql b/persistence-modules/spring-hibernate4/src/main/resources/stored_procedure.sql
similarity index 93%
rename from spring-hibernate4/src/main/resources/stored_procedure.sql
rename to persistence-modules/spring-hibernate4/src/main/resources/stored_procedure.sql
index 8e1bdf57dd..9cedb75c37 100644
--- a/spring-hibernate4/src/main/resources/stored_procedure.sql
+++ b/persistence-modules/spring-hibernate4/src/main/resources/stored_procedure.sql
@@ -1,20 +1,20 @@
-DELIMITER //
- CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255))
- LANGUAGE SQL
- DETERMINISTIC
- SQL SECURITY DEFINER
- BEGIN
- SELECT * FROM foo WHERE name = fooName;
- END //
-DELIMITER ;
-
-
-DELIMITER //
- CREATE PROCEDURE GetAllFoos()
- LANGUAGE SQL
- DETERMINISTIC
- SQL SECURITY DEFINER
- BEGIN
- SELECT * FROM foo;
- END //
+DELIMITER //
+ CREATE PROCEDURE GetFoosByName(IN fooName VARCHAR(255))
+ LANGUAGE SQL
+ DETERMINISTIC
+ SQL SECURITY DEFINER
+ BEGIN
+ SELECT * FROM foo WHERE name = fooName;
+ END //
+DELIMITER ;
+
+
+DELIMITER //
+ CREATE PROCEDURE GetAllFoos()
+ LANGUAGE SQL
+ DETERMINISTIC
+ SQL SECURITY DEFINER
+ BEGIN
+ SELECT * FROM foo;
+ END //
DELIMITER ;
\ No newline at end of file
diff --git a/spring-hibernate4/src/main/resources/webSecurityConfig.xml b/persistence-modules/spring-hibernate4/src/main/resources/webSecurityConfig.xml
similarity index 100%
rename from spring-hibernate4/src/main/resources/webSecurityConfig.xml
rename to persistence-modules/spring-hibernate4/src/main/resources/webSecurityConfig.xml
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/hibernate/fetching/HibernateFetchingIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/hibernate/oneToMany/main/HibernateOneToManyAnnotationMainIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/IntegrationTestSuite.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/AuditTestSuite.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/AuditTestSuite.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/audit/AuditTestSuite.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/AuditTestSuite.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/EnversFooBarAuditIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/JPABarAuditIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/audit/SpringDataJPABarAuditIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooFixtures.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooPaginationPersistenceIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/hibernate/FooSortingPersistenceIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/save/SaveMethodsIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServiceBasicPersistenceIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
similarity index 97%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
index 9ec04d297c..d9353f1ad1 100644
--- a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
+++ b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/FooStoredProceduresLiveTest.java
@@ -1,121 +1,121 @@
-package com.baeldung.persistence.service;
-
-import java.util.List;
-
-import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import static org.junit.Assert.assertEquals;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.exception.SQLGrammarException;
-import org.junit.After;
-import org.junit.Assume;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-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.persistence.model.Foo;
-import com.baeldung.spring.PersistenceConfig;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
-public class FooStoredProceduresLiveTest {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(FooStoredProceduresLiveTest.class);
-
- @Autowired
- private SessionFactory sessionFactory;
-
- @Autowired
- private IFooService fooService;
-
- private Session session;
-
- @Before
- public final void before() {
- session = sessionFactory.openSession();
- Assume.assumeTrue(getAllFoosExists());
- Assume.assumeTrue(getFoosByNameExists());
- }
-
- private boolean getFoosByNameExists() {
- try {
- Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
- sqlQuery.list();
- return true;
- } catch (SQLGrammarException e) {
- LOGGER.error("WARNING : GetFoosByName() Procedure is may be missing ", e);
- return false;
- }
- }
-
- private boolean getAllFoosExists() {
- try {
- Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
- sqlQuery.list();
- return true;
- } catch (SQLGrammarException e) {
- LOGGER.error("WARNING : GetAllFoos() Procedure is may be missing ", e);
- return false;
- }
- }
-
- @After
- public final void after() {
- session.close();
- }
-
- @Test
- public final void getAllFoosUsingStoredProcedures() {
-
- fooService.create(new Foo(randomAlphabetic(6)));
-
- // Stored procedure getAllFoos using createSQLQuery
- Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
- @SuppressWarnings("unchecked")
- List allFoos = sqlQuery.list();
- for (Foo foo : allFoos) {
- LOGGER.info("getAllFoos() SQL Query result : {}", foo.getName());
- }
- assertEquals(allFoos.size(), fooService.findAll().size());
-
- // Stored procedure getAllFoos using a Named Query
- Query namedQuery = session.getNamedQuery("callGetAllFoos");
- @SuppressWarnings("unchecked")
- List allFoos2 = namedQuery.list();
- for (Foo foo : allFoos2) {
- LOGGER.info("getAllFoos() NamedQuery result : {}", foo.getName());
- }
- assertEquals(allFoos2.size(), fooService.findAll().size());
- }
-
- @Test
- public final void getFoosByNameUsingStoredProcedures() {
-
- fooService.create(new Foo("NewFooName"));
-
- // Stored procedure getFoosByName using createSQLQuery()
- Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)").addEntity(Foo.class).setParameter("fooName", "NewFooName");
- @SuppressWarnings("unchecked")
- List allFoosByName = sqlQuery.list();
- for (Foo foo : allFoosByName) {
- LOGGER.info("getFoosByName() using SQL Query : found => {}", foo.toString());
- }
-
- // Stored procedure getFoosByName using getNamedQuery()
- Query namedQuery = session.getNamedQuery("callGetFoosByName").setParameter("fooName", "NewFooName");
- @SuppressWarnings("unchecked")
- List allFoosByName2 = namedQuery.list();
- for (Foo foo : allFoosByName2) {
- LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString());
- }
-
- }
-}
+package com.baeldung.persistence.service;
+
+import java.util.List;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertEquals;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.exception.SQLGrammarException;
+import org.junit.After;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.persistence.model.Foo;
+import com.baeldung.spring.PersistenceConfig;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
+public class FooStoredProceduresLiveTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FooStoredProceduresLiveTest.class);
+
+ @Autowired
+ private SessionFactory sessionFactory;
+
+ @Autowired
+ private IFooService fooService;
+
+ private Session session;
+
+ @Before
+ public final void before() {
+ session = sessionFactory.openSession();
+ Assume.assumeTrue(getAllFoosExists());
+ Assume.assumeTrue(getFoosByNameExists());
+ }
+
+ private boolean getFoosByNameExists() {
+ try {
+ Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
+ sqlQuery.list();
+ return true;
+ } catch (SQLGrammarException e) {
+ LOGGER.error("WARNING : GetFoosByName() Procedure is may be missing ", e);
+ return false;
+ }
+ }
+
+ private boolean getAllFoosExists() {
+ try {
+ Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
+ sqlQuery.list();
+ return true;
+ } catch (SQLGrammarException e) {
+ LOGGER.error("WARNING : GetAllFoos() Procedure is may be missing ", e);
+ return false;
+ }
+ }
+
+ @After
+ public final void after() {
+ session.close();
+ }
+
+ @Test
+ public final void getAllFoosUsingStoredProcedures() {
+
+ fooService.create(new Foo(randomAlphabetic(6)));
+
+ // Stored procedure getAllFoos using createSQLQuery
+ Query sqlQuery = session.createSQLQuery("CALL GetAllFoos()").addEntity(Foo.class);
+ @SuppressWarnings("unchecked")
+ List allFoos = sqlQuery.list();
+ for (Foo foo : allFoos) {
+ LOGGER.info("getAllFoos() SQL Query result : {}", foo.getName());
+ }
+ assertEquals(allFoos.size(), fooService.findAll().size());
+
+ // Stored procedure getAllFoos using a Named Query
+ Query namedQuery = session.getNamedQuery("callGetAllFoos");
+ @SuppressWarnings("unchecked")
+ List allFoos2 = namedQuery.list();
+ for (Foo foo : allFoos2) {
+ LOGGER.info("getAllFoos() NamedQuery result : {}", foo.getName());
+ }
+ assertEquals(allFoos2.size(), fooService.findAll().size());
+ }
+
+ @Test
+ public final void getFoosByNameUsingStoredProcedures() {
+
+ fooService.create(new Foo("NewFooName"));
+
+ // Stored procedure getFoosByName using createSQLQuery()
+ Query sqlQuery = session.createSQLQuery("CALL GetFoosByName(:fooName)").addEntity(Foo.class).setParameter("fooName", "NewFooName");
+ @SuppressWarnings("unchecked")
+ List allFoosByName = sqlQuery.list();
+ for (Foo foo : allFoosByName) {
+ LOGGER.info("getFoosByName() using SQL Query : found => {}", foo.toString());
+ }
+
+ // Stored procedure getFoosByName using getNamedQuery()
+ Query namedQuery = session.getNamedQuery("callGetFoosByName").setParameter("fooName", "NewFooName");
+ @SuppressWarnings("unchecked")
+ List allFoosByName2 = namedQuery.list();
+ for (Foo foo : allFoosByName2) {
+ LOGGER.info("getFoosByName() using Native Query : found => {}", foo.toString());
+ }
+
+ }
+}
diff --git a/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/persistence/service/ParentServicePersistenceIntegrationTest.java
diff --git a/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java b/persistence-modules/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java
similarity index 100%
rename from spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java
rename to persistence-modules/spring-hibernate4/src/test/java/com/baeldung/spring/config/PersistenceTestConfig.java
diff --git a/spring-hibernate4/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-hibernate4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-hibernate4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to persistence-modules/spring-hibernate4/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/persistence-modules/spring-hibernate4/src/test/resources/.gitignore b/persistence-modules/spring-hibernate4/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/persistence-modules/spring-hibernate4/src/test/resources/.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/spring-hibernate4/src/test/resources/fetching.cfg.xml b/persistence-modules/spring-hibernate4/src/test/resources/fetching.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/test/resources/fetching.cfg.xml
rename to persistence-modules/spring-hibernate4/src/test/resources/fetching.cfg.xml
diff --git a/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml b/persistence-modules/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
similarity index 100%
rename from spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
rename to persistence-modules/spring-hibernate4/src/test/resources/fetchingLazy.cfg.xml
diff --git a/spring-hibernate4/src/test/resources/persistence-h2.properties b/persistence-modules/spring-hibernate4/src/test/resources/persistence-h2.properties
similarity index 100%
rename from spring-hibernate4/src/test/resources/persistence-h2.properties
rename to persistence-modules/spring-hibernate4/src/test/resources/persistence-h2.properties
diff --git a/pom.xml b/pom.xml
index 6c77ede1c2..302530fd24 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,12 @@
${junit-jupiter.version}
test
+
+ org.junit.jupiter
+ junit-jupiter-params
+ ${junit-jupiter.version}
+ test
+
org.junit.jupiter
junit-jupiter-api
@@ -348,17 +354,19 @@
core-java
core-java-collections
+ java-collections-conversions
+ java-collections-maps
core-java-io
core-java-8
java-streams
- core-java-persistence
+ persistence-modules/core-java-persistence
core-kotlin
kotlin-libraries
core-groovy
core-java-concurrency
core-java-concurrency-collections
couchbase
- deltaspike
+ persistence-modules/deltaspike
dozer
ethereum
ejb
@@ -372,6 +380,7 @@
google-web-toolkit
gson
guava
+ guava-collections
guava-modules/guava-18
guava-modules/guava-19
guava-modules/guava-21
@@ -385,7 +394,7 @@
hystrix
image-processing
immutables
- influxdb
+ persistence-modules/influxdb
jackson
persistence-modules/java-cassandra
vavr
@@ -429,7 +438,7 @@
mustache
mvn-wrapper
noexception
- orientdb
+ persistence-modules/orientdb
osgi
orika
patterns
@@ -470,26 +479,26 @@
spring-boot-admin
spring-boot-camel
spring-boot-ops
- spring-boot-persistence
+ persistence-modules/spring-boot-persistence
spring-boot-security
spring-boot-mvc
spring-boot-vue
spring-boot-logging-log4j2
+ spring-boot-disable-console-logging
spring-cloud-data-flow
spring-cloud
spring-cloud-bus
spring-core
spring-cucumber
spring-ejb
- spring-ejb/spring-ejb-client
spring-aop
persistence-modules/spring-data-cassandra
spring-data-couchbase-2
persistence-modules/spring-data-dynamodb
- spring-data-elasticsearch
- spring-data-jpa
- spring-data-keyvalue
- spring-data-mongodb
+ persistence-modules/spring-data-elasticsearch
+ persistence-modules/spring-data-jpa
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-mongodb
persistence-modules/spring-data-neo4j
persistence-modules/spring-data-redis
spring-data-rest
@@ -498,7 +507,7 @@
spring-exceptions
spring-freemarker
persistence-modules/spring-hibernate-3
- spring-hibernate4
+ persistence-modules/spring-hibernate4
persistence-modules/spring-hibernate-5
persistence-modules/spring-data-eclipselink
spring-integration
@@ -798,13 +807,13 @@
spring-cloud/spring-cloud-data-flow/time-processor
spring-cloud/spring-cloud-data-flow/time-source
spring-cucumber
- spring-data-keyvalue
+ persistence-modules/spring-data-keyvalue
spring-data-rest
spring-dispatcher-servlet
spring-drools
spring-freemarker
- spring-hibernate-3
- spring-hibernate4
+ persistence-modules/spring-hibernate-3
+ persistence-modules/spring-hibernate4
spring-integration
spring-jenkins-pipeline
spring-jersey
@@ -933,7 +942,7 @@
azure bootique cdi core-java
core-java-collections core-java-io core-java-8
core-kotlin core-groovy core-java-concurrency
- couchbase deltaspike dozer
+ couchbase persistence-modules/deltaspike dozer
ethereum ejb feign flips
geotools testing-modules/groovy-spock testing-modules/gatling
google-cloud google-web-toolkit gson
@@ -941,7 +950,7 @@
guava-modules/guava-21 guice disruptor
spring-static-resources hazelcast hbase
hibernate5 httpclient hystrix
- image-processing immutables influxdb
+ image-processing immutables persistence-modules/influxdb
jackson persistence-modules/java-cassandra
vavr java-lite java-numbers
java-rmi java-vavr-stream javax-servlets
@@ -966,7 +975,7 @@
mustache
mvn-wrapper
noexception
- orientdb
+ persistence-modules/orientdb
osgi
orika
patterns
@@ -1013,25 +1022,25 @@
spring-boot-admin
spring-boot-camel
spring-boot-ops
- spring-boot-persistence
+ persistence-modules/spring-boot-persistence
spring-boot-security
spring-boot-mvc
spring-boot-logging-log4j2
+ spring-boot-disable-console-logging
spring-cloud-data-flow
spring-cloud
spring-cloud-bus
spring-core
spring-cucumber
spring-ejb
- spring-ejb/spring-ejb-client
spring-aop
persistence-modules/spring-data-cassandra
spring-data-couchbase-2
persistence-modules/spring-data-dynamodb
- spring-data-elasticsearch
- spring-data-keyvalue
- spring-data-mongodb
- spring-data-jpa
+ persistence-modules/spring-data-elasticsearch
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-mongodb
+ persistence-modules/spring-data-jpa
persistence-modules/spring-data-neo4j
persistence-modules/spring-data-redis
spring-data-rest
@@ -1046,7 +1055,7 @@
spring-exceptions
spring-freemarker
persistence-modules/spring-hibernate-3
- spring-hibernate4
+ persistence-modules/spring-hibernate4
persistence-modules/spring-hibernate-5
persistence-modules/spring-data-eclipselink
spring-integration
@@ -1263,13 +1272,15 @@
java-strings
core-java-collections
+ java-collections-conversions
+ java-collections-maps
core-java-io
core-java-8
java-streams
core-groovy
couchbase
- deltaspike
+ persistence-modules/deltaspike
dozer
ethereum
feign
@@ -1278,6 +1289,7 @@
google-cloud
gson
guava
+ guava-collections
guava-modules/guava-18
guava-modules/guava-19
guava-modules/guava-21
@@ -1290,7 +1302,7 @@
hystrix
image-processing
immutables
- influxdb
+ persistence-modules/influxdb
jackson
vavr
java-lite
@@ -1331,7 +1343,7 @@
mustache
mvn-wrapper
noexception
- orientdb
+ persistence-modules/orientdb
osgi
orika
patterns
@@ -1368,22 +1380,22 @@
spring-boot-bootstrap
spring-boot-admin
spring-boot-camel
- spring-boot-persistence
+ persistence-modules/spring-boot-persistence
spring-boot-security
spring-boot-mvc
spring-boot-logging-log4j2
+ spring-boot-disable-console-logging
spring-cloud-data-flow
spring-cloud
spring-cloud-bus
spring-core
spring-cucumber
spring-ejb
- spring-ejb/spring-ejb-client
spring-aop
persistence-modules/spring-data-dynamodb
- spring-data-keyvalue
- spring-data-mongodb
+ persistence-modules/spring-data-keyvalue
+ persistence-modules/spring-data-mongodb
persistence-modules/spring-data-neo4j
spring-data-rest
@@ -1498,7 +1510,7 @@
maven-archetype
apache-meecrowave
- spring-hibernate4
+ persistence-modules/spring-hibernate4
xml
vertx
metrics
@@ -1592,7 +1604,7 @@
google-web-toolkit
spring-security-mvc-custom
hibernate5
- spring-data-elasticsearch
+ persistence-modules/spring-data-elasticsearch
core-java-concurrency
core-java-concurrency-collections
diff --git a/reactor-core/src/main/java/com/baeldung/reactor/ItemProducerCreate.java b/reactor-core/src/main/java/com/baeldung/reactor/ItemProducerCreate.java
new file mode 100644
index 0000000000..6078f8ef0b
--- /dev/null
+++ b/reactor-core/src/main/java/com/baeldung/reactor/ItemProducerCreate.java
@@ -0,0 +1,44 @@
+package com.baeldung.reactor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import reactor.core.publisher.Flux;
+
+public class ItemProducerCreate {
+
+ Logger logger = LoggerFactory.getLogger(NetworTrafficProducerPush.class);
+
+ Consumer> listener;
+
+ public void create() {
+ Flux articlesFlux = Flux.create((sink) -> {
+ ItemProducerCreate.this.listener = (items) -> {
+ items.stream()
+ .forEach(article -> sink.next(article));
+ };
+ });
+ articlesFlux.subscribe(ItemProducerCreate.this.logger::info);
+ }
+
+ public static void main(String[] args) {
+ ItemProducerCreate producer = new ItemProducerCreate();
+ producer.create();
+
+ new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ List items = new ArrayList<>();
+ items.add("Item 1");
+ items.add("Item 2");
+ items.add("Item 3");
+ producer.listener.accept(items);
+ }
+ }).start();
+ }
+}
diff --git a/reactor-core/src/main/java/com/baeldung/reactor/NetworTrafficProducerPush.java b/reactor-core/src/main/java/com/baeldung/reactor/NetworTrafficProducerPush.java
new file mode 100644
index 0000000000..807ceae84d
--- /dev/null
+++ b/reactor-core/src/main/java/com/baeldung/reactor/NetworTrafficProducerPush.java
@@ -0,0 +1,34 @@
+package com.baeldung.reactor;
+
+import java.util.function.Consumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.FluxSink.OverflowStrategy;
+
+public class NetworTrafficProducerPush {
+
+ Logger logger = LoggerFactory.getLogger(NetworTrafficProducerPush.class);
+
+ Consumer listener;
+
+ public void subscribe(Consumer consumer) {
+ Flux flux = Flux.push(sink -> {
+ NetworTrafficProducerPush.this.listener = (t) -> sink.next(t);
+ }, OverflowStrategy.DROP);
+ flux.subscribe(consumer);
+ }
+
+ public void onPacket(String packet) {
+ listener.accept(packet);
+ }
+
+ public static void main(String[] args) {
+ NetworTrafficProducerPush trafficProducer = new NetworTrafficProducerPush();
+ trafficProducer.subscribe(trafficProducer.logger::info);
+ trafficProducer.onPacket("Packet[A18]");
+ }
+
+}
diff --git a/reactor-core/src/main/java/com/baeldung/reactor/ProgramaticSequences.java b/reactor-core/src/main/java/com/baeldung/reactor/ProgramaticSequences.java
new file mode 100644
index 0000000000..b52def377d
--- /dev/null
+++ b/reactor-core/src/main/java/com/baeldung/reactor/ProgramaticSequences.java
@@ -0,0 +1,58 @@
+package com.baeldung.reactor;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import reactor.core.publisher.Flux;
+
+public class ProgramaticSequences {
+
+ Logger logger = LoggerFactory.getLogger(ProgramaticSequences.class);
+
+ public void statefullImutableGenerate() {
+ Flux flux = Flux.generate(() -> 1, (state, sink) -> {
+ sink.next("2 + " + state + " = " + 2 + state);
+ if (state == 101)
+ sink.complete();
+ return state + 1;
+ });
+
+ flux.subscribe(logger::info);
+ }
+
+ public void statefullMutableGenerate() {
+ Flux flux = Flux.generate(AtomicInteger::new, (state, sink) -> {
+ int i = state.getAndIncrement();
+ sink.next("2 + " + state + " = " + 2 + state);
+ if (i == 101)
+ sink.complete();
+ return state;
+ });
+
+ flux.subscribe(logger::info);
+ }
+
+ public void handle() {
+ Flux elephants = Flux.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+ .handle((i, sink) -> {
+ String animal = "Elephant nr " + i;
+ if (i % 2 == 0) {
+ sink.next(animal);
+ }
+ });
+
+ elephants.subscribe(logger::info);
+ }
+
+ public static void main(String[] args) {
+ ProgramaticSequences ps = new ProgramaticSequences();
+
+ ps.statefullImutableGenerate();
+ ps.statefullMutableGenerate();
+ ps.handle();
+
+ }
+
+}
diff --git a/reactor-core/src/main/java/com/baeldung/reactor/StatelessGenerate.java b/reactor-core/src/main/java/com/baeldung/reactor/StatelessGenerate.java
new file mode 100644
index 0000000000..c82f8e160b
--- /dev/null
+++ b/reactor-core/src/main/java/com/baeldung/reactor/StatelessGenerate.java
@@ -0,0 +1,24 @@
+package com.baeldung.reactor;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import reactor.core.publisher.Flux;
+
+public class StatelessGenerate {
+
+ Logger logger = LoggerFactory.getLogger(StatelessGenerate.class);
+
+ public void statelessGenerate() {
+ Flux flux = Flux.generate((sink) -> {
+ sink.next("hallo");
+ });
+ flux.subscribe(logger::info);
+ }
+
+ public static void main(String[] args) {
+ StatelessGenerate ps = new StatelessGenerate();
+ ps.statelessGenerate();
+ }
+
+}
diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md
index 7e83077f54..fa9d48ab72 100644
--- a/spring-5-mvc/README.md
+++ b/spring-5-mvc/README.md
@@ -2,3 +2,4 @@
- [Spring Boot and Kotlin](http://www.baeldung.com/spring-boot-kotlin)
- [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams)
- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy)
+- [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao)
diff --git a/spring-5-reactive-security/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerIntegrationTest.java b/spring-5-reactive-security/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerIntegrationTest.java
index 3dc832d781..12a21ed4ef 100644
--- a/spring-5-reactive-security/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerIntegrationTest.java
+++ b/spring-5-reactive-security/src/test/java/com/baeldung/reactive/webflux/EmployeeControllerIntegrationTest.java
@@ -15,7 +15,7 @@ import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;
-import com.baeldung.reactive.actuator.Spring5ReactiveApplication;
+import com.baeldung.webflux.EmployeeSpringApplication;
import com.baeldung.webflux.Employee;
import com.baeldung.webflux.EmployeeRepository;
@@ -23,7 +23,7 @@ import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RunWith(SpringRunner.class)
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes=Spring5ReactiveApplication.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes=EmployeeSpringApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class EmployeeControllerIntegrationTest {
diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md
index 7977fd820f..1431554882 100644
--- a/spring-5-reactive/README.md
+++ b/spring-5-reactive/README.md
@@ -14,3 +14,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors)
- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors)
- [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events)
+- [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/a-guide-to-spring-session-reactive-support-websession/)
\ No newline at end of file
diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml
index 5f455c3906..e903b57c4e 100644
--- a/spring-5-reactive/pom.xml
+++ b/spring-5-reactive/pom.xml
@@ -76,6 +76,28 @@
test
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+ org.springframework.session
+ spring-session-core
+
+
+ org.springframework.session
+ spring-session-data-redis
+
+
org.apache.commons
commons-collections4
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java
new file mode 100644
index 0000000000..e548e33c85
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.validations.functional;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class FunctionalValidationsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FunctionalValidationsApplication.class, args);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java
new file mode 100644
index 0000000000..f34c1ee8d8
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java
@@ -0,0 +1,45 @@
+package com.baeldung.validations.functional.handlers;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.validation.Errors;
+import org.springframework.validation.Validator;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.server.ResponseStatusException;
+
+import reactor.core.publisher.Mono;
+
+public abstract class AbstractValidationHandler {
+
+ private final Class validationClass;
+
+ private final U validator;
+
+ protected AbstractValidationHandler(Class clazz, U validator) {
+ this.validationClass = clazz;
+ this.validator = validator;
+ }
+
+ abstract protected Mono processBody(T validBody, final ServerRequest originalRequest);
+
+ public final Mono handleRequest(final ServerRequest request) {
+ return request.bodyToMono(this.validationClass)
+ .flatMap(body -> {
+ Errors errors = new BeanPropertyBindingResult(body, this.validationClass.getName());
+ this.validator.validate(body, errors);
+
+ if (errors == null || errors.getAllErrors()
+ .isEmpty()) {
+ return processBody(body, request);
+ } else {
+ return onValidationErrors(errors, body, request);
+ }
+ });
+ }
+
+ protected Mono onValidationErrors(Errors errors, T invalidBody, final ServerRequest request) {
+ throw new ResponseStatusException(HttpStatus.BAD_REQUEST, errors.getAllErrors()
+ .toString());
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java
new file mode 100644
index 0000000000..d7e3bd0bc0
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java
@@ -0,0 +1,43 @@
+package com.baeldung.validations.functional.handlers;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.validation.Errors;
+import org.springframework.validation.Validator;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import org.springframework.web.server.ResponseStatusException;
+
+import com.baeldung.validations.functional.model.CustomRequestEntity;
+import com.baeldung.validations.functional.validators.CustomRequestEntityValidator;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class FunctionalHandler {
+
+ public Mono handleRequest(final ServerRequest request) {
+ Validator validator = new CustomRequestEntityValidator();
+ Mono responseBody = request.bodyToMono(CustomRequestEntity.class)
+ .map(body -> {
+ Errors errors = new BeanPropertyBindingResult(body, CustomRequestEntity.class.getName());
+ validator.validate(body, errors);
+
+ if (errors == null || errors.getAllErrors()
+ .isEmpty()) {
+ return String.format("Hi, %s [%s]!", body.getName(), body.getCode());
+
+ } else {
+ throw new ResponseStatusException(HttpStatus.BAD_REQUEST, errors.getAllErrors()
+ .toString());
+ }
+
+ });
+ return ServerResponse.ok()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(responseBody, String.class);
+
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java
new file mode 100644
index 0000000000..2011679741
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java
@@ -0,0 +1,30 @@
+package com.baeldung.validations.functional.handlers.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Validator;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.validations.functional.handlers.AbstractValidationHandler;
+import com.baeldung.validations.functional.model.AnnotatedRequestEntity;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class AnnotatedRequestEntityValidationHandler extends AbstractValidationHandler {
+
+ private AnnotatedRequestEntityValidationHandler(@Autowired Validator validator) {
+ super(AnnotatedRequestEntity.class, validator);
+ }
+
+ @Override
+ protected Mono processBody(AnnotatedRequestEntity validBody, ServerRequest originalRequest) {
+ String responseBody = String.format("Hi, %s. Password: %s!", validBody.getUser(), validBody.getPassword());
+ return ServerResponse.ok()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(Mono.just(responseBody), String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java
new file mode 100644
index 0000000000..34630c60b2
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java
@@ -0,0 +1,37 @@
+package com.baeldung.validations.functional.handlers.impl;
+
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.validations.functional.handlers.AbstractValidationHandler;
+import com.baeldung.validations.functional.model.CustomRequestEntity;
+import com.baeldung.validations.functional.validators.CustomRequestEntityValidator;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class CustomRequestEntityValidationHandler extends AbstractValidationHandler {
+
+ private CustomRequestEntityValidationHandler() {
+ super(CustomRequestEntity.class, new CustomRequestEntityValidator());
+ }
+
+ @Override
+ protected Mono processBody(CustomRequestEntity validBody, ServerRequest originalRequest) {
+ String responseBody = String.format("Hi, %s [%s]!", validBody.getName(), validBody.getCode());
+ return ServerResponse.ok()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(Mono.just(responseBody), String.class);
+ }
+
+ @Override
+ protected Mono onValidationErrors(Errors errors, CustomRequestEntity invalidBody, final ServerRequest request) {
+ return ServerResponse.badRequest()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(Mono.just(String.format("Custom message showing the errors: %s", errors.getAllErrors()
+ .toString())), String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java
new file mode 100644
index 0000000000..0196287d13
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java
@@ -0,0 +1,28 @@
+package com.baeldung.validations.functional.handlers.impl;
+
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.validations.functional.handlers.AbstractValidationHandler;
+import com.baeldung.validations.functional.model.OtherEntity;
+import com.baeldung.validations.functional.validators.OtherEntityValidator;
+
+import reactor.core.publisher.Mono;
+
+@Component
+public class OtherEntityValidationHandler extends AbstractValidationHandler {
+
+ private OtherEntityValidationHandler() {
+ super(OtherEntity.class, new OtherEntityValidator());
+ }
+
+ @Override
+ protected Mono processBody(OtherEntity validBody, ServerRequest originalRequest) {
+ String responseBody = String.format("Other object with item %s and quantity %s!", validBody.getItem(), validBody.getQuantity());
+ return ServerResponse.ok()
+ .contentType(MediaType.APPLICATION_JSON)
+ .body(Mono.just(responseBody), String.class);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java
new file mode 100644
index 0000000000..992f07481c
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java
@@ -0,0 +1,23 @@
+package com.baeldung.validations.functional.model;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class AnnotatedRequestEntity {
+ @NotNull
+ private String user;
+
+ @NotNull
+ @Size(min = 4, max = 7)
+ private String password;
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java
new file mode 100644
index 0000000000..ed459f121b
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java
@@ -0,0 +1,17 @@
+package com.baeldung.validations.functional.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class CustomRequestEntity {
+
+ private String name;
+ private String code;
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java
new file mode 100644
index 0000000000..78667cb13d
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java
@@ -0,0 +1,17 @@
+package com.baeldung.validations.functional.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+@Setter
+public class OtherEntity {
+
+ private String item;
+ private Integer quantity;
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java
new file mode 100644
index 0000000000..efbdbe3f99
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java
@@ -0,0 +1,29 @@
+package com.baeldung.validations.functional.routers;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.function.server.RequestPredicates;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.RouterFunctions;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import com.baeldung.validations.functional.handlers.FunctionalHandler;
+import com.baeldung.validations.functional.handlers.impl.AnnotatedRequestEntityValidationHandler;
+import com.baeldung.validations.functional.handlers.impl.CustomRequestEntityValidationHandler;
+import com.baeldung.validations.functional.handlers.impl.OtherEntityValidationHandler;
+
+@Configuration
+public class ValidationsRouters {
+
+ @Bean
+ public RouterFunction responseHeaderRoute(@Autowired CustomRequestEntityValidationHandler dryHandler,
+ @Autowired FunctionalHandler complexHandler,
+ @Autowired OtherEntityValidationHandler otherHandler,
+ @Autowired AnnotatedRequestEntityValidationHandler annotatedEntityHandler) {
+ return RouterFunctions.route(RequestPredicates.POST("/complex-handler-functional-validation"), complexHandler::handleRequest)
+ .andRoute(RequestPredicates.POST("/dry-functional-validation"), dryHandler::handleRequest)
+ .andRoute(RequestPredicates.POST("/other-dry-functional-validation"), otherHandler::handleRequest)
+ .andRoute(RequestPredicates.POST("/annotated-functional-validation"), annotatedEntityHandler::handleRequest);
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java
new file mode 100644
index 0000000000..085d477318
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java
@@ -0,0 +1,29 @@
+package com.baeldung.validations.functional.validators;
+
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+import com.baeldung.validations.functional.model.CustomRequestEntity;
+
+public class CustomRequestEntityValidator implements Validator {
+
+ private static final int MINIMUM_CODE_LENGTH = 6;
+
+ @Override
+ public boolean supports(Class> clazz) {
+ return CustomRequestEntity.class.isAssignableFrom(clazz);
+ }
+
+ @Override
+ public void validate(Object target, Errors errors) {
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "field.required");
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "code", "field.required");
+ CustomRequestEntity request = (CustomRequestEntity) target;
+ if (request.getCode() != null && request.getCode()
+ .trim()
+ .length() < MINIMUM_CODE_LENGTH) {
+ errors.rejectValue("code", "field.min.length", new Object[] { Integer.valueOf(MINIMUM_CODE_LENGTH) }, "The code must be at least [" + MINIMUM_CODE_LENGTH + "] characters in length.");
+ }
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java
new file mode 100644
index 0000000000..18c2c28cfe
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java
@@ -0,0 +1,27 @@
+package com.baeldung.validations.functional.validators;
+
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+import com.baeldung.validations.functional.model.OtherEntity;
+
+public class OtherEntityValidator implements Validator {
+
+ private static final int MIN_ITEM_QUANTITY = 1;
+
+ @Override
+ public boolean supports(Class> clazz) {
+ return OtherEntity.class.isAssignableFrom(clazz);
+ }
+
+ @Override
+ public void validate(Object target, Errors errors) {
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "item", "field.required");
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "quantity", "field.required");
+ OtherEntity request = (OtherEntity) target;
+ if (request.getQuantity() != null && request.getQuantity() < MIN_ITEM_QUANTITY) {
+ errors.rejectValue("quantity", "field.min.length", new Object[] { Integer.valueOf(MIN_ITEM_QUANTITY) }, "There must be at least one item");
+ }
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java b/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java
new file mode 100644
index 0000000000..667ef29658
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/Application.java
@@ -0,0 +1,15 @@
+package com.baeldung.websession;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.baeldung"})
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java
new file mode 100644
index 0000000000..aa85cf9fd9
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/RedisConfig.java
@@ -0,0 +1,17 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.session.data.redis.config.annotation.web.server.EnableRedisWebSession;
+
+@Configuration
+//@EnableRedisWebSession
+public class RedisConfig {
+/**
+ @Bean
+ public LettuceConnectionFactory redisConnectionFactory() {
+ return new LettuceConnectionFactory();
+ }
+*/
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java
new file mode 100644
index 0000000000..7cb2ff680e
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/SessionConfig.java
@@ -0,0 +1,20 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.session.ReactiveMapSessionRepository;
+import org.springframework.session.ReactiveSessionRepository;
+import org.springframework.session.config.annotation.web.server.EnableSpringWebSession;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+@Configuration
+@EnableSpringWebSession
+public class SessionConfig {
+
+ @Bean
+ public ReactiveSessionRepository reactiveSessionRepository() {
+ return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
+ }
+
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java
new file mode 100644
index 0000000000..964b544916
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxConfig.java
@@ -0,0 +1,20 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.reactive.config.EnableWebFlux;
+import org.springframework.web.reactive.config.ResourceHandlerRegistry;
+import org.springframework.web.reactive.config.WebFluxConfigurer;
+
+@Configuration
+@EnableWebFlux
+public class WebFluxConfig implements ApplicationContextAware, WebFluxConfigurer {
+
+ private ApplicationContext context;
+
+ @Override
+ public void setApplicationContext(ApplicationContext context) {
+ this.context = context;
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java
new file mode 100644
index 0000000000..452bcac8ab
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java
@@ -0,0 +1,58 @@
+package com.baeldung.websession.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
+import org.springframework.security.config.web.server.ServerHttpSecurity;
+import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.server.SecurityWebFilterChain;
+import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository;
+
+@Configuration
+@EnableWebFluxSecurity
+public class WebFluxSecurityConfig {
+
+ @Bean
+ public MapReactiveUserDetailsService userDetailsService() {
+ UserDetails admin = User
+ .withUsername("admin")
+ .password(encoder().encode("password"))
+ .roles("ADMIN")
+ .build();
+
+ UserDetails user = User
+ .withUsername("user")
+ .password(encoder().encode("password"))
+ .roles("USER")
+ .build();
+
+ return new MapReactiveUserDetailsService(admin, user);
+ }
+
+ @Bean
+ public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
+ http
+ .authorizeExchange()
+ .anyExchange().authenticated()
+ .and()
+ .httpBasic()
+ .securityContextRepository(new WebSessionServerSecurityContextRepository())
+ .and()
+ .formLogin();
+
+ http
+ .csrf().disable();
+
+ return http.build();
+
+ }
+
+ @Bean
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java b/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java
new file mode 100644
index 0000000000..b91a050322
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/controller/SessionController.java
@@ -0,0 +1,42 @@
+package com.baeldung.websession.controller;
+
+import com.baeldung.websession.transfer.CustomResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.server.WebSession;
+import reactor.core.publisher.Mono;
+
+@RestController
+public class SessionController {
+
+ @GetMapping("/websession/test")
+ public Mono testWebSessionByParam(
+ @RequestParam(value = "id") int id,
+ @RequestParam(value = "note") String note,
+ WebSession session) {
+
+ session.getAttributes().put("id", id);
+ session.getAttributes().put("note", note);
+
+ CustomResponse r = new CustomResponse();
+ r.setId((int) session.getAttributes().get("id"));
+ r.setNote((String) session.getAttributes().get("note"));
+
+ return Mono.just(r);
+ }
+
+ @GetMapping("/websession")
+ public Mono getSession(WebSession session) {
+
+ session.getAttributes().putIfAbsent("id", 0);
+ session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");
+
+ CustomResponse r = new CustomResponse();
+ r.setId((int) session.getAttributes().get("id"));
+ r.setNote((String) session.getAttributes().get("note"));
+
+ return Mono.just(r);
+ }
+
+}
\ No newline at end of file
diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java b/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java
new file mode 100644
index 0000000000..2d562de157
--- /dev/null
+++ b/spring-5-reactive/src/main/java/com/baeldung/websession/transfer/CustomResponse.java
@@ -0,0 +1,31 @@
+package com.baeldung.websession.transfer;
+
+public class CustomResponse {
+
+ private int id;
+ private String note;
+
+ public CustomResponse() {}
+
+ public CustomResponse(int id, String note) {
+ this.id = id;
+ this.note = note;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getNote() {
+ return note;
+ }
+
+ public void setNote(String note) {
+ this.note = note;
+ }
+
+}
diff --git a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java
new file mode 100644
index 0000000000..5fe764bf8f
--- /dev/null
+++ b/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java
@@ -0,0 +1,111 @@
+package com.baeldung.validations.functional;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.reactive.server.WebTestClient;
+import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec;
+
+import com.baeldung.validations.functional.model.AnnotatedRequestEntity;
+import com.baeldung.validations.functional.model.CustomRequestEntity;
+
+import reactor.core.publisher.Mono;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class FunctionalEndpointValidationsLiveTest {
+
+ private static final String BASE_URL = "http://localhost:8080";
+ private static final String COMPLEX_EP_URL = BASE_URL + "/complex-handler-functional-validation";
+ private static final String DRY_EP_URL = BASE_URL + "/dry-functional-validation";
+ private static final String ANNOTATIONS_EP_URL = BASE_URL + "/annotated-functional-validation";
+
+ private static WebTestClient client;
+
+ @BeforeAll
+ public static void setup() {
+ client = WebTestClient.bindToServer()
+ .baseUrl(BASE_URL)
+ .build();
+ }
+
+ @Test
+ public void whenRequestingDryEPWithInvalidBody_thenObtainBadRequest() {
+ CustomRequestEntity body = new CustomRequestEntity("name", "123");
+
+ ResponseSpec response = client.post()
+ .uri(DRY_EP_URL)
+ .body(Mono.just(body), CustomRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isBadRequest();
+ }
+
+ @Test
+ public void whenRequestingComplexEPWithInvalidBody_thenObtainBadRequest() {
+ CustomRequestEntity body = new CustomRequestEntity("name", "123");
+
+ ResponseSpec response = client.post()
+ .uri(COMPLEX_EP_URL)
+ .body(Mono.just(body), CustomRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isBadRequest();
+ }
+
+ @Test
+ public void whenRequestingAnnotatedEPWithInvalidBody_thenObtainBadRequest() {
+ AnnotatedRequestEntity body = new AnnotatedRequestEntity("user", "passwordlongerthan7digits");
+
+ ResponseSpec response = client.post()
+ .uri(ANNOTATIONS_EP_URL)
+ .body(Mono.just(body), AnnotatedRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isBadRequest();
+ }
+
+ @Test
+ public void whenRequestingDryEPWithValidBody_thenObtainBadRequest() {
+ CustomRequestEntity body = new CustomRequestEntity("name", "1234567");
+
+ ResponseSpec response = client.post()
+ .uri(DRY_EP_URL)
+ .body(Mono.just(body), CustomRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isOk();
+ }
+
+ @Test
+ public void whenRequestingComplexEPWithValidBody_thenObtainBadRequest() {
+ CustomRequestEntity body = new CustomRequestEntity("name", "1234567");
+
+ ResponseSpec response = client.post()
+ .uri(COMPLEX_EP_URL)
+ .body(Mono.just(body), CustomRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isOk();
+ }
+
+ @Test
+ public void whenRequestingAnnotatedEPWithValidBody_thenObtainBadRequest() {
+ AnnotatedRequestEntity body = new AnnotatedRequestEntity("user", "12345");
+
+ ResponseSpec response = client.post()
+ .uri(ANNOTATIONS_EP_URL)
+ .body(Mono.just(body), AnnotatedRequestEntity.class)
+ .exchange();
+
+ response.expectStatus()
+ .isOk();
+ }
+}
diff --git a/spring-activiti/pom.xml b/spring-activiti/pom.xml
index 0a19f483c1..4e21c5b032 100644
--- a/spring-activiti/pom.xml
+++ b/spring-activiti/pom.xml
@@ -41,9 +41,21 @@
test
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+ com.baeldung.activitiwithspring.ActivitiWithSpringApplication
+
+
+
+
- com.example.activitiwithspring.ActivitiWithSpringApplication
UTF-8
UTF-8
6.0.0
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiController.java
similarity index 97%
rename from spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java
rename to spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiController.java
index 96b551c03c..54dd4670f0 100644
--- a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiController.java
+++ b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiController.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiWithSpringApplication.java b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java
similarity index 91%
rename from spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiWithSpringApplication.java
rename to spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java
index a9cd1301eb..d43ae3cc35 100644
--- a/spring-activiti/src/main/java/com/example/activitiwithspring/ActivitiWithSpringApplication.java
+++ b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplication.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/TaskRepresentation.java b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/TaskRepresentation.java
similarity index 90%
rename from spring-activiti/src/main/java/com/example/activitiwithspring/TaskRepresentation.java
rename to spring-activiti/src/main/java/com/baeldung/activitiwithspring/TaskRepresentation.java
index bb1412b057..de1ad88ba9 100644
--- a/spring-activiti/src/main/java/com/example/activitiwithspring/TaskRepresentation.java
+++ b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/TaskRepresentation.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
class TaskRepresentation {
diff --git a/spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/servicetasks/SendEmailServiceTask.java
similarity index 83%
rename from spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java
rename to spring-activiti/src/main/java/com/baeldung/activitiwithspring/servicetasks/SendEmailServiceTask.java
index c11b48f37a..c174b6ae4a 100644
--- a/spring-activiti/src/main/java/com/example/activitiwithspring/servicetasks/SendEmailServiceTask.java
+++ b/spring-activiti/src/main/java/com/baeldung/activitiwithspring/servicetasks/SendEmailServiceTask.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring.servicetasks;
+package com.baeldung.activitiwithspring.servicetasks;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
diff --git a/spring-activiti/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/SpringContextIntegrationTest.java
similarity index 81%
rename from spring-activiti/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/SpringContextIntegrationTest.java
index ae37e77f86..ce48080753 100644
--- a/spring-activiti/src/test/java/org/baeldung/SpringContextIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -1,11 +1,11 @@
-package org.baeldung;
+package com.baeldung;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-import com.example.activitiwithspring.ActivitiWithSpringApplication;
+import com.baeldung.activitiwithspring.ActivitiWithSpringApplication;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ActivitiWithSpringApplication.class)
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiControllerIntegrationTest.java
similarity index 97%
rename from spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiControllerIntegrationTest.java
index 65fd33bfc6..12c855e5ff 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiControllerIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiControllerIntegrationTest.java
@@ -1,5 +1,6 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
+import com.baeldung.activitiwithspring.TaskRepresentation;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java
similarity index 96%
rename from spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java
index c2eeb96555..53bdcee888 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiSpringSecurityIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.activiti.engine.IdentityService;
import org.junit.Test;
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java
similarity index 89%
rename from spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java
index 7460c302d8..8c1e400215 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ActivitiWithSpringApplicationIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.junit.Test;
import org.junit.runner.RunWith;
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessEngineCreationIntegrationTest.java
similarity index 98%
rename from spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessEngineCreationIntegrationTest.java
index 00afd14590..00538f8e6e 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessEngineCreationIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessEngineCreationIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
diff --git a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessExecutionIntegrationTest.java
similarity index 99%
rename from spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java
rename to spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessExecutionIntegrationTest.java
index 9c35ea413b..4342590ea9 100644
--- a/spring-activiti/src/test/java/com/example/activitiwithspring/ProcessExecutionIntegrationTest.java
+++ b/spring-activiti/src/test/java/com/baeldung/activitiwithspring/ProcessExecutionIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.example.activitiwithspring;
+package com.baeldung.activitiwithspring;
import org.activiti.engine.ActivitiException;
diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md
index 4b09f11714..08fdb1bdc9 100644
--- a/spring-boot-bootstrap/README.md
+++ b/spring-boot-bootstrap/README.md
@@ -3,3 +3,4 @@
- [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent)
- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar)
- [Deploying a Spring Boot Application to Cloud Foundry](https://www.baeldung.com/spring-boot-app-deploy-to-cloud-foundry)
+- [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine)
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
index 4eac7eba19..88c5d1caf5 100644
--- a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
@@ -7,11 +7,23 @@
0.0.1-SNAPSHOT
- parent-boot-1
+ spring-boot-custom-starter
com.baeldung
0.0.1-SNAPSHOT
- ../../parent-boot-1
+ ../../spring-boot-custom-starter
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
@@ -19,9 +31,27 @@
greeter-spring-boot-starter
${greeter-starter.version}
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+
+
+
+ 1.5.15.RELEASE
0.0.1-SNAPSHOT
diff --git a/spring-boot-custom-starter/pom.xml b/spring-boot-custom-starter/pom.xml
index b8ad8fa12c..97b33ce2b8 100644
--- a/spring-boot-custom-starter/pom.xml
+++ b/spring-boot-custom-starter/pom.xml
@@ -18,5 +18,6 @@
greeter-spring-boot-starter
greeter-spring-boot-sample-app
+
\ No newline at end of file
diff --git a/spring-boot-disable-console-logging/README.md b/spring-boot-disable-console-logging/README.md
new file mode 100644
index 0000000000..3d75fddc8e
--- /dev/null
+++ b/spring-boot-disable-console-logging/README.md
@@ -0,0 +1,2 @@
+### Relevant Articles:
+- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
similarity index 85%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml
rename to spring-boot-disable-console-logging/disabling-console-jul/pom.xml
index c3bad74352..ceac0616e9 100644
--- a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml
@@ -3,10 +3,12 @@
4.0.0
disabling-console-jul
+
+
- com.baeldung
- disabling-console-logging
- 0.0.1-SNAPSHOT
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java b/spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
rename to spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java b/spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
rename to spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties b/spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/application.properties
rename to spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/application.properties
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties b/spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/logging.properties
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-jul/src/main/resources/logging.properties
rename to spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/logging.properties
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
similarity index 81%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml
rename to spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
index f9b34ec7d9..d6e9a8b5e5 100644
--- a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml
@@ -3,10 +3,12 @@
4.0.0
disabling-console-log4j2
+
+
- com.baeldung
- disabling-console-logging
- 0.0.1-SNAPSHOT
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java b/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
rename to spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java b/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml b/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
rename to spring-boot-disable-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml
similarity index 61%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml
rename to spring-boot-disable-console-logging/disabling-console-logback/pom.xml
index 6f2170390b..f18066ea03 100644
--- a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/pom.xml
+++ b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml
@@ -2,8 +2,16 @@
4.0.0
com.baeldung
- disabling-console-logging
+ spring-boot-disable-console-logging
0.0.1-SNAPSHOT
disabling-console-logback
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
\ No newline at end of file
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java b/spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
rename to spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java b/spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
rename to spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties b/spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/application.properties
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/application.properties
rename to spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/application.properties
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml b/spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml
similarity index 100%
rename from spring-boot-logging-log4j2/disabling-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml
rename to spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml
diff --git a/spring-boot-logging-log4j2/disabling-console-logging/pom.xml b/spring-boot-disable-console-logging/pom.xml
similarity index 78%
rename from spring-boot-logging-log4j2/disabling-console-logging/pom.xml
rename to spring-boot-disable-console-logging/pom.xml
index 39a4a40f12..ec84372f99 100644
--- a/spring-boot-logging-log4j2/disabling-console-logging/pom.xml
+++ b/spring-boot-disable-console-logging/pom.xml
@@ -1,14 +1,15 @@
4.0.0
- disabling-console-logging
+ spring-boot-disable-console-logging
pom
Projects for Disabling Spring Boot Console Logging tutorials
+ parent-boot-2
com.baeldung
- spring-boot-logging-log4j2
0.0.1-SNAPSHOT
+ ../parent-boot-2
diff --git a/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java b/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java
new file mode 100644
index 0000000000..8d92e18754
--- /dev/null
+++ b/spring-boot-h2/spring-boot-h2-database/src/main/java/com/baeldung/h2db/auto/configuration/AutoConfigurationDemo.java
@@ -0,0 +1,14 @@
+package com.baeldung.h2db.auto.configuration;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+public class AutoConfigurationDemo {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AutoConfigurationDemo.class, args);
+ }
+
+}
diff --git a/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties b/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties
index 0591cc9e0f..5e425a3550 100644
--- a/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties
+++ b/spring-boot-h2/spring-boot-h2-database/src/main/resources/application.properties
@@ -4,4 +4,5 @@ spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create
spring.h2.console.enabled=true
-spring.h2.console.path=/h2-console
\ No newline at end of file
+spring.h2.console.path=/h2-console
+debug=true
\ No newline at end of file
diff --git a/spring-boot-logging-log4j2/README.md b/spring-boot-logging-log4j2/README.md
index 305957ed8d..7676bd1919 100644
--- a/spring-boot-logging-log4j2/README.md
+++ b/spring-boot-logging-log4j2/README.md
@@ -1,3 +1,2 @@
### Relevant Articles:
- [Logging in Spring Boot](http://www.baeldung.com/spring-boot-logging)
-- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging)
diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml
index 7caf1e8690..7220672eaf 100644
--- a/spring-boot-logging-log4j2/pom.xml
+++ b/spring-boot-logging-log4j2/pom.xml
@@ -4,41 +4,58 @@
4.0.0
spring-boot-logging-log4j2
- pom
- Projects for Spring Boot Logging tutorials
+ jar
+ Demo project for Spring Boot Logging with Log4J2
+
+
- parent-boot-2
- com.baeldung
- 0.0.1-SNAPSHOT
- ../parent-boot-2
+ spring-boot-starter-parent
+ org.springframework.boot
+ 2.0.5.RELEASE
org.springframework.boot
spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-logging
+
+
-
org.springframework.boot
spring-boot-starter-test
- test
+
+
+ org.springframework.boot
+ spring-boot-starter-log4j2
-
- spring-boot-logging-log4j2-app
- disabling-console-logging
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ 3
+ true
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+ **/*ManualTest.java
+ **/*LiveTest.java
+
+
+
+
-
+
+
+
+
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml b/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml
deleted file mode 100644
index 571794167e..0000000000
--- a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/pom.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- 4.0.0
-
- spring-boot-logging-log4j2-app
- jar
- Demo project for Spring Boot Logging with Log4J2
-
-
- spring-boot-logging-log4j2
- com.baeldung
- 0.0.1-SNAPSHOT
- ..
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.springframework.boot
- spring-boot-starter-log4j2
-
-
-
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/LoggingController.java b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java
similarity index 97%
rename from spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/LoggingController.java
rename to spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java
index 07763c8c3b..d462926616 100644
--- a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/LoggingController.java
+++ b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/LoggingController.java
@@ -32,6 +32,6 @@ public class LoggingController {
loggerNative.warn("This WARN message been printed by Log4j2 without passing through SLF4J");
loggerNative.error("This ERROR message been printed by Log4j2 without passing through SLF4J");
loggerNative.fatal("This FATAL message been printed by Log4j2 without passing through SLF4J");
- return "Howdy! Check out the Logs to see the output printed directly throguh Log4j2...";
+ return "Howdy! Check out the Logs to see the output printed directly through Log4j2...";
}
}
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java b/spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java
similarity index 100%
rename from spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java
rename to spring-boot-logging-log4j2/src/main/java/com/baeldung/springbootlogging/SpringBootLoggingApplication.java
diff --git a/spring-boot-logging-log4j2/src/main/resources/application.properties b/spring-boot-logging-log4j2/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/log4j2-spring.xml b/spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml
similarity index 100%
rename from spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/main/resources/log4j2-spring.xml
rename to spring-boot-logging-log4j2/src/main/resources/log4j2-spring.xml
diff --git a/spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextIntegrationTest.java
similarity index 100%
rename from spring-boot-logging-log4j2/spring-boot-logging-log4j2-app/src/test/java/org/baeldung/SpringContextIntegrationTest.java
rename to spring-boot-logging-log4j2/src/test/java/org/baeldung/SpringContextIntegrationTest.java
diff --git a/spring-boot/README.MD b/spring-boot/README.MD
index 192c4f9fed..aed2d2c5f8 100644
--- a/spring-boot/README.MD
+++ b/spring-boot/README.MD
@@ -34,3 +34,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey)
- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning)
- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
+- [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report)
diff --git a/spring-cloud-data-flow/etl/README.MD b/spring-cloud-data-flow/etl/README.MD
index 0cbb460b01..ee9c3a19c3 100644
--- a/spring-cloud-data-flow/etl/README.MD
+++ b/spring-cloud-data-flow/etl/README.MD
@@ -7,3 +7,7 @@ JDBC Source - Application Starter distributed by default
customer-transform - Custom application to transform the data
customer-mongodb-sink - Custom application to sink the data
+
+# Relevant Articles
+
+* [ETL with Spring Cloud Data Flow](https://www.baeldung.com/spring-cloud-data-flow-etl)
diff --git a/spring-cloud/README.md b/spring-cloud/README.md
index 805052e4db..16bc2d110a 100644
--- a/spring-cloud/README.md
+++ b/spring-cloud/README.md
@@ -28,3 +28,5 @@
- [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task)
- [Running Spring Boot Applications With Minikube](http://www.baeldung.com/spring-boot-minikube)
- [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration)
+- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault)
+- [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations)
diff --git a/spring-core/README.md b/spring-core/README.md
index c0577b4ebc..e5c359c11b 100644
--- a/spring-core/README.md
+++ b/spring-core/README.md
@@ -20,3 +20,5 @@
- [Controlling Bean Creation Order with @DependsOn Annotation](http://www.baeldung.com/spring-depends-on)
- [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics)
- [Spring Application Context Events](https://www.baeldung.com/spring-context-events)
+- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency)
+- [What is a Spring Bean?](https://www.baeldung.com/spring-bean)
diff --git a/spring-ejb/pom.xml b/spring-ejb/pom.xml
index 31cde720f9..055df9ea04 100755
--- a/spring-ejb/pom.xml
+++ b/spring-ejb/pom.xml
@@ -73,6 +73,7 @@
ejb-remote-for-spring
ejb-beans
+ spring-ejb-client
diff --git a/spring-ejb/spring-ejb-client/pom.xml b/spring-ejb/spring-ejb-client/pom.xml
index c935e1f14a..50337e8b21 100644
--- a/spring-ejb/spring-ejb-client/pom.xml
+++ b/spring-ejb/spring-ejb-client/pom.xml
@@ -10,11 +10,22 @@
Spring EJB Client
- com.baeldung
- parent-boot-2
- 0.0.1-SNAPSHOT
- ../../parent-boot-2
+ com.baeldung.spring.ejb
+ spring-ejb
+ 1.0.1
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.0.4.RELEASE
+ pom
+ import
+
+
+
@@ -54,6 +65,7 @@
org.springframework.boot
spring-boot-maven-plugin
+ 2.0.4.RELEASE
diff --git a/spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java b/spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
index f30af140af..aeec57d136 100644
--- a/spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
+++ b/spring-mockito/src/test/java/com/baeldung/app/rest/FlowerControllerUnitTest.java
@@ -1,17 +1,18 @@
package com.baeldung.app.rest;
-import com.baeldung.app.api.Flower;
-import com.baeldung.domain.service.FlowerService;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
-import org.mockito.runners.MockitoJUnitRunner;
+import org.mockito.junit.MockitoJUnitRunner;
-import static org.mockito.Matchers.anyInt;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.when;
+import com.baeldung.app.api.Flower;
+import com.baeldung.domain.service.FlowerService;
@RunWith(MockitoJUnitRunner.class)
public class FlowerControllerUnitTest {
diff --git a/spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java b/spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
index e303c85caf..15e91d86b5 100644
--- a/spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
+++ b/spring-mockito/src/test/java/com/baeldung/app/rest/MessageControllerUnitTest.java
@@ -1,18 +1,19 @@
package com.baeldung.app.rest;
+import static org.mockito.Mockito.times;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+
import com.baeldung.app.api.MessageApi;
import com.baeldung.domain.model.Message;
import com.baeldung.domain.service.MessageService;
import com.baeldung.domain.util.MessageMatcher;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Matchers;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import static org.mockito.Mockito.times;
@RunWith(MockitoJUnitRunner.class)
public class MessageControllerUnitTest {
@@ -37,6 +38,6 @@ public class MessageControllerUnitTest {
message.setTo("you");
message.setText("Hello, you!");
- Mockito.verify(messageService, times(1)).deliverMessage(Matchers.argThat(new MessageMatcher(message)));
+ Mockito.verify(messageService, times(1)).deliverMessage(ArgumentMatchers.argThat(new MessageMatcher(message)));
}
}
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMethodController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMethodController.java
new file mode 100644
index 0000000000..03cf729ddf
--- /dev/null
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestMethodController.java
@@ -0,0 +1,25 @@
+package com.baeldung.spring.controller;
+
+import com.baeldung.spring.domain.Employee;
+import com.baeldung.spring.exception.InvalidRequestException;
+import com.baeldung.spring.service.EmployeeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value="/api")
+public class RequestMethodController {
+
+ @Autowired
+ EmployeeService service;
+
+ @RequestMapping(value = "/employees", produces = "application/json", method={RequestMethod.GET,RequestMethod.POST})
+ public List findEmployees()
+ throws InvalidRequestException {
+ return service.getEmployeeList();
+ }
+}
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/exception/InvalidRequestException.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/exception/InvalidRequestException.java
new file mode 100644
index 0000000000..4dcbe86735
--- /dev/null
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/exception/InvalidRequestException.java
@@ -0,0 +1,26 @@
+package com.baeldung.spring.exception;
+
+public class InvalidRequestException extends RuntimeException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 4088649120307193208L;
+
+ public InvalidRequestException() {
+ super();
+ }
+
+ public InvalidRequestException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public InvalidRequestException(final String message) {
+ super(message);
+ }
+
+ public InvalidRequestException(final Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeService.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeService.java
new file mode 100644
index 0000000000..4d87352c42
--- /dev/null
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeService.java
@@ -0,0 +1,12 @@
+package com.baeldung.spring.service;
+
+import com.baeldung.spring.domain.Employee;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface EmployeeService {
+
+ List getEmployeeList();
+}
diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeServiceImpl.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeServiceImpl.java
new file mode 100644
index 0000000000..18f2d70795
--- /dev/null
+++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/service/EmployeeServiceImpl.java
@@ -0,0 +1,27 @@
+package com.baeldung.spring.service;
+
+import com.baeldung.spring.domain.Employee;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class EmployeeServiceImpl implements EmployeeService{
+
+ @Override
+ public List getEmployeeList() {
+ List employeeList = new ArrayList<>();
+ employeeList.add(createEmployee(100L, "Steve Martin", "333-777-999"));
+ employeeList.add(createEmployee(200L, "Adam Schawn", "444-111-777"));
+ return employeeList;
+ }
+
+ private Employee createEmployee(long id, String name, String contactNumber) {
+ Employee employee = new Employee();
+ employee.setId(id);
+ employee.setName(name);
+ employee.setContactNumber(contactNumber);
+ return employee;
+ }
+}
diff --git a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
index bf26eb3292..e8cb218258 100644
--- a/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
+++ b/spring-rest-simple/src/main/java/org/baeldung/web/controller/FooController.java
@@ -5,13 +5,9 @@ import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
import org.baeldung.web.dto.Foo;
import org.baeldung.web.dto.FooProtos;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.*;
@Controller
public class FooController {
@@ -47,7 +43,7 @@ public class FooController {
}
@RequestMapping(method = RequestMethod.POST, value = "/foos/new")
- @ResponseStatus(HttpStatus.OK)
+ @ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public Foo createFoo(@RequestBody final Foo foo) {
return foo;
@@ -60,4 +56,11 @@ public class FooController {
return id;
}
+ @RequestMapping(method = RequestMethod.POST, value = "/foos/form")
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public String submitFoo(@RequestParam("id") String id) {
+ return id;
+ }
+
}
diff --git a/spring-rest/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java b/spring-rest/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
index a84f866dfe..814efc112a 100644
--- a/spring-rest/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
+++ b/spring-rest/src/test/java/com/baeldung/propertyeditor/creditcard/CreditCardEditorUnitTest.java
@@ -4,10 +4,7 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import com.baeldung.propertyeditor.creditcard.CreditCard;
-import com.baeldung.propertyeditor.creditcard.CreditCardEditor;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class CreditCardEditorUnitTest {
diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/service/BarConsumerService.java b/spring-resttemplate/src/main/java/org/baeldung/web/service/BarConsumerService.java
index 4188677b4f..0bf24bd480 100644
--- a/spring-resttemplate/src/main/java/org/baeldung/web/service/BarConsumerService.java
+++ b/spring-resttemplate/src/main/java/org/baeldung/web/service/BarConsumerService.java
@@ -14,7 +14,7 @@ public class BarConsumerService {
@Autowired
public BarConsumerService(RestTemplateBuilder restTemplateBuilder) {
- RestTemplate restTemplate = restTemplateBuilder
+ restTemplate = restTemplateBuilder
.errorHandler(new RestTemplateResponseErrorHandler())
.build();
}
diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
index 7bcaab6a07..143aa079d5 100644
--- a/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
+++ b/spring-resttemplate/src/test/java/org/baeldung/client/RestTemplateBasicLiveTest.java
@@ -26,6 +26,8 @@ import org.springframework.http.ResponseEntity;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.RestTemplate;
@@ -213,7 +215,23 @@ public class RestTemplateBasicLiveTest {
}
}
- //
+ @Test
+ public void givenFooService_whenFormSubmit_thenResourceIsCreated() {
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+ MultiValueMap map= new LinkedMultiValueMap<>();
+ map.add("id", "1");
+
+ HttpEntity> request = new HttpEntity<>(map, headers);
+
+ ResponseEntity response = restTemplate.postForEntity( fooResourceUrl+"/form", request , String.class);
+
+ assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
+ final String fooResponse = response.getBody();
+ assertThat(fooResponse, notNullValue());
+ assertThat(fooResponse, is("1"));
+ }
private HttpHeaders prepareBasicAuthHeaders() {
final HttpHeaders headers = new HttpHeaders();
diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.MD
index 6bd9b9295c..6f01bfdc65 100644
--- a/spring-security-mvc-boot/README.MD
+++ b/spring-security-mvc-boot/README.MD
@@ -11,3 +11,4 @@ The "REST With Spring" Classes: http://github.learnspringsecurity.com
- [Granted Authority Versus Role in Spring Security](http://www.baeldung.com/spring-security-granted-authority-vs-role)
- [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security)
- [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range)
+- [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters)
diff --git a/spring-security-rest/pom.xml b/spring-security-rest/pom.xml
index 57ce5ddb92..ef16f2201b 100644
--- a/spring-security-rest/pom.xml
+++ b/spring-security-rest/pom.xml
@@ -2,7 +2,6 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.baeldung
spring-security-rest
0.1-SNAPSHOT
spring-security-rest
@@ -10,9 +9,9 @@
com.baeldung
- parent-spring-4
+ parent-spring-5
0.0.1-SNAPSHOT
- ../parent-spring-4
+ ../parent-spring-5
@@ -195,13 +194,6 @@
-
-
- org.apache.maven.plugins
- maven-war-plugin
- ${maven-war-plugin.version}
-
-
org.codehaus.cargo
cargo-maven2-plugin
@@ -282,17 +274,17 @@
- 4.2.6.RELEASE
- 0.21.0.RELEASE
+ 5.1.0.RELEASE
+ 0.25.0.RELEASE
3.1.0
1.1.0.Final
1.2
- 2.8.5
+ 2.9.2
- 19.0
+ 26.0-jre
3.5
1.3.2
@@ -303,8 +295,6 @@
2.9.2
- 2.6
1.6.1
-
diff --git a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java b/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java
index 1941e2aa51..05a7c7b9a0 100644
--- a/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java
+++ b/spring-security-rest/src/main/java/org/baeldung/persistence/model/Foo.java
@@ -6,6 +6,8 @@ import javax.validation.constraints.Size;
public class Foo implements Serializable {
+ private static final long serialVersionUID = -5422285893276747592L;
+
private long id;
@Size(min = 5, max = 14)
diff --git a/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
index f4b8e7f5ac..6018264632 100644
--- a/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
+++ b/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java
@@ -11,8 +11,10 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationSu
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
+import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
+@Component
public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
private RequestCache requestCache = new HttpSessionRequestCache();
@@ -33,11 +35,6 @@ public class MySavedRequestAwareAuthenticationSuccessHandler extends SimpleUrlAu
}
clearAuthenticationAttributes(request);
-
- // Use the DefaultSavedRequest URL
- // final String targetUrl = savedRequest.getRedirectUrl();
- // logger.debug("Redirecting to DefaultSavedRequest Url: " + targetUrl);
- // getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
public void setRequestCache(final RequestCache requestCache) {
diff --git a/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java
index 77aa32ff97..e448e6537f 100644
--- a/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java
+++ b/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java
@@ -16,7 +16,11 @@ import org.springframework.stereotype.Component;
public final class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
- public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException {
+ public void commence(
+ final HttpServletRequest request,
+ final HttpServletResponse response,
+ final AuthenticationException authException) throws IOException {
+
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java b/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java
index 601ba66330..8e20358a5a 100644
--- a/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java
+++ b/spring-security-rest/src/main/java/org/baeldung/spring/ClientWebConfig.java
@@ -2,16 +2,9 @@ package org.baeldung.spring;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebMvc
@Configuration
-public class ClientWebConfig extends WebMvcConfigurerAdapter {
-
- public ClientWebConfig() {
- super();
- }
-
- // API
-
+public class ClientWebConfig implements WebMvcConfigurer {
}
\ No newline at end of file
diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java b/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java
index c3e738297a..cc023110b6 100644
--- a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java
+++ b/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java
@@ -1,6 +1,7 @@
package org.baeldung.spring;
import org.baeldung.security.MySavedRequestAwareAuthenticationSuccessHandler;
+import org.baeldung.security.RestAuthenticationEntryPoint;
import org.baeldung.web.error.CustomAccessDeniedHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
@@ -12,6 +13,8 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
@Configuration
@@ -23,56 +26,55 @@ public class SecurityJavaConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAccessDeniedHandler accessDeniedHandler;
- // @Autowired
- // private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
+ @Autowired
+ private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
- // @Autowired
- // private MySavedRequestAwareAuthenticationSuccessHandler authenticationSuccessHandler;
+ @Autowired
+ private MySavedRequestAwareAuthenticationSuccessHandler mySuccessHandler;
+
+ private SimpleUrlAuthenticationFailureHandler myFailureHandler = new SimpleUrlAuthenticationFailureHandler();
public SecurityJavaConfig() {
super();
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
- //
-
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
- auth.inMemoryAuthentication().withUser("temporary").password("temporary").roles("ADMIN").and().withUser("user").password("userPass").roles("USER");
+ auth.inMemoryAuthentication()
+ .withUser("admin").password(encoder().encode("adminPass")).roles("ADMIN")
+ .and()
+ .withUser("user").password(encoder().encode("userPass")).roles("USER");
}
@Override
- protected void configure(final HttpSecurity http) throws Exception {// @formatter:off
- http
- .csrf().disable()
- .authorizeRequests()
- .and()
- .exceptionHandling().accessDeniedHandler(accessDeniedHandler)
- // .authenticationEntryPoint(restAuthenticationEntryPoint)
- .and()
- .authorizeRequests()
- .antMatchers("/api/csrfAttacker*").permitAll()
- .antMatchers("/api/customer/**").permitAll()
- .antMatchers("/api/foos/**").authenticated()
- .antMatchers("/api/async/**").permitAll()
- .antMatchers("/api/admin/**").hasRole("ADMIN")
- .and()
- .httpBasic()
-// .and()
-// .successHandler(authenticationSuccessHandler)
-// .failureHandler(new SimpleUrlAuthenticationFailureHandler())
- .and()
- .logout();
- } // @formatter:on
-
- @Bean
- public MySavedRequestAwareAuthenticationSuccessHandler mySuccessHandler() {
- return new MySavedRequestAwareAuthenticationSuccessHandler();
+ protected void configure(final HttpSecurity http) throws Exception {
+ http.csrf().disable()
+ .authorizeRequests()
+ .and()
+ .exceptionHandling()
+ .accessDeniedHandler(accessDeniedHandler)
+ .authenticationEntryPoint(restAuthenticationEntryPoint)
+ .and()
+ .authorizeRequests()
+ .antMatchers("/api/csrfAttacker*").permitAll()
+ .antMatchers("/api/customer/**").permitAll()
+ .antMatchers("/api/foos/**").authenticated()
+ .antMatchers("/api/async/**").permitAll()
+ .antMatchers("/api/admin/**").hasRole("ADMIN")
+ .and()
+ .formLogin()
+ .successHandler(mySuccessHandler)
+ .failureHandler(myFailureHandler)
+ .and()
+ .httpBasic()
+ .and()
+ .logout();
}
-
+
@Bean
- public SimpleUrlAuthenticationFailureHandler myFailureHandler() {
- return new SimpleUrlAuthenticationFailureHandler();
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder();
}
}
\ No newline at end of file
diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java b/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java
index bcf6657eee..aa00e8455e 100644
--- a/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java
+++ b/spring-security-rest/src/main/java/org/baeldung/spring/SwaggerConfig.java
@@ -24,8 +24,19 @@ public class SwaggerConfig {
@Bean
public Docket api() {
- return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.basePackage("org.baeldung.web.controller")).paths(PathSelectors.ant("/foos/*")).build().apiInfo(apiInfo()).useDefaultResponseMessages(false)
- .globalResponseMessage(RequestMethod.GET, newArrayList(new ResponseMessageBuilder().code(500).message("500 message").responseModel(new ModelRef("Error")).build(), new ResponseMessageBuilder().code(403).message("Forbidden!!!!!").build()));
+ return new Docket(DocumentationType.SWAGGER_2).select()
+ .apis(RequestHandlerSelectors.basePackage("org.baeldung.web.controller"))
+ .paths(PathSelectors.ant("/foos/*"))
+ .build()
+ .apiInfo(apiInfo())
+ .useDefaultResponseMessages(false)
+ .globalResponseMessage(RequestMethod.GET, newArrayList(new ResponseMessageBuilder().code(500)
+ .message("500 message")
+ .responseModel(new ModelRef("Error"))
+ .build(),
+ new ResponseMessageBuilder().code(403)
+ .message("Forbidden!!!!!")
+ .build()));
}
private ApiInfo apiInfo() {
diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java b/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java
index 92a3c548a2..dba07dc4e5 100644
--- a/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java
+++ b/spring-security-rest/src/main/java/org/baeldung/spring/WebConfig.java
@@ -8,18 +8,14 @@ import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@ComponentScan("org.baeldung.web")
@EnableWebMvc
@EnableAsync
-public class WebConfig extends WebMvcConfigurerAdapter {
-
- public WebConfig() {
- super();
- }
+public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
@@ -38,7 +34,6 @@ public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
- super.addViewControllers(registry);
registry.addViewController("/csrfAttacker.html");
}
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java
index 456eeaaeac..f6f1c392cb 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java
+++ b/spring-security-rest/src/main/java/org/baeldung/web/controller/AsyncController.java
@@ -24,9 +24,9 @@ public class AsyncController {
@RequestMapping(method = RequestMethod.GET, value = "/async")
@ResponseBody
public Object standardProcessing() throws Exception {
- log.info("Outside the @Async logic - before the async call: " + SecurityContextHolder.getContext().getAuthentication().getPrincipal());
+ log.info("Outside the @Async logic - before the async call: {}", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
asyncService.asyncCall();
- log.info("Inside the @Async logic - after the async call: " + SecurityContextHolder.getContext().getAuthentication().getPrincipal());
+ log.info("Inside the @Async logic - after the async call: {}", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
return SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java b/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java
index b8f67960f5..e1db105d18 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java
+++ b/spring-security-rest/src/main/java/org/baeldung/web/controller/CustomerController.java
@@ -48,7 +48,7 @@ public class CustomerController {
}
Link link =linkTo(methodOn(CustomerController.class).getOrdersForCustomer(customerId)).withSelfRel();
- Resources result = new Resources(orders,link);
+ Resources result = new Resources<>(orders,link);
return result;
}
@@ -67,7 +67,7 @@ public class CustomerController {
}
Link link =linkTo(CustomerController.class).withSelfRel();
- Resources result = new Resources(allCustomers,link);
+ Resources result = new Resources<>(allCustomers,link);
return result;
}
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java b/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java
index 3b9e5d25c0..f914f82215 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java
+++ b/spring-security-rest/src/main/java/org/baeldung/web/controller/FooController.java
@@ -7,8 +7,6 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.baeldung.persistence.model.Foo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
@@ -25,17 +23,9 @@ import com.google.common.collect.Lists;
@RequestMapping(value = "/foos")
public class FooController {
- @Autowired
- private ApplicationEventPublisher eventPublisher;
-
- public FooController() {
- super();
- }
-
// API
// read - single
-
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public Foo findById(@PathVariable("id") final Long id, final UriComponentsBuilder uriBuilder, final HttpServletResponse response) {
@@ -43,7 +33,6 @@ public class FooController {
}
// read - multiple
-
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public List findAll() {
diff --git a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java
index caaaa8e0dc..d6d7f53dd7 100644
--- a/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java
+++ b/spring-security-rest/src/main/java/org/baeldung/web/service/AsyncServiceImpl.java
@@ -17,18 +17,18 @@ public class AsyncServiceImpl implements AsyncService {
@Async
@Override
public void asyncCall() {
- log.info("Inside the @Async logic: " + SecurityContextHolder.getContext().getAuthentication().getPrincipal());
+ log.info("Inside the @Async logic: {}", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
}
@Override
public Callable checkIfPrincipalPropagated() {
Object before = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- log.info("Before new thread: " + before);
+ log.info("Before new thread: {}", before);
return new Callable() {
public Boolean call() throws Exception {
Object after = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- log.info("New thread: " + after);
+ log.info("New thread: {}", after);
return before == after;
}
};
diff --git a/spring-security-rest/src/main/resources/webSecurityConfig.xml b/spring-security-rest/src/main/resources/webSecurityConfig.xml
index 4bb208a195..edd3cba39c 100644
--- a/spring-security-rest/src/main/resources/webSecurityConfig.xml
+++ b/spring-security-rest/src/main/resources/webSecurityConfig.xml
@@ -5,10 +5,12 @@
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-4.2.xsd
+ http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+
+
@@ -44,5 +46,5 @@
-
+-->
\ No newline at end of file
diff --git a/spring-security-rest/src/main/webapp/WEB-INF/api-servlet.xml b/spring-security-rest/src/main/webapp/WEB-INF/api-servlet.xml
index 5a68371f6c..89be8a5285 100644
--- a/spring-security-rest/src/main/webapp/WEB-INF/api-servlet.xml
+++ b/spring-security-rest/src/main/webapp/WEB-INF/api-servlet.xml
@@ -1,7 +1,7 @@
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md
index 836848282b..1fbd7a4a5e 100644
--- a/testing-modules/junit-5/README.md
+++ b/testing-modules/junit-5/README.md
@@ -15,3 +15,4 @@
- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order)
- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java)
- [Testing an Abstract Class With JUnit](https://www.baeldung.com/junit-test-abstract-class)
+- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng)
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/Calculator.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java
similarity index 85%
rename from core-java/src/main/java/com/baeldung/throwsexception/Calculator.java
rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java
index 50dbc9c774..4ff303c031 100644
--- a/core-java/src/main/java/com/baeldung/throwsexception/Calculator.java
+++ b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.junit5vstestng;
public class Calculator {
diff --git a/core-java/src/main/java/com/baeldung/throwsexception/DivideByZeroException.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java
similarity index 79%
rename from core-java/src/main/java/com/baeldung/throwsexception/DivideByZeroException.java
rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java
index 4413374c99..4523f46590 100644
--- a/core-java/src/main/java/com/baeldung/throwsexception/DivideByZeroException.java
+++ b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.junit5vstestng;
public class DivideByZeroException extends RuntimeException {
diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/throwsexception/CalculatorUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java
similarity index 90%
rename from core-java/src/test/java/com/baeldung/throwsexception/CalculatorUnitTest.java
rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java
index ef838ed304..c563b01603 100644
--- a/core-java/src/test/java/com/baeldung/throwsexception/CalculatorUnitTest.java
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.junit5vstestng;
import org.junit.Test;
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java
new file mode 100644
index 0000000000..09c2b9108b
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.junit5vstestng;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.Test;
+
+
+public class Class1UnitTest {
+
+ @Test
+ public void testCase_InClass1UnitTest() {
+ assertTrue(true);
+ }
+
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java
new file mode 100644
index 0000000000..184ecafa1b
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java
@@ -0,0 +1,14 @@
+package com.baeldung.junit5vstestng;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.Test;
+
+public class Class2UnitTest {
+
+ @Test
+ public void testCase_InClass2UnitTest() {
+ assertTrue(true);
+ }
+
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java
new file mode 100644
index 0000000000..9cf03ad3de
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.junit5vstestng;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class CustomNameUnitTest {
+
+ @ParameterizedTest
+ @ValueSource(strings = { "Hello", "World" })
+ @DisplayName("Test Method to check that the inputs are not nullable")
+ void givenString_TestNullOrNot(String word) {
+ assertNotNull(word);
+ }
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java
new file mode 100644
index 0000000000..b5560650c4
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java
@@ -0,0 +1,45 @@
+package com.baeldung.junit5vstestng;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.EnumSet;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class ParameterizedUnitTest {
+
+ @ParameterizedTest
+ @ValueSource(strings = { "Hello", "World" })
+ void givenString_TestNullOrNot(String word) {
+ assertNotNull(word);
+ }
+
+ @ParameterizedTest
+ @EnumSource(value = PizzaDeliveryStrategy.class, names = {"EXPRESS", "NORMAL"})
+ void givenEnum_TestContainsOrNot(PizzaDeliveryStrategy timeUnit) {
+ assertTrue(EnumSet.of(PizzaDeliveryStrategy.EXPRESS, PizzaDeliveryStrategy.NORMAL).contains(timeUnit));
+ }
+
+ @ParameterizedTest
+ @MethodSource("wordDataProvider")
+ void givenMethodSource_TestInputStream(String argument) {
+ assertNotNull(argument);
+ }
+
+ static Stream wordDataProvider() {
+ return Stream.of("foo", "bar");
+ }
+
+ @ParameterizedTest
+ @CsvSource({ "1, Car", "2, House", "3, Train" })
+ void givenCSVSource_TestContent(int id, String word) {
+ assertNotNull(id);
+ assertNotNull(word);
+ }
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java
new file mode 100644
index 0000000000..7f0a0ffa20
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java
@@ -0,0 +1,6 @@
+package com.baeldung.junit5vstestng;
+
+public enum PizzaDeliveryStrategy {
+ EXPRESS,
+ NORMAL;
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java
new file mode 100644
index 0000000000..7b4bd746bf
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java
@@ -0,0 +1,11 @@
+package com.baeldung.junit5vstestng;
+
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.platform.suite.api.SelectClasses;
+import org.junit.runner.RunWith;
+
+@RunWith(JUnitPlatform.class)
+@SelectClasses({Class1UnitTest.class, Class2UnitTest.class})
+public class SelectClassesSuiteUnitTest {
+
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java
new file mode 100644
index 0000000000..8f2eb2b5c5
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java
@@ -0,0 +1,11 @@
+package com.baeldung.junit5vstestng;
+
+import org.junit.platform.runner.JUnitPlatform;
+import org.junit.platform.suite.api.SelectPackages;
+import org.junit.runner.RunWith;
+
+@RunWith(JUnitPlatform.class)
+@SelectPackages({ "org.baeldung.java.suite.childpackage1", "org.baeldung.java.suite.childpackage2" })
+public class SelectPackagesSuiteUnitTest {
+
+}
diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java
new file mode 100644
index 0000000000..a8c02e9968
--- /dev/null
+++ b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.junit5vstestng;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class SummationServiceUnitTest {
+ private static List numbers;
+
+ @BeforeAll
+ public static void initialize() {
+ numbers = new ArrayList<>();
+ }
+
+ @AfterAll
+ public static void tearDown() {
+ numbers = null;
+ }
+
+ @BeforeEach
+ public void runBeforeEachTest() {
+ numbers.add(1);
+ numbers.add(2);
+ numbers.add(3);
+ }
+
+ @AfterEach
+ public void runAfterEachTest() {
+ numbers.clear();
+ }
+
+ @Test
+ public void givenNumbers_sumEquals_thenCorrect() {
+ int sum = numbers.stream()
+ .reduce(0, Integer::sum);
+ Assert.assertEquals(6, sum);
+ }
+
+ @Ignore
+ @Test
+ public void givenEmptyList_sumEqualsZero_thenCorrect() {
+ int sum = numbers.stream()
+ .reduce(0, Integer::sum);
+ Assert.assertEquals(6, sum);
+ }
+}
diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java
index 3824de619c..c41021f7b6 100644
--- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java
+++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java
@@ -1,6 +1,6 @@
package org.baeldung.mockito;
-public class FinalList extends MyList {
+public final class FinalList extends MyList {
@Override
public int size() {
diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java
index 206e0f4daf..118d50ea40 100644
--- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java
+++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java
@@ -1,15 +1,15 @@
package org.baeldung.mockito;
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.Spy;
-import org.mockito.runners.MockitoJUnitRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
+import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MockitoSpyIntegrationTest {
diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java
index 49360f8d6c..b020338fd9 100644
--- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java
+++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java
@@ -1,14 +1,22 @@
package org.baeldung.mockito;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.isA;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import static org.junit.Assert.assertEquals;
-
-import static org.mockito.Mockito.*;
import org.mockito.ArgumentCaptor;
-import static org.mockito.Matchers.any;
+import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
-import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class MockitoVoidMethodsUnitTest {
diff --git a/testing-modules/spring-testing/README.md b/testing-modules/spring-testing/README.md
index aed330d260..e22c3e84e7 100644
--- a/testing-modules/spring-testing/README.md
+++ b/testing-modules/spring-testing/README.md
@@ -1,3 +1,4 @@
### Relevant Articles:
-* [Mockito.mock() vs @Mock vs @MockBean](http://www.baeldung.com/java-spring-mockito-mock-mockbean)
+- [Mockito.mock() vs @Mock vs @MockBean](http://www.baeldung.com/java-spring-mockito-mock-mockbean)
+- [A Quick Guide to @TestPropertySource](https://www.baeldung.com/spring-test-property-source)