diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
index d17f93e6e0..98a7f33474 100644
--- a/algorithms-miscellaneous-5/pom.xml
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -17,6 +17,11 @@
commons-codec
${commons-codec.version}
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
org.projectlombok
lombok
@@ -28,6 +33,7 @@
tradukisto
${tradukisto.version}
+
org.assertj
assertj-core
@@ -52,6 +58,7 @@
1.0.1
3.9.0
1.11
+ 3.6.1
\ No newline at end of file
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
new file mode 100644
index 0000000000..5ee913d251
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
@@ -0,0 +1,83 @@
+package com.baeldung.algorithms.caesarcipher;
+
+import org.apache.commons.math3.stat.inference.ChiSquareTest;
+
+import java.util.Arrays;
+import java.util.stream.IntStream;
+
+public class CaesarCipher {
+ private static final char LETTER_A = 'a';
+ private static final char LETTER_Z = 'z';
+ private static final int ALPHABET_SIZE = LETTER_Z - LETTER_A + 1;
+ private static final double[] ENGLISH_LETTERS_PROBABILITIES = {0.073, 0.009, 0.030, 0.044, 0.130, 0.028, 0.016, 0.035, 0.074, 0.002, 0.003, 0.035, 0.025, 0.078, 0.074, 0.027, 0.003, 0.077, 0.063, 0.093, 0.027, 0.013, 0.016, 0.005, 0.019, 0.001};
+
+ public String cipher(String message, int offset) {
+ StringBuilder result = new StringBuilder();
+
+ for (char character : message.toCharArray()) {
+ if (character != ' ') {
+ int originalAlphabetPosition = character - LETTER_A;
+ int newAlphabetPosition = (originalAlphabetPosition + offset) % ALPHABET_SIZE;
+ char newCharacter = (char) (LETTER_A + newAlphabetPosition);
+ result.append(newCharacter);
+ } else {
+ result.append(character);
+ }
+ }
+
+ return result.toString();
+ }
+
+ public String decipher(String message, int offset) {
+ return cipher(message, ALPHABET_SIZE - (offset % ALPHABET_SIZE));
+ }
+
+ public int breakCipher(String message) {
+ return probableOffset(chiSquares(message));
+ }
+
+ private double[] chiSquares(String message) {
+ double[] expectedLettersFrequencies = expectedLettersFrequencies(message.length());
+
+ double[] chiSquares = new double[ALPHABET_SIZE];
+
+ for (int offset = 0; offset < chiSquares.length; offset++) {
+ String decipheredMessage = decipher(message, offset);
+ long[] lettersFrequencies = observedLettersFrequencies(decipheredMessage);
+ double chiSquare = new ChiSquareTest().chiSquare(expectedLettersFrequencies, lettersFrequencies);
+ chiSquares[offset] = chiSquare;
+ }
+
+ return chiSquares;
+ }
+
+ private long[] observedLettersFrequencies(String message) {
+ return IntStream.rangeClosed(LETTER_A, LETTER_Z)
+ .mapToLong(letter -> countLetter((char) letter, message))
+ .toArray();
+ }
+
+ private long countLetter(char letter, String message) {
+ return message.chars()
+ .filter(character -> character == letter)
+ .count();
+ }
+
+ private double[] expectedLettersFrequencies(int messageLength) {
+ return Arrays.stream(ENGLISH_LETTERS_PROBABILITIES)
+ .map(probability -> probability * messageLength)
+ .toArray();
+ }
+
+ private int probableOffset(double[] chiSquares) {
+ int probableOffset = 0;
+ for (int offset = 0; offset < chiSquares.length; offset++) {
+ System.out.println(String.format("Chi-Square for offset %d: %.2f", offset, chiSquares[offset]));
+ if (chiSquares[offset] < chiSquares[probableOffset]) {
+ probableOffset = offset;
+ }
+ }
+
+ return probableOffset;
+ }
+}
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
new file mode 100644
index 0000000000..c3a22a8978
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/caesarcipher/CaesarCipherUnitTest.java
@@ -0,0 +1,83 @@
+package com.baeldung.algorithms.caesarcipher;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class CaesarCipherUnitTest {
+ private static final String SENTENCE = "he told me i could never teach a llama to drive";
+ private static final String SENTENCE_SHIFTED_THREE = "kh wrog ph l frxog qhyhu whdfk d oodpd wr gulyh";
+ private static final String SENTENCE_SHIFTED_TEN = "ro dyvn wo s myevn xofob dokmr k vvkwk dy nbsfo";
+
+ private CaesarCipher algorithm = new CaesarCipher();
+
+ @Test
+ void givenSentenceAndShiftThree_whenCipher_thenCipheredMessageWithoutOverflow() {
+ String cipheredSentence = algorithm.cipher(SENTENCE, 3);
+
+ assertThat(cipheredSentence)
+ .isEqualTo(SENTENCE_SHIFTED_THREE);
+ }
+
+ @Test
+ void givenSentenceAndShiftTen_whenCipher_thenCipheredMessageWithOverflow() {
+ String cipheredSentence = algorithm.cipher(SENTENCE, 10);
+
+ assertThat(cipheredSentence)
+ .isEqualTo(SENTENCE_SHIFTED_TEN);
+ }
+
+ @Test
+ void givenSentenceAndShiftThirtySix_whenCipher_thenCipheredLikeTenMessageWithOverflow() {
+ String cipheredSentence = algorithm.cipher(SENTENCE, 36);
+
+ assertThat(cipheredSentence)
+ .isEqualTo(SENTENCE_SHIFTED_TEN);
+ }
+
+ @Test
+ void givenSentenceShiftedThreeAndShiftThree_whenDecipher_thenOriginalSentenceWithoutOverflow() {
+ String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_THREE, 3);
+
+ assertThat(decipheredSentence)
+ .isEqualTo(SENTENCE);
+ }
+
+ @Test
+ void givenSentenceShiftedTenAndShiftTen_whenDecipher_thenOriginalSentenceWithOverflow() {
+ String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_TEN, 10);
+
+ assertThat(decipheredSentence)
+ .isEqualTo(SENTENCE);
+ }
+
+ @Test
+ void givenSentenceShiftedTenAndShiftThirtySix_whenDecipher_thenOriginalSentenceWithOverflow() {
+ String decipheredSentence = algorithm.decipher(SENTENCE_SHIFTED_TEN, 36);
+
+ assertThat(decipheredSentence)
+ .isEqualTo(SENTENCE);
+ }
+
+ @Test
+ void givenSentenceShiftedThree_whenBreakCipher_thenOriginalSentence() {
+ int offset = algorithm.breakCipher(SENTENCE_SHIFTED_THREE);
+
+ assertThat(offset)
+ .isEqualTo(3);
+
+ assertThat(algorithm.decipher(SENTENCE_SHIFTED_THREE, offset))
+ .isEqualTo(SENTENCE);
+ }
+
+ @Test
+ void givenSentenceShiftedTen_whenBreakCipher_thenOriginalSentence() {
+ int offset = algorithm.breakCipher(SENTENCE_SHIFTED_TEN);
+
+ assertThat(offset)
+ .isEqualTo(10);
+
+ assertThat(algorithm.decipher(SENTENCE_SHIFTED_TEN, offset))
+ .isEqualTo(SENTENCE);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
index 6b49558f1b..e13c53bfbb 100644
--- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
+++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
@@ -7,15 +7,9 @@ import org.junit.Test;
import com.baeldung.datetime.sql.TimeUtils;
import java.text.ParseException;
-import java.util.Date;
public class TimeUtilsUnitTest {
- @Test
- public void givenCurrentTime_thenNowIsReturned() {
- assertEquals(TimeUtils.getNow(), new Date());
- }
-
@Test(expected = IllegalArgumentException.class)
public void givenTimeAsString_whenPatternIsNotRespected_thenExceptionIsThrown() {
TimeUtils.getTime("10 11 12");
diff --git a/core-java-modules/core-java-io-2/.gitignore b/core-java-modules/core-java-io-2/.gitignore
index de044ef20f..c61d35324d 100644
--- a/core-java-modules/core-java-io-2/.gitignore
+++ b/core-java-modules/core-java-io-2/.gitignore
@@ -1,3 +1,5 @@
-# Intellij
-.idea/
-*.iml
+0.*
+
+# Files generated by integration tests
+# *.txt
+/temp
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-2/README.md b/core-java-modules/core-java-io-2/README.md
index d8e2ebabac..3251d2153e 100644
--- a/core-java-modules/core-java-io-2/README.md
+++ b/core-java-modules/core-java-io-2/README.md
@@ -1,4 +1,15 @@
+## Core Java IO
-### Relevant Articles:
+This module contains articles about core Java input and output (IO)
+### Relevant Articles:
- [Create a File in a Specific Directory in Java](https://www.baeldung.com/java-create-file-in-directory)
+- [How to Read a Large File Efficiently with Java](https://www.baeldung.com/java-read-lines-large-file)
+- [Java – Write to File](https://www.baeldung.com/java-write-to-file)
+- [FileNotFoundException in Java](https://www.baeldung.com/java-filenotfound-exception)
+- [Delete the Contents of a File in Java](https://www.baeldung.com/java-delete-file-contents)
+- [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files)
+- [Java – Append Data to a File](https://www.baeldung.com/java-append-to-file)
+- [How to Copy a File with Java](https://www.baeldung.com/java-copy-file)
+- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
+- [[<-- Prev]](/core-java-modules/core-java-io)
diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml
index 64d9434beb..dd0f8931c3 100644
--- a/core-java-modules/core-java-io-2/pom.xml
+++ b/core-java-modules/core-java-io-2/pom.xml
@@ -16,57 +16,16 @@
- net.sourceforge.collections
- collections-generic
- ${collections-generic.version}
-
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
+ com.google.guava
+ guava
+ ${guava.version}
+
commons-io
commons-io
${commons-io.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
-
- org.decimal4j
- decimal4j
- ${decimal4j.version}
-
-
- org.bouncycastle
- bcprov-jdk15on
- ${bouncycastle.version}
-
-
- org.unix4j
- unix4j-command
- ${unix4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
log4j
@@ -78,12 +37,6 @@
log4j-over-slf4j
${org.slf4j.version}
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
@@ -91,86 +44,6 @@
${assertj.version}
test
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
-
- org.javamoney
- moneta
- ${moneta.version}
-
-
- org.owasp.esapi
- esapi
- ${esapi.version}
-
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator-annprocess.version}
-
-
- org.hsqldb
- hsqldb
- ${hsqldb.version}
- runtime
-
-
-
- org.asynchttpclient
- async-http-client
- ${async-http-client.version}
-
-
- com.opencsv
- opencsv
- ${opencsv.version}
- test
-
-
-
- org.apache.tika
- tika-core
- ${tika.version}
-
-
- net.sf.jmimemagic
- jmimemagic
- ${jmime-magic.version}
-
@@ -182,22 +55,6 @@
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
- java
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
- -Xmx300m
- -XX:+UseParallelGC
- -classpath
-
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
-
-
org.apache.maven.plugins
maven-javadoc-plugin
@@ -210,70 +67,9 @@
-
-
- integration
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
-
-
-
- run-benchmarks
-
- none
-
- exec
-
-
- test
- java
-
- -classpath
-
- org.openjdk.jmh.Main
- .*
-
-
-
-
-
-
-
-
-
-
-
-
- 1.55
- 1.10
- 3.6.1
- 1.0.3
- 4.1
- 4.01
- 0.4
- 1.8.7
- 4.6-b01
- 1.13
- 0.6.5
- 0.9.0
- 4.1
-
3.6.1
- 1.7.0
-
-
3.0.0-M1
- 2.4.0
- 2.1.0.1
- 1.19
- 2.4.5
-
- 1.18
- 0.1.5
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/ListFiles.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/listfiles/ListFiles.java
similarity index 98%
rename from core-java-modules/core-java-io/src/main/java/com/baeldung/files/ListFiles.java
rename to core-java-modules/core-java-io-2/src/main/java/com/baeldung/listfiles/ListFiles.java
index c5de36270c..2275128dfe 100644
--- a/core-java-modules/core-java-io/src/main/java/com/baeldung/files/ListFiles.java
+++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/listfiles/ListFiles.java
@@ -1,4 +1,4 @@
-package com.baeldung.files;
+package com.baeldung.listfiles;
import java.io.File;
import java.io.IOException;
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesManualTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/AppendToFileManualTest.java
similarity index 96%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesManualTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/AppendToFileManualTest.java
index f5c5c3dd3a..5d0382c64c 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesManualTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/AppendToFileManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.file;
+package com.baeldung.appendtofile;
import static org.assertj.core.api.Assertions.assertThat;
@@ -22,9 +22,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import com.baeldung.util.StreamUtils;
-
-public class FilesManualTest {
+public class AppendToFileManualTest {
public static final String fileName = "src/main/resources/countries.properties";
diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/StreamUtils.java
similarity index 91%
rename from core-java-modules/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/StreamUtils.java
index 42f438732f..846735fae2 100644
--- a/core-java-modules/core-java-io/src/main/java/com/baeldung/util/StreamUtils.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/appendtofile/StreamUtils.java
@@ -1,11 +1,11 @@
-package com.baeldung.util;
+package com.baeldung.appendtofile;
+
+import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
-import org.apache.commons.io.IOUtils;
-
public class StreamUtils {
public static String getStringFromInputStream(InputStream input) throws IOException {
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/copyfiles/FileCopierIntegrationTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/copyfiles/FileCopierIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/copyfiles/FileCopierIntegrationTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/copyfiles/FileCopierIntegrationTest.java
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java
index 338d53c597..995d2b56ce 100644
--- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java
@@ -5,15 +5,27 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
-
+import org.junit.BeforeClass;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CreateFilesUnitTest {
+
+ @BeforeClass
+ public static void clean() {
+ File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
+ File file1 = new File(tempDirectory.getAbsolutePath() + "/testFile.txt");
+ File file2 = new File(tempDirectory, "newFile.txt");
+ File file3 = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile2.txt");
+ file1.delete();
+ file2.delete();
+ file3.delete();
+ }
+
@Test
public void givenAnExistingDirectory_whenCreatingAFileWithAbsolutePath_thenFileIsCreated() throws IOException {
File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
- File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/myDirectory/testFile.txt");
+ File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/testFile.txt");
assertFalse(fileWithAbsolutePath.exists());
@@ -25,7 +37,7 @@ public class CreateFilesUnitTest {
@Test
public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFileWithRelativePath_thenFileIsCreated() throws IOException {
File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
- File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt");
+ File fileWithRelativePath = new File(tempDirectory, "newFile.txt");
assertFalse(fileWithRelativePath.exists());
@@ -37,7 +49,7 @@ public class CreateFilesUnitTest {
@Test
public void whenCreatingAFileWithFileSeparator_thenFileIsCreated() throws IOException {
File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
- File newFile = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile.txt");
+ File newFile = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile2.txt");
assertFalse(newFile.exists());
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/FilesClearDataUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/FilesClearDataUnitTest.java
index 8302124f32..470e260f57 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FilesClearDataUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/FilesClearDataUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.file;
+package com.baeldung.deletecontents;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -20,8 +20,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import com.baeldung.util.StreamUtils;
-
public class FilesClearDataUnitTest {
public static final String FILE_PATH = "src/test/resources/fileexample.txt";
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/StreamUtils.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/StreamUtils.java
new file mode 100644
index 0000000000..3584b3f2d9
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/deletecontents/StreamUtils.java
@@ -0,0 +1,16 @@
+package com.baeldung.deletecontents;
+
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+
+public class StreamUtils {
+
+ public static String getStringFromInputStream(InputStream input) throws IOException {
+ StringWriter writer = new StringWriter();
+ IOUtils.copy(input, writer, "UTF-8");
+ return writer.toString();
+ }
+}
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/directories/NewDirectoryUnitTest.java
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filenotfoundexception/FileNotFoundExceptionUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/filenotfoundexception/FileNotFoundExceptionUnitTest.java
index 3f48049fe3..266cffb21a 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/core/exceptions/FileNotFoundExceptionUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filenotfoundexception/FileNotFoundExceptionUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.core.exceptions;
+package com.baeldung.filenotfoundexception;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/listfiles/ListFilesUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/listfiles/ListFilesUnitTest.java
index 65710121cc..a87097f085 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/ListFilesUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/listfiles/ListFilesUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.file;
+package com.baeldung.listfiles;
import static org.junit.Assert.assertEquals;
@@ -8,7 +8,7 @@ import java.util.Set;
import org.junit.Test;
-import com.baeldung.files.ListFiles;
+import com.baeldung.listfiles.ListFiles;
public class ListFilesUnitTest {
diff --git a/core-java-modules/core-java/src/test/java/org/baeldung/java/JavaIoUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java
similarity index 97%
rename from core-java-modules/core-java/src/test/java/org/baeldung/java/JavaIoUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java
index 5da68aa746..b2923d9c01 100644
--- a/core-java-modules/core-java/src/test/java/org/baeldung/java/JavaIoUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/readlargefile/ReadLargeFileUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java;
+package com.baeldung.readlargefile;
import java.io.File;
import java.io.FileInputStream;
@@ -16,7 +16,7 @@ import com.google.common.base.Charsets;
import com.google.common.io.Files;
@Ignore("need large file for testing")
-public class JavaIoUnitTest {
+public class ReadLargeFileUnitTest {
protected final Logger logger = LoggerFactory.getLogger(getClass());
// tests - iterate lines in a file
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/writetofile/JavaWriteToFileUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java
rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/writetofile/JavaWriteToFileUnitTest.java
index bdc6b34b5c..f53f26e349 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/writetofile/JavaWriteToFileUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.writetofile;
+package com.baeldung.writetofile;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt
deleted file mode 100644
index b45ef6fec8..0000000000
--- a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello, World!
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/test/resources/copiedWithApacheCommons.txt b/core-java-modules/core-java-io-2/src/test/resources/copiedWithApacheCommons.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/copiedWithApacheCommons.txt
rename to core-java-modules/core-java-io-2/src/test/resources/copiedWithApacheCommons.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/copiedWithIo.txt b/core-java-modules/core-java-io-2/src/test/resources/copiedWithIo.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/copiedWithIo.txt
rename to core-java-modules/core-java-io-2/src/test/resources/copiedWithIo.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/copiedWithNio.txt b/core-java-modules/core-java-io-2/src/test/resources/copiedWithNio.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/copiedWithNio.txt
rename to core-java-modules/core-java-io-2/src/test/resources/copiedWithNio.txt
diff --git a/core-java-modules/core-java-io/src/main/resources/countries.properties b/core-java-modules/core-java-io-2/src/test/resources/countries.properties
similarity index 100%
rename from core-java-modules/core-java-io/src/main/resources/countries.properties
rename to core-java-modules/core-java-io-2/src/test/resources/countries.properties
diff --git a/core-java-modules/core-java-io/src/test/resources/fileexample.txt b/core-java-modules/core-java-io-2/src/test/resources/fileexample.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/fileexample.txt
rename to core-java-modules/core-java-io-2/src/test/resources/fileexample.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/country.txt b/core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/country.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/country.txt
rename to core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/country.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/employee.json b/core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/employee.json
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/employee.json
rename to core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/employee.json
diff --git a/core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/students.json b/core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/students.json
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/students.json
rename to core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/students.json
diff --git a/core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/test.xml b/core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/test.xml
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/listFilesUnitTestFolder/test.xml
rename to core-java-modules/core-java-io-2/src/test/resources/listFilesUnitTestFolder/test.xml
diff --git a/core-java-modules/core-java-io/src/test/resources/original.txt b/core-java-modules/core-java-io-2/src/test/resources/original.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/original.txt
rename to core-java-modules/core-java-io-2/src/test/resources/original.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write_1.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write_1.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write_1.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write_1.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write_2.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write_2.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write_2.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write_2.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write_3.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write_3.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write_3.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write_3.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write_4.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write_4.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write_4.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write_4.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/test_write_5.txt b/core-java-modules/core-java-io-2/src/test/resources/test_write_5.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/test_write_5.txt
rename to core-java-modules/core-java-io-2/src/test/resources/test_write_5.txt
diff --git a/core-java-modules/core-java-io-apis/README.md b/core-java-modules/core-java-io-apis/README.md
index 78a68ccf5d..4d2bb0afb1 100644
--- a/core-java-modules/core-java-io-apis/README.md
+++ b/core-java-modules/core-java-io-apis/README.md
@@ -12,3 +12,5 @@ This module contains articles about core Java input/output(IO) APIs.
- [Quick Use of FilenameFilter](https://www.baeldung.com/java-filename-filter)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
- [Java Scanner](https://www.baeldung.com/java-scanner)
+- [Scanner nextLine() Method](https://www.baeldung.com/java-scanner-nextline)
+- [Java Scanner hasNext() vs. hasNextLine()](https://www.baeldung.com/java-scanner-hasnext-vs-hasnextline)
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-apis/pom.xml b/core-java-modules/core-java-io-apis/pom.xml
index 7cf6264942..0eab844681 100644
--- a/core-java-modules/core-java-io-apis/pom.xml
+++ b/core-java-modules/core-java-io-apis/pom.xml
@@ -14,6 +14,23 @@
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
org.assertj
diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/scanner/HasNextVsHasNextLineDemo.java b/core-java-modules/core-java-io-apis/src/main/java/com/baeldung/scanner/HasNextVsHasNextLineDemo.java
similarity index 100%
rename from core-java-modules/core-java-io-2/src/main/java/com/baeldung/scanner/HasNextVsHasNextLineDemo.java
rename to core-java-modules/core-java-io-apis/src/main/java/com/baeldung/scanner/HasNextVsHasNextLineDemo.java
diff --git a/core-java-modules/core-java-io-2/src/main/resources/scanner/log4j.properties b/core-java-modules/core-java-io-apis/src/main/resources/scanner/log4j.properties
similarity index 100%
rename from core-java-modules/core-java-io-2/src/main/resources/scanner/log4j.properties
rename to core-java-modules/core-java-io-apis/src/main/resources/scanner/log4j.properties
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/scanner/JavaScannerUnitTest.java b/core-java-modules/core-java-io-apis/src/test/java/com/baeldung/scannernextline/ScannerNextLineUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-io-2/src/test/java/com/baeldung/scanner/JavaScannerUnitTest.java
rename to core-java-modules/core-java-io-apis/src/test/java/com/baeldung/scannernextline/ScannerNextLineUnitTest.java
index 471c0ea1c7..f3e76229da 100644
--- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/scanner/JavaScannerUnitTest.java
+++ b/core-java-modules/core-java-io-apis/src/test/java/com/baeldung/scannernextline/ScannerNextLineUnitTest.java
@@ -1,13 +1,13 @@
-package com.baeldung.scanner;
+package com.baeldung.scannernextline;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.NoSuchElementException;
import java.util.Scanner;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
-public class JavaScannerUnitTest {
+public class ScannerNextLineUnitTest {
@Test
public void whenReadingLines_thenCorrect() {
diff --git a/core-java-modules/core-java-io-conversions/README.md b/core-java-modules/core-java-io-conversions/README.md
index 5043cf1ece..cdb7df04d0 100644
--- a/core-java-modules/core-java-io-conversions/README.md
+++ b/core-java-modules/core-java-io-conversions/README.md
@@ -7,3 +7,11 @@ This module contains articles about core Java input/output(IO) conversions.
- [Java – Convert File to InputStream](https://www.baeldung.com/convert-file-to-input-stream)
- [Java – Byte Array to Writer](https://www.baeldung.com/java-convert-byte-array-to-writer)
- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)
+- [Java – String to Reader](https://www.baeldung.com/java-convert-string-to-reader)
+- [Java – Byte Array to Reader](https://www.baeldung.com/java-convert-byte-array-to-reader)
+- [Java – File to Reader](https://www.baeldung.com/java-convert-file-to-reader)
+- [Java – InputStream to Reader](https://www.baeldung.com/java-convert-inputstream-to-reader)
+- [Java – Reader to String](https://www.baeldung.com/java-convert-reader-to-string)
+- [Java – Write a Reader to File](https://www.baeldung.com/java-write-reader-to-file)
+- [Java – Reader to Byte Array](https://www.baeldung.com/java-convert-reader-to-byte-array)
+- [Java – Reader to InputStream](https://www.baeldung.com/java-convert-reader-to-inputstream)
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java
rename to core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
index 3c574f1e5c..72813df9b1 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReaderToXUnitTest.java
+++ b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.io;
+package com.baeldung.readertox;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/xtoreader/JavaXToReaderUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java
rename to core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/xtoreader/JavaXToReaderUnitTest.java
index eac37441ca..a7b9326996 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToReaderUnitTest.java
+++ b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/xtoreader/JavaXToReaderUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.io;
+package com.baeldung.xtoreader;
import java.io.ByteArrayInputStream;
import java.io.File;
diff --git a/core-java-modules/core-java-io/src/test/resources/initialFile.txt b/core-java-modules/core-java-io-conversions/src/test/resources/initialFile.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/initialFile.txt
rename to core-java-modules/core-java-io-conversions/src/test/resources/initialFile.txt
diff --git a/core-java-modules/core-java-io/src/test/resources/targetFile.txt b/core-java-modules/core-java-io-conversions/src/test/resources/targetFile.txt
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/targetFile.txt
rename to core-java-modules/core-java-io-conversions/src/test/resources/targetFile.txt
diff --git a/core-java-modules/core-java-io-files/.gitignore b/core-java-modules/core-java-io-files/.gitignore
deleted file mode 100644
index c61d35324d..0000000000
--- a/core-java-modules/core-java-io-files/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-0.*
-
-# Files generated by integration tests
-# *.txt
-/temp
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/README.md b/core-java-modules/core-java-io-files/README.md
deleted file mode 100644
index 80c0dc941e..0000000000
--- a/core-java-modules/core-java-io-files/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-=========
-
-## Core Java IO Files Cookbooks and Examples
-
-### Relevant Articles:
-- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/pom.xml b/core-java-modules/core-java-io-files/pom.xml
deleted file mode 100644
index 2aa6c7bf44..0000000000
--- a/core-java-modules/core-java-io-files/pom.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-
- 4.0.0
- core-java-io-files
- 0.1.0-SNAPSHOT
- core-java-io-files
- jar
-
-
- com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../../parent-java
-
-
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.hsqldb
- hsqldb
- ${hsqldb.version}
- runtime
-
-
-
-
- core-java-io-files
-
-
- src/main/resources
- true
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
- java
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
- -Xmx300m
- -XX:+UseParallelGC
- -classpath
-
- com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
-
-
-
-
- org.apache.maven.plugins
- maven-javadoc-plugin
- ${maven-javadoc-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
-
- true
- com.baeldung.resource.MyResourceLoader
-
-
-
-
-
-
-
-
-
- integration
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
-
-
-
- run-benchmarks
-
- none
-
- exec
-
-
- test
- java
-
- -classpath
-
- org.openjdk.jmh.Main
- .*
-
-
-
-
-
-
-
-
-
-
-
-
-
- 3.6.1
-
-
- 3.0.0-M1
- 2.4.0
-
- 3.1.0
-
-
-
-
diff --git a/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java
deleted file mode 100644
index 7512b177df..0000000000
--- a/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.resource;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.stream.Collectors;
-
-public class MyResourceLoader {
-
- private void loadFileWithReader() throws IOException {
-
- try (FileReader fileReader = new FileReader("src/main/resources/input.txt");
- BufferedReader reader = new BufferedReader(fileReader)) {
- String contents = reader.lines()
- .collect(Collectors.joining(System.lineSeparator()));
- System.out.println(contents);
- }
-
- }
-
- private void loadFileAsResource() throws IOException {
-
- try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");
- BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
- String contents = reader.lines()
- .collect(Collectors.joining(System.lineSeparator()));
- System.out.println(contents);
- }
- }
-
- public static void main(String[] args) throws IOException {
-
- MyResourceLoader resourceLoader = new MyResourceLoader();
-
- resourceLoader.loadFileAsResource();
- resourceLoader.loadFileWithReader();
-
- }
-
-}
diff --git a/core-java-modules/core-java-io-files/src/main/resources/input.txt b/core-java-modules/core-java-io-files/src/main/resources/input.txt
deleted file mode 100644
index 650da894e8..0000000000
--- a/core-java-modules/core-java-io-files/src/main/resources/input.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus.
-
-Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
-
-Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien.
-
-Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla.
-
-Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis.
-
-Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis.
-
-Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et.
-
-Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est.
-
-Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor.
-
-Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui.
-
-Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices.
-
-Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas.
-
-Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus.
-
-Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque.
-
-Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla.
-
-Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non.
-
-Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam.
-
-Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in.
-
-Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat.
-
-Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi.
-
-Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex.
-
-Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor.
-
-Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue.
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/src/test/resources/.gitignore b/core-java-modules/core-java-io-files/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/core-java-modules/core-java-io-files/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md
index af65476ceb..5c4978722f 100644
--- a/core-java-modules/core-java-io/README.md
+++ b/core-java-modules/core-java-io/README.md
@@ -3,21 +3,14 @@
This module contains articles about core Java input and output (IO)
### Relevant Articles:
-- [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file)
-- [Java – Write to File](http://www.baeldung.com/java-write-to-file)
-- [Java – Directory Size](http://www.baeldung.com/java-folder-size)
-- [File Size in Java](http://www.baeldung.com/java-file-size)
-- [How to Copy a File with Java](http://www.baeldung.com/java-copy-file)
-- [Java – Append Data to a File](http://www.baeldung.com/java-append-to-file)
-- [FileNotFoundException in Java](http://www.baeldung.com/java-filenotfound-exception)
-- [How to Read a File in Java](http://www.baeldung.com/reading-file-in-java)
-- [Zipping and Unzipping in Java](http://www.baeldung.com/java-compress-and-uncompress)
+- [How to Read a File in Java](https://www.baeldung.com/reading-file-in-java)
- [Read a File into an ArrayList](https://www.baeldung.com/java-file-to-arraylist)
+- [Java – Directory Size](https://www.baeldung.com/java-folder-size)
+- [File Size in Java](https://www.baeldung.com/java-file-size)
+- [Zipping and Unzipping in Java](https://www.baeldung.com/java-compress-and-uncompress)
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
-- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
-- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
-- [Create a Directory in Java](https://www.baeldung.com/java-create-directory)
+- [How to Get the File Extension of a File in Java](https://www.baeldung.com/java-file-extension)
+- [Getting a File’s Mime Type in Java](https://www.baeldung.com/java-file-mime-type)
- [How to Write to a CSV File in Java](https://www.baeldung.com/java-csv)
-- [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files)
- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
- [[More -->]](/core-java-modules/core-java-io-2)
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
index 393ab5e318..0244011f78 100644
--- a/core-java-modules/core-java-io/pom.xml
+++ b/core-java-modules/core-java-io/pom.xml
@@ -140,12 +140,10 @@
-
4.1
3.6.1
-
3.0.0-M1
2.4.0
diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java
deleted file mode 100644
index ccc2066b36..0000000000
--- a/core-java-modules/core-java-io/src/main/java/com/baeldung/stream/FileCopy.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.baeldung.stream;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.channels.FileChannel;
-import java.nio.file.Files;
-
-import org.apache.commons.io.FileUtils;
-
-public class FileCopy {
-
- public static void copyFileUsingStream(File source, File dest) throws IOException {
- InputStream is = null;
- OutputStream os = null;
- is = new FileInputStream(source);
- os = new FileOutputStream(dest);
- byte[] buffer = new byte[1024];
- int length;
- while ((length = is.read(buffer)) > 0) {
- os.write(buffer, 0, length);
- }
- is.close();
- os.close();
- }
-
- public static void copyFileUsingChannel(File source, File dest) throws IOException {
- FileChannel sourceChannel = null;
- FileChannel destChannel = null;
- sourceChannel = new FileInputStream(source).getChannel();
- destChannel = new FileOutputStream(dest).getChannel();
- destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
- sourceChannel.close();
- destChannel.close();
- }
-
- public static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
- FileUtils.copyFile(source, dest);
- }
-
- public static void copyFileUsingJavaFiles(File source, File dest) throws IOException {
- Files.copy(source.toPath(), dest.toPath());
- }
-
-}
diff --git a/core-java-modules/core-java-io/src/main/resources/ESAPI.properties b/core-java-modules/core-java-io/src/main/resources/ESAPI.properties
deleted file mode 100644
index 24dcaa9dfa..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/ESAPI.properties
+++ /dev/null
@@ -1,453 +0,0 @@
-#
-# OWASP Enterprise Security API (ESAPI) Properties file -- PRODUCTION Version
-#
-# This file is part of the Open Web Application Security Project (OWASP)
-# Enterprise Security API (ESAPI) project. For details, please see
-# http://www.owasp.org/index.php/ESAPI.
-#
-# Copyright (c) 2008,2009 - The OWASP Foundation
-#
-# DISCUSS: This may cause a major backwards compatibility issue, etc. but
-# from a name space perspective, we probably should have prefaced
-# all the property names with ESAPI or at least OWASP. Otherwise
-# there could be problems is someone loads this properties file into
-# the System properties. We could also put this file into the
-# esapi.jar file (perhaps as a ResourceBundle) and then allow an external
-# ESAPI properties be defined that would overwrite these defaults.
-# That keeps the application's properties relatively simple as usually
-# they will only want to override a few properties. If looks like we
-# already support multiple override levels of this in the
-# DefaultSecurityConfiguration class, but I'm suggesting placing the
-# defaults in the esapi.jar itself. That way, if the jar is signed,
-# we could detect if those properties had been tampered with. (The
-# code to check the jar signatures is pretty simple... maybe 70-90 LOC,
-# but off course there is an execution penalty (similar to the way
-# that the separate sunjce.jar used to be when a class from it was
-# first loaded). Thoughts?
-###############################################################################
-#
-# WARNING: Operating system protection should be used to lock down the .esapi
-# resources directory and all the files inside and all the directories all the
-# way up to the root directory of the file system. Note that if you are using
-# file-based implementations, that some files may need to be read-write as they
-# get updated dynamically.
-#
-# Before using, be sure to update the MasterKey and MasterSalt as described below.
-# N.B.: If you had stored data that you have previously encrypted with ESAPI 1.4,
-# you *must* FIRST decrypt it using ESAPI 1.4 and then (if so desired)
-# re-encrypt it with ESAPI 2.0. If you fail to do this, you will NOT be
-# able to decrypt your data with ESAPI 2.0.
-#
-# YOU HAVE BEEN WARNED!!! More details are in the ESAPI 2.0 Release Notes.
-#
-#===========================================================================
-# ESAPI Configuration
-#
-# If true, then print all the ESAPI properties set here when they are loaded.
-# If false, they are not printed. Useful to reduce output when running JUnit tests.
-# If you need to troubleshoot a properties related problem, turning this on may help.
-# This is 'false' in the src/test/resources/.esapi version. It is 'true' by
-# default for reasons of backward compatibility with earlier ESAPI versions.
-ESAPI.printProperties=true
-
-# ESAPI is designed to be easily extensible. You can use the reference implementation
-# or implement your own providers to take advantage of your enterprise's security
-# infrastructure. The functions in ESAPI are referenced using the ESAPI locator, like:
-#
-# String ciphertext =
-# ESAPI.encryptor().encrypt("Secret message"); // Deprecated in 2.0
-# CipherText cipherText =
-# ESAPI.encryptor().encrypt(new PlainText("Secret message")); // Preferred
-#
-# Below you can specify the classname for the provider that you wish to use in your
-# application. The only requirement is that it implement the appropriate ESAPI interface.
-# This allows you to switch security implementations in the future without rewriting the
-# entire application.
-#
-# ExperimentalAccessController requires ESAPI-AccessControlPolicy.xml in .esapi directory
-ESAPI.AccessControl=org.owasp.esapi.reference.DefaultAccessController
-# FileBasedAuthenticator requires users.txt file in .esapi directory
-ESAPI.Authenticator=org.owasp.esapi.reference.FileBasedAuthenticator
-ESAPI.Encoder=org.owasp.esapi.reference.DefaultEncoder
-ESAPI.Encryptor=org.owasp.esapi.reference.crypto.JavaEncryptor
-
-ESAPI.Executor=org.owasp.esapi.reference.DefaultExecutor
-ESAPI.HTTPUtilities=org.owasp.esapi.reference.DefaultHTTPUtilities
-ESAPI.IntrusionDetector=org.owasp.esapi.reference.DefaultIntrusionDetector
-# Log4JFactory Requires log4j.xml or log4j.properties in classpath - http://www.laliluna.de/log4j-tutorial.html
-ESAPI.Logger=org.owasp.esapi.reference.Log4JLogFactory
-#ESAPI.Logger=org.owasp.esapi.reference.JavaLogFactory
-ESAPI.Randomizer=org.owasp.esapi.reference.DefaultRandomizer
-ESAPI.Validator=org.owasp.esapi.reference.DefaultValidator
-
-#===========================================================================
-# ESAPI Authenticator
-#
-Authenticator.AllowedLoginAttempts=3
-Authenticator.MaxOldPasswordHashes=13
-Authenticator.UsernameParameterName=username
-Authenticator.PasswordParameterName=password
-# RememberTokenDuration (in days)
-Authenticator.RememberTokenDuration=14
-# Session Timeouts (in minutes)
-Authenticator.IdleTimeoutDuration=20
-Authenticator.AbsoluteTimeoutDuration=120
-
-#===========================================================================
-# ESAPI Encoder
-#
-# ESAPI canonicalizes input before validation to prevent bypassing filters with encoded attacks.
-# Failure to canonicalize input is a very common mistake when implementing validation schemes.
-# Canonicalization is automatic when using the ESAPI Validator, but you can also use the
-# following code to canonicalize data.
-#
-# ESAPI.Encoder().canonicalize( "%22hello world"" );
-#
-# Multiple encoding is when a single encoding format is applied multiple times. Allowing
-# multiple encoding is strongly discouraged.
-Encoder.AllowMultipleEncoding=false
-
-# Mixed encoding is when multiple different encoding formats are applied, or when
-# multiple formats are nested. Allowing multiple encoding is strongly discouraged.
-Encoder.AllowMixedEncoding=false
-
-# The default list of codecs to apply when canonicalizing untrusted data. The list should include the codecs
-# for all downstream interpreters or decoders. For example, if the data is likely to end up in a URL, HTML, or
-# inside JavaScript, then the list of codecs below is appropriate. The order of the list is not terribly important.
-Encoder.DefaultCodecList=HTMLEntityCodec,PercentCodec,JavaScriptCodec
-
-
-#===========================================================================
-# ESAPI Encryption
-#
-# The ESAPI Encryptor provides basic cryptographic functions with a simplified API.
-# To get started, generate a new key using java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor
-# There is not currently any support for key rotation, so be careful when changing your key and salt as it
-# will invalidate all signed, encrypted, and hashed data.
-#
-# WARNING: Not all combinations of algorithms and key lengths are supported.
-# If you choose to use a key length greater than 128, you MUST download the
-# unlimited strength policy files and install in the lib directory of your JRE/JDK.
-# See http://java.sun.com/javase/downloads/index.jsp for more information.
-#
-# Backward compatibility with ESAPI Java 1.4 is supported by the two deprecated API
-# methods, Encryptor.encrypt(String) and Encryptor.decrypt(String). However, whenever
-# possible, these methods should be avoided as they use ECB cipher mode, which in almost
-# all circumstances a poor choice because of it's weakness. CBC cipher mode is the default
-# for the new Encryptor encrypt / decrypt methods for ESAPI Java 2.0. In general, you
-# should only use this compatibility setting if you have persistent data encrypted with
-# version 1.4 and even then, you should ONLY set this compatibility mode UNTIL
-# you have decrypted all of your old encrypted data and then re-encrypted it with
-# ESAPI 2.0 using CBC mode. If you have some reason to mix the deprecated 1.4 mode
-# with the new 2.0 methods, make sure that you use the same cipher algorithm for both
-# (256-bit AES was the default for 1.4; 128-bit is the default for 2.0; see below for
-# more details.) Otherwise, you will have to use the new 2.0 encrypt / decrypt methods
-# where you can specify a SecretKey. (Note that if you are using the 256-bit AES,
-# that requires downloading the special jurisdiction policy files mentioned above.)
-#
-# ***** IMPORTANT: Do NOT forget to replace these with your own values! *****
-# To calculate these values, you can run:
-# java -classpath esapi.jar org.owasp.esapi.reference.crypto.JavaEncryptor
-#
-Encryptor.MasterKey=tzfztf56ftv
-Encryptor.MasterSalt=123456ztrewq
-
-# Provides the default JCE provider that ESAPI will "prefer" for its symmetric
-# encryption and hashing. (That is it will look to this provider first, but it
-# will defer to other providers if the requested algorithm is not implemented
-# by this provider.) If left unset, ESAPI will just use your Java VM's current
-# preferred JCE provider, which is generally set in the file
-# "$JAVA_HOME/jre/lib/security/java.security".
-#
-# The main intent of this is to allow ESAPI symmetric encryption to be
-# used with a FIPS 140-2 compliant crypto-module. For details, see the section
-# "Using ESAPI Symmetric Encryption with FIPS 140-2 Cryptographic Modules" in
-# the ESAPI 2.0 Symmetric Encryption User Guide, at:
-# http://owasp-esapi-java.googlecode.com/svn/trunk/documentation/esapi4java-core-2.0-symmetric-crypto-user-guide.html
-# However, this property also allows you to easily use an alternate JCE provider
-# such as "Bouncy Castle" without having to make changes to "java.security".
-# See Javadoc for SecurityProviderLoader for further details. If you wish to use
-# a provider that is not known to SecurityProviderLoader, you may specify the
-# fully-qualified class name of the JCE provider class that implements
-# java.security.Provider. If the name contains a '.', this is interpreted as
-# a fully-qualified class name that implements java.security.Provider.
-#
-# NOTE: Setting this property has the side-effect of changing it in your application
-# as well, so if you are using JCE in your application directly rather than
-# through ESAPI (you wouldn't do that, would you? ;-), it will change the
-# preferred JCE provider there as well.
-#
-# Default: Keeps the JCE provider set to whatever JVM sets it to.
-Encryptor.PreferredJCEProvider=
-
-# AES is the most widely used and strongest encryption algorithm. This
-# should agree with your Encryptor.CipherTransformation property.
-# By default, ESAPI Java 1.4 uses "PBEWithMD5AndDES" and which is
-# very weak. It is essentially a password-based encryption key, hashed
-# with MD5 around 1K times and then encrypted with the weak DES algorithm
-# (56-bits) using ECB mode and an unspecified padding (it is
-# JCE provider specific, but most likely "NoPadding"). However, 2.0 uses
-# "AES/CBC/PKCSPadding". If you want to change these, change them here.
-# Warning: This property does not control the default reference implementation for
-# ESAPI 2.0 using JavaEncryptor. Also, this property will be dropped
-# in the future.
-# @deprecated
-Encryptor.EncryptionAlgorithm=AES
-# For ESAPI Java 2.0 - New encrypt / decrypt methods use this.
-Encryptor.CipherTransformation=AES/CBC/PKCS5Padding
-
-# Applies to ESAPI 2.0 and later only!
-# Comma-separated list of cipher modes that provide *BOTH*
-# confidentiality *AND* message authenticity. (NIST refers to such cipher
-# modes as "combined modes" so that's what we shall call them.) If any of these
-# cipher modes are used then no MAC is calculated and stored
-# in the CipherText upon encryption. Likewise, if one of these
-# cipher modes is used with decryption, no attempt will be made
-# to validate the MAC contained in the CipherText object regardless
-# of whether it contains one or not. Since the expectation is that
-# these cipher modes support support message authenticity already,
-# injecting a MAC in the CipherText object would be at best redundant.
-#
-# Note that as of JDK 1.5, the SunJCE provider does not support *any*
-# of these cipher modes. Of these listed, only GCM and CCM are currently
-# NIST approved. YMMV for other JCE providers. E.g., Bouncy Castle supports
-# GCM and CCM with "NoPadding" mode, but not with "PKCS5Padding" or other
-# padding modes.
-Encryptor.cipher_modes.combined_modes=GCM,CCM,IAPM,EAX,OCB,CWC
-
-# Applies to ESAPI 2.0 and later only!
-# Additional cipher modes allowed for ESAPI 2.0 encryption. These
-# cipher modes are in _addition_ to those specified by the property
-# 'Encryptor.cipher_modes.combined_modes'.
-# Note: We will add support for streaming modes like CFB & OFB once
-# we add support for 'specified' to the property 'Encryptor.ChooseIVMethod'
-# (probably in ESAPI 2.1).
-# DISCUSS: Better name?
-Encryptor.cipher_modes.additional_allowed=CBC
-
-# 128-bit is almost always sufficient and appears to be more resistant to
-# related key attacks than is 256-bit AES. Use '_' to use default key size
-# for cipher algorithms (where it makes sense because the algorithm supports
-# a variable key size). Key length must agree to what's provided as the
-# cipher transformation, otherwise this will be ignored after logging a
-# warning.
-#
-# NOTE: This is what applies BOTH ESAPI 1.4 and 2.0. See warning above about mixing!
-Encryptor.EncryptionKeyLength=128
-
-# Because 2.0 uses CBC mode by default, it requires an initialization vector (IV).
-# (All cipher modes except ECB require an IV.) There are two choices: we can either
-# use a fixed IV known to both parties or allow ESAPI to choose a random IV. While
-# the IV does not need to be hidden from adversaries, it is important that the
-# adversary not be allowed to choose it. Also, random IVs are generally much more
-# secure than fixed IVs. (In fact, it is essential that feed-back cipher modes
-# such as CFB and OFB use a different IV for each encryption with a given key so
-# in such cases, random IVs are much preferred. By default, ESAPI 2.0 uses random
-# IVs. If you wish to use 'fixed' IVs, set 'Encryptor.ChooseIVMethod=fixed' and
-# uncomment the Encryptor.fixedIV.
-#
-# Valid values: random|fixed|specified 'specified' not yet implemented; planned for 2.1
-Encryptor.ChooseIVMethod=random
-# If you choose to use a fixed IV, then you must place a fixed IV here that
-# is known to all others who are sharing your secret key. The format should
-# be a hex string that is the same length as the cipher block size for the
-# cipher algorithm that you are using. The following is an *example* for AES
-# from an AES test vector for AES-128/CBC as described in:
-# NIST Special Publication 800-38A (2001 Edition)
-# "Recommendation for Block Cipher Modes of Operation".
-# (Note that the block size for AES is 16 bytes == 128 bits.)
-#
-Encryptor.fixedIV=0x000102030405060708090a0b0c0d0e0f
-
-# Whether or not CipherText should use a message authentication code (MAC) with it.
-# This prevents an adversary from altering the IV as well as allowing a more
-# fool-proof way of determining the decryption failed because of an incorrect
-# key being supplied. This refers to the "separate" MAC calculated and stored
-# in CipherText, not part of any MAC that is calculated as a result of a
-# "combined mode" cipher mode.
-#
-# If you are using ESAPI with a FIPS 140-2 cryptographic module, you *must* also
-# set this property to false.
-Encryptor.CipherText.useMAC=true
-
-# Whether or not the PlainText object may be overwritten and then marked
-# eligible for garbage collection. If not set, this is still treated as 'true'.
-Encryptor.PlainText.overwrite=true
-
-# Do not use DES except in a legacy situations. 56-bit is way too small key size.
-#Encryptor.EncryptionKeyLength=56
-#Encryptor.EncryptionAlgorithm=DES
-
-# TripleDES is considered strong enough for most purposes.
-# Note: There is also a 112-bit version of DESede. Using the 168-bit version
-# requires downloading the special jurisdiction policy from Sun.
-#Encryptor.EncryptionKeyLength=168
-#Encryptor.EncryptionAlgorithm=DESede
-
-Encryptor.HashAlgorithm=SHA-512
-Encryptor.HashIterations=1024
-Encryptor.DigitalSignatureAlgorithm=SHA1withDSA
-Encryptor.DigitalSignatureKeyLength=1024
-Encryptor.RandomAlgorithm=SHA1PRNG
-Encryptor.CharacterEncoding=UTF-8
-
-# This is the Pseudo Random Function (PRF) that ESAPI's Key Derivation Function
-# (KDF) normally uses. Note this is *only* the PRF used for ESAPI's KDF and
-# *not* what is used for ESAPI's MAC. (Currently, HmacSHA1 is always used for
-# the MAC, mostly to keep the overall size at a minimum.)
-#
-# Currently supported choices for JDK 1.5 and 1.6 are:
-# HmacSHA1 (160 bits), HmacSHA256 (256 bits), HmacSHA384 (384 bits), and
-# HmacSHA512 (512 bits).
-# Note that HmacMD5 is *not* supported for the PRF used by the KDF even though
-# the JDKs support it. See the ESAPI 2.0 Symmetric Encryption User Guide
-# further details.
-Encryptor.KDF.PRF=HmacSHA256
-#===========================================================================
-# ESAPI HttpUtilties
-#
-# The HttpUtilities provide basic protections to HTTP requests and responses. Primarily these methods
-# protect against malicious data from attackers, such as unprintable characters, escaped characters,
-# and other simple attacks. The HttpUtilities also provides utility methods for dealing with cookies,
-# headers, and CSRF tokens.
-#
-# Default file upload location (remember to escape backslashes with \\)
-HttpUtilities.UploadDir=C:\\ESAPI\\testUpload
-HttpUtilities.UploadTempDir=C:\\temp
-# Force flags on cookies, if you use HttpUtilities to set cookies
-HttpUtilities.ForceHttpOnlySession=false
-HttpUtilities.ForceSecureSession=false
-HttpUtilities.ForceHttpOnlyCookies=true
-HttpUtilities.ForceSecureCookies=true
-# Maximum size of HTTP headers
-HttpUtilities.MaxHeaderSize=4096
-# File upload configuration
-HttpUtilities.ApprovedUploadExtensions=.zip,.pdf,.doc,.docx,.ppt,.pptx,.tar,.gz,.tgz,.rar,.war,.jar,.ear,.xls,.rtf,.properties,.java,.class,.txt,.xml,.jsp,.jsf,.exe,.dll
-HttpUtilities.MaxUploadFileBytes=500000000
-# Using UTF-8 throughout your stack is highly recommended. That includes your database driver,
-# container, and any other technologies you may be using. Failure to do this may expose you
-# to Unicode transcoding injection attacks. Use of UTF-8 does not hinder internationalization.
-HttpUtilities.ResponseContentType=text/html; charset=UTF-8
-# This is the name of the cookie used to represent the HTTP session
-# Typically this will be the default "JSESSIONID"
-HttpUtilities.HttpSessionIdName=JSESSIONID
-
-
-
-#===========================================================================
-# ESAPI Executor
-# CHECKME - Not sure what this is used for, but surely it should be made OS independent.
-Executor.WorkingDirectory=C:\\Windows\\Temp
-Executor.ApprovedExecutables=C:\\Windows\\System32\\cmd.exe,C:\\Windows\\System32\\runas.exe
-
-
-#===========================================================================
-# ESAPI Logging
-# Set the application name if these logs are combined with other applications
-Logger.ApplicationName=ExampleApplication
-# If you use an HTML log viewer that does not properly HTML escape log data, you can set LogEncodingRequired to true
-Logger.LogEncodingRequired=false
-# Determines whether ESAPI should log the application name. This might be clutter in some single-server/single-app environments.
-Logger.LogApplicationName=true
-# Determines whether ESAPI should log the server IP and port. This might be clutter in some single-server environments.
-Logger.LogServerIP=true
-# LogFileName, the name of the logging file. Provide a full directory path (e.g., C:\\ESAPI\\ESAPI_logging_file) if you
-# want to place it in a specific directory.
-Logger.LogFileName=ESAPI_logging_file
-# MaxLogFileSize, the max size (in bytes) of a single log file before it cuts over to a new one (default is 10,000,000)
-Logger.MaxLogFileSize=10000000
-
-
-#===========================================================================
-# ESAPI Intrusion Detection
-#
-# Each event has a base to which .count, .interval, and .action are added
-# The IntrusionException will fire if we receive "count" events within "interval" seconds
-# The IntrusionDetector is configurable to take the following actions: log, logout, and disable
-# (multiple actions separated by commas are allowed e.g. event.test.actions=log,disable
-#
-# Custom Events
-# Names must start with "event." as the base
-# Use IntrusionDetector.addEvent( "test" ) in your code to trigger "event.test" here
-# You can also disable intrusion detection completely by changing
-# the following parameter to true
-#
-IntrusionDetector.Disable=false
-#
-IntrusionDetector.event.test.count=2
-IntrusionDetector.event.test.interval=10
-IntrusionDetector.event.test.actions=disable,log
-
-# Exception Events
-# All EnterpriseSecurityExceptions are registered automatically
-# Call IntrusionDetector.getInstance().addException(e) for Exceptions that do not extend EnterpriseSecurityException
-# Use the fully qualified classname of the exception as the base
-
-# any intrusion is an attack
-IntrusionDetector.org.owasp.esapi.errors.IntrusionException.count=1
-IntrusionDetector.org.owasp.esapi.errors.IntrusionException.interval=1
-IntrusionDetector.org.owasp.esapi.errors.IntrusionException.actions=log,disable,logout
-
-# for test purposes
-# CHECKME: Shouldn't there be something in the property name itself that designates
-# that these are for testing???
-IntrusionDetector.org.owasp.esapi.errors.IntegrityException.count=10
-IntrusionDetector.org.owasp.esapi.errors.IntegrityException.interval=5
-IntrusionDetector.org.owasp.esapi.errors.IntegrityException.actions=log,disable,logout
-
-# rapid validation errors indicate scans or attacks in progress
-# org.owasp.esapi.errors.ValidationException.count=10
-# org.owasp.esapi.errors.ValidationException.interval=10
-# org.owasp.esapi.errors.ValidationException.actions=log,logout
-
-# sessions jumping between hosts indicates session hijacking
-IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.count=2
-IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.interval=10
-IntrusionDetector.org.owasp.esapi.errors.AuthenticationHostException.actions=log,logout
-
-
-#===========================================================================
-# ESAPI Validation
-#
-# The ESAPI Validator works on regular expressions with defined names. You can define names
-# either here, or you may define application specific patterns in a separate file defined below.
-# This allows enterprises to specify both organizational standards as well as application specific
-# validation rules.
-#
-Validator.ConfigurationFile=validation.properties
-
-# Validators used by ESAPI
-Validator.AccountName=^[a-zA-Z0-9]{3,20}$
-Validator.SystemCommand=^[a-zA-Z\\-\\/]{1,64}$
-Validator.RoleName=^[a-z]{1,20}$
-
-#the word TEST below should be changed to your application
-#name - only relative URL's are supported
-Validator.Redirect=^\\/test.*$
-
-# Global HTTP Validation Rules
-# Values with Base64 encoded data (e.g. encrypted state) will need at least [a-zA-Z0-9\/+=]
-Validator.HTTPScheme=^(http|https)$
-Validator.HTTPServerName=^[a-zA-Z0-9_.\\-]*$
-Validator.HTTPParameterName=^[a-zA-Z0-9_]{1,32}$
-Validator.HTTPParameterValue=^[a-zA-Z0-9.\\-\\/+=@_ ]*$
-Validator.HTTPCookieName=^[a-zA-Z0-9\\-_]{1,32}$
-Validator.HTTPCookieValue=^[a-zA-Z0-9\\-\\/+=_ ]*$
-Validator.HTTPHeaderName=^[a-zA-Z0-9\\-_]{1,32}$
-Validator.HTTPHeaderValue=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$
-Validator.HTTPContextPath=^\\/?[a-zA-Z0-9.\\-\\/_]*$
-Validator.HTTPServletPath=^[a-zA-Z0-9.\\-\\/_]*$
-Validator.HTTPPath=^[a-zA-Z0-9.\\-_]*$
-Validator.HTTPQueryString=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ %]*$
-Validator.HTTPURI=^[a-zA-Z0-9()\\-=\\*\\.\\?;,+\\/:&_ ]*$
-Validator.HTTPURL=^.*$
-Validator.HTTPJSESSIONID=^[A-Z0-9]{10,30}$
-
-# Validation of file related input
-Validator.FileName=^[a-zA-Z0-9!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$
-Validator.DirectoryName=^[a-zA-Z0-9:/\\\\!@#$%^&{}\\[\\]()_+\\-=,.~'` ]{1,255}$
-
-# Validation of dates. Controls whether or not 'lenient' dates are accepted.
-# See DataFormat.setLenient(boolean flag) for further details.
-Validator.AcceptLenientDates=false
-
diff --git a/core-java-modules/core-java-io/src/main/resources/META-INF/BenchmarkList b/core-java-modules/core-java-io/src/main/resources/META-INF/BenchmarkList
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/core-java-modules/core-java-io/src/main/resources/META-INF/persistence.xml b/core-java-modules/core-java-io/src/main/resources/META-INF/persistence.xml
deleted file mode 100644
index 3966afdcda..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/META-INF/persistence.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/core-java-modules/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin b/core-java-modules/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin
deleted file mode 100644
index 91fb6eb3b0..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/META-INF/services/com.sun.source.util.Plugin
+++ /dev/null
@@ -1 +0,0 @@
-com.baeldung.javac.SampleJavacPlugin
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/main/resources/data.csv b/core-java-modules/core-java-io/src/main/resources/data.csv
deleted file mode 100644
index ec4ac10443..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/data.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-1|IND|India
-2|MY|Malaysia
-3|AU|Australia
diff --git a/core-java-modules/core-java-io/src/main/resources/datasource.properties b/core-java-modules/core-java-io/src/main/resources/datasource.properties
deleted file mode 100644
index 61df0d45f7..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/datasource.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-dataSourceClassName=//TBD
-dataSource.user=//TBD
-dataSource.password=//TBD
-dataSource.databaseName=//TBD
-dataSource.portNumber=//TBD
-dataSource.serverName=//TBD
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/main/resources/js/bind.js b/core-java-modules/core-java-io/src/main/resources/js/bind.js
deleted file mode 100644
index 652e646d0d..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/bind.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var first = {
- name: "Whiskey",
- age: 5
-};
-
-var second = {
- volume: 100
-};
-
-Object.bindProperties(first, second);
-
-print(first.volume);
-
-second.volume = 1000;
-print(first.volume);
diff --git a/core-java-modules/core-java-io/src/main/resources/js/locations.js b/core-java-modules/core-java-io/src/main/resources/js/locations.js
deleted file mode 100644
index abfc944639..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/locations.js
+++ /dev/null
@@ -1 +0,0 @@
-print(__FILE__, __LINE__, __DIR__);
diff --git a/core-java-modules/core-java-io/src/main/resources/js/math_module.js b/core-java-modules/core-java-io/src/main/resources/js/math_module.js
deleted file mode 100644
index 267a100f36..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/math_module.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var math = {
- increment: function (num) {
- return ++num;
- },
-
- failFunc: function () {
- try {
- throw "BOOM";
- } catch (e if typeof e === 'string') {
- print("String thrown: " + e);
- }
- catch (e) {
- print("this shouldn't happen!");
- }
- }
-};
-
-
-math;
diff --git a/core-java-modules/core-java-io/src/main/resources/js/no_such.js b/core-java-modules/core-java-io/src/main/resources/js/no_such.js
deleted file mode 100644
index 43b50c5cad..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/no_such.js
+++ /dev/null
@@ -1,11 +0,0 @@
-var demo = {
- __noSuchProperty__: function (propName) {
- print("Accessed non-existing property: " + propName);
- },
-
- __noSuchMethod__: function (methodName) {
- print("Invoked non-existing method: " + methodName);
- }
-};
-
-demo;
diff --git a/core-java-modules/core-java-io/src/main/resources/js/script.js b/core-java-modules/core-java-io/src/main/resources/js/script.js
deleted file mode 100644
index 6f701ed59d..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/script.js
+++ /dev/null
@@ -1 +0,0 @@
-function increment(num) ++num;
diff --git a/core-java-modules/core-java-io/src/main/resources/js/trim.js b/core-java-modules/core-java-io/src/main/resources/js/trim.js
deleted file mode 100644
index 81be009978..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/trim.js
+++ /dev/null
@@ -1,2 +0,0 @@
-print(" hello world".trimLeft());
-print("hello world ".trimRight());
diff --git a/core-java-modules/core-java-io/src/main/resources/js/typed_arrays.js b/core-java-modules/core-java-io/src/main/resources/js/typed_arrays.js
deleted file mode 100644
index 6899b29373..0000000000
--- a/core-java-modules/core-java-io/src/main/resources/js/typed_arrays.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function arrays(arr) {
-
- var javaIntArray = Java.to(arr, "int[]");
- print(javaIntArray[0]);
- print(javaIntArray[1]);
- print(javaIntArray[2]);
-}
-
-arrays([100, "1654", true]);
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/LookupFSJNDIIntegrationTest.java
similarity index 96%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/LookupFSJNDIIntegrationTest.java
index 023a47cb97..fe744c5d50 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/test/LookupFSJNDIIntegrationTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/filesystem/jndi/LookupFSJNDIIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.filesystem.jndi.test;
+package com.baeldung.filesystem.jndi;
import com.baeldung.filesystem.jndi.LookupFSJNDI;
import org.junit.Test;
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/mimetype/MimeTypeUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/mimetype/MimeTypeUnitTest.java
index c8da2c1339..bf916e39e7 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/mimetype/MimeTypeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.mimetype;
+package com.baeldung.mimetype;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/JavaReadFromFileUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/JavaReadFromFileUnitTest.java
index a96232d66c..a4ccaad594 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaReadFromFileUnitTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/JavaReadFromFileUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.io;
+package com.baeldung.readfile;
import org.junit.Test;
import org.junit.Ignore;
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java
index c640932d6f..6b6197c7ce 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFileSizeUnitTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFileSizeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.size;
import static org.junit.Assert.assertEquals;
@@ -18,7 +18,7 @@ public class JavaFileSizeUnitTest {
@Before
public void init() {
final String separator = File.separator;
- filePath = String.join(separator, new String[] { "src", "test", "resources", "testFolder", "sample_file_1.in" });
+ filePath = String.join(separator, new String[] { "src", "test", "resources", "size", "sample_file_1.in" });
}
@Test
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFolderSizeUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFolderSizeUnitTest.java
index 1f3b380772..467da4f76a 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/java8/JavaFolderSizeUnitTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/size/JavaFolderSizeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.size;
import static org.junit.Assert.assertEquals;
@@ -25,7 +25,7 @@ public class JavaFolderSizeUnitTest {
@Before
public void init() {
final String separator = File.separator;
- path = String.format("src%stest%sresources%stestFolder", separator, separator, separator);
+ path = String.format("src%stest%sresources%ssize", separator, separator, separator);
}
@Test
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java
deleted file mode 100644
index b4641083b9..0000000000
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/stream/FileCopyUnitTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.baeldung.stream;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Test;
-
-public class FileCopyUnitTest {
-
- @Test
- public void whenUsingStream_thenCopyFile() throws IOException {
- final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_stream.txt");
- final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_stream.txt");
- FileCopy.copyFileUsingStream(src, dest);
-
- assertTrue(dest.exists());
- dest.delete();
- }
-
- @Test
- public void whenUsingFiles_thenCopyFile() throws IOException {
- final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_files.txt");
- final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_files.txt");
- FileCopy.copyFileUsingJavaFiles(src, dest);
-
- assertTrue(dest.exists());
- dest.delete();
- }
-
- @Test
- public void whenUsingChannel_thenCopyFile() throws IOException {
- final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_channel.txt");
- final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_channel.txt");
- FileCopy.copyFileUsingChannel(src, dest);
-
- assertTrue(dest.exists());
- dest.delete();
- }
-
- @Test
- public void whenUsingApache_thenCopyFile() throws IOException {
- final File src = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "src" + File.separator + "test_apache.txt");
- final File dest = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "copyTest" + File.separator + "dest" + File.separator + "test_apache.txt");
- FileCopy.copyFileUsingApacheCommonsIO(src, dest);
-
- assertTrue(dest.exists());
- dest.delete();
- }
-
-}
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java b/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java
deleted file mode 100644
index e45e3e73f4..0000000000
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaXToByteArrayUnitTest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.baeldung.java.io;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JavaXToByteArrayUnitTest {
- protected final Logger logger = LoggerFactory.getLogger(getClass());
-
- // tests - X to Byte Array
-
-}
diff --git a/core-java-modules/core-java-io/src/test/resources/.gitignore b/core-java-modules/core-java-io/src/test/resources/.gitignore
deleted file mode 100644
index 83c05e60c8..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-*.class
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-
-# Packaged files #
-*.jar
-*.war
-*.ear
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/test/resources/copyTest/dest/readme.txt b/core-java-modules/core-java-io/src/test/resources/copyTest/dest/readme.txt
deleted file mode 100644
index dfda31ee9f..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/copyTest/dest/readme.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-files will be copied here and then deleted
-remove `file.delete()` to see the files here
diff --git a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_apache.txt b/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_apache.txt
deleted file mode 100644
index a6b651973d..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_apache.txt
+++ /dev/null
@@ -1 +0,0 @@
-apache
diff --git a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_channel.txt b/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_channel.txt
deleted file mode 100644
index 6dca835871..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_channel.txt
+++ /dev/null
@@ -1 +0,0 @@
-channel
diff --git a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_files.txt b/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_files.txt
deleted file mode 100644
index 027271b9b2..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_files.txt
+++ /dev/null
@@ -1 +0,0 @@
-files
diff --git a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_stream.txt b/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_stream.txt
deleted file mode 100644
index eac9b41cbe..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/copyTest/src/test_stream.txt
+++ /dev/null
@@ -1 +0,0 @@
-stream
diff --git a/core-java-modules/core-java-io/src/test/resources/sample.txt b/core-java-modules/core-java-io/src/test/resources/sample.txt
deleted file mode 100644
index 5e1c309dae..0000000000
--- a/core-java-modules/core-java-io/src/test/resources/sample.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello World
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/test/resources/testFolder/sample_file_1.in b/core-java-modules/core-java-io/src/test/resources/size/sample_file_1.in
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/testFolder/sample_file_1.in
rename to core-java-modules/core-java-io/src/test/resources/size/sample_file_1.in
diff --git a/core-java-modules/core-java-io/src/test/resources/testFolder/sample_file_2.in b/core-java-modules/core-java-io/src/test/resources/size/sample_file_2.in
similarity index 100%
rename from core-java-modules/core-java-io/src/test/resources/testFolder/sample_file_2.in
rename to core-java-modules/core-java-io/src/test/resources/size/sample_file_2.in
diff --git a/core-java-modules/core-java-io/hard_link.txt b/core-java-modules/core-java-nio-2/hard_link.txt
similarity index 100%
rename from core-java-modules/core-java-io/hard_link.txt
rename to core-java-modules/core-java-nio-2/hard_link.txt
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/BufferedReaderExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/BufferedReaderExample.java
deleted file mode 100644
index 45ff486a79..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/BufferedReaderExample.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.fileparser;
-
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-
-public class BufferedReaderExample {
-
- protected static ArrayList generateArrayListFromFile(String filename) throws IOException {
-
- ArrayList result = new ArrayList<>();
-
- try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
-
- while (br.ready()) {
- result.add(br.readLine());
- }
- return result;
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FileReaderExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FileReaderExample.java
deleted file mode 100644
index f9dd2a9ec5..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FileReaderExample.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.baeldung.fileparser;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-
-public class FileReaderExample {
-
- protected static ArrayList generateArrayListFromFile(String filename) throws IOException {
-
- ArrayList result = new ArrayList<>();
-
- try (FileReader f = new FileReader(filename)) {
- StringBuffer sb = new StringBuffer();
- while (f.ready()) {
- char c = (char) f.read();
- if (c == '\n') {
- result.add(sb.toString());
- sb = new StringBuffer();
- } else {
- sb.append(c);
- }
- }
- if (sb.length() > 0) {
- result.add(sb.toString());
- }
- }
-
- return result;
- }
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FilesReadLinesExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FilesReadLinesExample.java
deleted file mode 100644
index 8e74f7d386..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/FilesReadLinesExample.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.fileparser;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-public class FilesReadLinesExample {
-
- protected static ArrayList generateArrayListFromFile(String filename) throws IOException {
-
- List result = Files.readAllLines(Paths.get(filename));
-
- return (ArrayList) result;
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerIntExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerIntExample.java
deleted file mode 100644
index 25d17af4ea..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerIntExample.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.fileparser;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Scanner;
-
-public class ScannerIntExample {
-
- protected static ArrayList generateArrayListFromFile(String filename) throws IOException {
-
- ArrayList result = new ArrayList<>();
-
- try (Scanner s = new Scanner(new FileReader(filename))) {
-
- while (s.hasNext()) {
- result.add(s.nextInt());
- }
- return result;
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerStringExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerStringExample.java
deleted file mode 100644
index ec213c9490..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/fileparser/ScannerStringExample.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.fileparser;
-
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Scanner;
-
-public class ScannerStringExample {
-
- protected static ArrayList generateArrayListFromFile(String filename) throws IOException {
-
- ArrayList result = new ArrayList<>();
-
- try (Scanner s = new Scanner(new FileReader(filename))) {
-
- while (s.hasNext()) {
- result.add(s.nextLine());
- }
- return result;
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/BufferedReaderUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/BufferedReaderUnitTest.java
deleted file mode 100644
index 78f900d796..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/BufferedReaderUnitTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.fileparser;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-public class BufferedReaderUnitTest {
-
- protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
-
- @Test
- public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
- List lines = BufferedReaderExample.generateArrayListFromFile(TEXT_FILENAME);
- assertTrue("File does not has 2 lines", lines.size() == 2);
- }
-}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FileReaderUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FileReaderUnitTest.java
deleted file mode 100644
index a38e58d348..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FileReaderUnitTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.fileparser;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-public class FileReaderUnitTest {
-
- protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
-
- @Test
- public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
- List lines = FileReaderExample.generateArrayListFromFile(TEXT_FILENAME);
- assertTrue("File does not has 2 lines", lines.size() == 2);
- }
-}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FilesReadAllLinesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FilesReadAllLinesUnitTest.java
deleted file mode 100644
index c0b742fd47..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/FilesReadAllLinesUnitTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.fileparser;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-public class FilesReadAllLinesUnitTest {
-
- protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
-
- @Test
- public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
- List lines = FilesReadLinesExample.generateArrayListFromFile(TEXT_FILENAME);
- assertTrue("File does not has 2 lines", lines.size() == 2);
- }
-}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerIntUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerIntUnitTest.java
deleted file mode 100644
index 0a398ba7c6..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerIntUnitTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.fileparser;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-public class ScannerIntUnitTest {
-
- protected static final String NUMBER_FILENAME = "src/test/resources/sampleNumberFile.txt";
-
- @Test
- public void whenParsingExistingTextFile_thenGetIntArrayList() throws IOException {
- List numbers = ScannerIntExample.generateArrayListFromFile(NUMBER_FILENAME);
- assertTrue("File does not has 2 lines", numbers.size() == 2);
- }
-}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerStringUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerStringUnitTest.java
deleted file mode 100644
index 8f9b0a56c0..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/fileparser/ScannerStringUnitTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.fileparser;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.junit.Test;
-
-public class ScannerStringUnitTest {
-
- protected static final String TEXT_FILENAME = "src/test/resources/sampleTextFile.txt";
-
- @Test
- public void whenParsingExistingTextFile_thenGetArrayList() throws IOException {
- List lines = ScannerStringExample.generateArrayListFromFile(TEXT_FILENAME);
- assertTrue("File does not has 2 lines", lines.size() == 2);
- }
-}
diff --git a/core-java-modules/core-java/src/test/resources/sampleNumberFile.txt b/core-java-modules/core-java/src/test/resources/sampleNumberFile.txt
deleted file mode 100644
index 7787faa3c1..0000000000
--- a/core-java-modules/core-java/src/test/resources/sampleNumberFile.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-111
-222
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/test/resources/sampleTextFile.txt b/core-java-modules/core-java/src/test/resources/sampleTextFile.txt
deleted file mode 100644
index 75cb50aafa..0000000000
--- a/core-java-modules/core-java/src/test/resources/sampleTextFile.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Hello
-World
\ No newline at end of file
diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml
index 91ceddaadd..8773456285 100644
--- a/persistence-modules/jnosql/pom.xml
+++ b/persistence-modules/jnosql/pom.xml
@@ -17,8 +17,8 @@
- jnosql-diana
jnosql-artemis
+ jnosql-diana
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index de20b135fa..ce1f0d2163 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -18,28 +18,34 @@
apache-cayenne
core-java-persistence
deltaspike
+ elasticsearch
flyway
hbase
hibernate5
- hibernate-ogm
- hibernate-mapping
hibernate5-2
+ hibernate-mapping
+ hibernate-ogm
influxdb
java-cassandra
java-cockroachdb
java-jdbi
- java-jpa
- java-jpa-2
- java-mongodb
- persistence-libraries
- jnosql
+ java-jpa
+ java-jpa-2
+ java-mongodb
+ jnosql
+ jpa-hibernate-cascade-type
liquibase
orientdb
+ persistence-libraries
querydsl
+ r2dbc
redis
+
solr
- spring-boot-persistence-h2
+ spring-boot-jdbi
+ spring-boot-mysql
spring-boot-persistence
+ spring-boot-persistence-h2
spring-boot-persistence-mongodb
spring-data-cassandra
spring-data-cassandra-reactive
@@ -50,19 +56,20 @@
spring-data-gemfire
spring-data-geode
spring-data-jpa
+ spring-data-jpa-2
spring-data-jpa-3
+ spring-data-jpa-4
spring-data-keyvalue
- spring-data-mongodb
+ spring-data-mongodb
spring-data-neo4j
spring-data-redis
spring-data-solr
spring-hibernate-3
- spring-hibernate-5
+ spring-hibernate-5
spring-hibernate4
spring-jpa
+
spring-persistence-simple
- jpa-hibernate-cascade-type
- r2dbc
- spring-boot-jdbi
+
diff --git a/persistence-modules/spring-data-jpa-2/README.md b/persistence-modules/spring-data-jpa-2/README.md
index 1f7de81c02..d1875d91d4 100644
--- a/persistence-modules/spring-data-jpa-2/README.md
+++ b/persistence-modules/spring-data-jpa-2/README.md
@@ -9,7 +9,3 @@
- [JPA @Embedded And @Embeddable](https://www.baeldung.com/jpa-embedded-embeddable)
- [Spring Data JPA Delete and Relationships](https://www.baeldung.com/spring-data-jpa-delete)
- [Spring Data JPA and Named Entity Graphs](https://www.baeldung.com/spring-data-jpa-named-entity-graphs)
-- [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update)
-- [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush)
-- [Derived Query Methods in Spring Data JPA Repositories](https://www.baeldung.com/spring-data-derived-queries)
-- [LIKE Queries in Spring JPA Repositories](https://www.baeldung.com/spring-jpa-like-queries)
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java
index 9f92909b66..5055252adf 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java
+++ b/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/FruitRepository.java
@@ -23,5 +23,5 @@ public interface FruitRepository extends JpaRepository {
@Modifying
@Query("delete from Fruit f where f.name=:name or f.color=:color")
- List deleteFruits(@Param("name") String name, @Param("color") String color);
+ int deleteFruits(@Param("name") String name, @Param("color") String color);
}
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java
similarity index 92%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java
rename to persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java
index 29ef52dcef..4d3661e717 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorTest.java
+++ b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitPopulatorIntegrationTest.java
@@ -14,7 +14,7 @@ import com.baeldung.entity.Fruit;
@RunWith(SpringRunner.class)
@SpringBootTest
-public class FruitPopulatorTest {
+public class FruitPopulatorIntegrationTest {
@Autowired
private FruitRepository fruitRepository;
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java
index 866cf1157b..cf771dc833 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/FruitRepositoryIntegrationTest.java
@@ -1,7 +1,6 @@
package com.baeldung.repository;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import java.util.List;
@@ -69,9 +68,8 @@ class FruitRepositoryIntegrationTest {
@Sql(scripts = { "/test-fruit-data.sql" })
public void givenFruits_WhenDeletedByColorOrName_ThenDeletedFruitsShouldReturn() {
- List fruits = fruitRepository.deleteFruits("apple", "green");
+ int deletedCount = fruitRepository.deleteFruits("apple", "green");
- assertEquals("number of fruits are not matching", 3, fruits.size());
- fruits.forEach(fruit -> assertTrue("Its not a green fruit or apple", ("green".equals(fruit.getColor())) || "apple".equals(fruit.getColor())));
+ assertEquals("number of fruits are not matching", 3, deletedCount);
}
}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java
index c3d0636881..14912a4ecb 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/SongRepositoryIntegrationTest.java
@@ -1,7 +1,10 @@
package com.baeldung.repository;
-import com.baeldung.entity.Song;
-import org.junit.jupiter.api.Test;
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@@ -9,9 +12,7 @@ import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
+import com.baeldung.entity.Song;
@RunWith(SpringRunner.class)
@SpringBootTest
diff --git a/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql b/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql
index ce2189121f..d99f42e5a7 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql
+++ b/persistence-modules/spring-data-jpa-2/src/test/resources/test-fruit-data.sql
@@ -1,4 +1,6 @@
-insert into fruit(id,name,color) values (1,'apple','red');
-insert into fruit(id,name,color) values (2,'custard apple','green');
-insert into fruit(id,name,color) values (3,'mango','yellow');
+truncate table fruit;
+
+insert into fruit(id,name,color) values (1,'apple','red');
+insert into fruit(id,name,color) values (2,'custard apple','green');
+insert into fruit(id,name,color) values (3,'mango','yellow');
insert into fruit(id,name,color) values (4,'guava','green');
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-3/README.md b/persistence-modules/spring-data-jpa-3/README.md
index 28e62a9de1..a86c1e5ec2 100644
--- a/persistence-modules/spring-data-jpa-3/README.md
+++ b/persistence-modules/spring-data-jpa-3/README.md
@@ -1,3 +1,21 @@
-### Relevant Articles:
+### Relevant Articles:
+- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results)
+- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting)
+- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
+- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
+- [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example)
+- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
+- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
+- [Spring Data JPA Batch Inserts](https://www.baeldung.com/spring-data-jpa-batch-inserts)
+- [Batch Insert/Update with Hibernate/JPA](https://www.baeldung.com/jpa-hibernate-batch-insert-update)
+- [Difference Between save() and saveAndFlush() in Spring Data JPA](https://www.baeldung.com/spring-data-jpa-save-saveandflush)
- [Programmatic Transaction Management in Spring](https://www.baeldung.com/spring-programmatic-transaction-management)
+### Eclipse Config
+After importing the project into Eclipse, you may see the following error:
+"No persistence xml file found in project"
+
+This can be ignored:
+- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
+Or:
+- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
diff --git a/persistence-modules/spring-data-jpa-3/pom.xml b/persistence-modules/spring-data-jpa-3/pom.xml
index 32f81d5745..99df250a9a 100644
--- a/persistence-modules/spring-data-jpa-3/pom.xml
+++ b/persistence-modules/spring-data-jpa-3/pom.xml
@@ -26,6 +26,29 @@
org.springframework.boot
spring-boot-starter-data-jpa
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ com.h2database
+ h2
+
+
+ net.ttddyy
+ datasource-proxy
+ ${datasource-proxy.version}
+
+
+ org.postgresql
+ postgresql
+ ${postgresql.version}
+
com.h2database
h2
@@ -61,10 +84,23 @@
${junit-platform.version}
test
+
+
+
+ org.testcontainers
+ postgresql
+ ${testcontainers.version}
+ test
+
+
+ 1.4.1
+ 21.0
+ 1.12.2
+ 42.2.8
+ 1.12.2
1.4.200
-
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/DatasourceProxyBeanPostProcessor.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/DatasourceProxyBeanPostProcessor.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/DatasourceProxyBeanPostProcessor.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/DatasourceProxyBeanPostProcessor.java
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/model/School.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/model/School.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/model/School.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/model/School.java
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/model/Student.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/model/Student.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/batchinserts/model/Student.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/batchinserts/model/Student.java
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/Application.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/Application.java
new file mode 100644
index 0000000000..aaca760499
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/Application.java
@@ -0,0 +1,17 @@
+package com.baeldung.boot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@SpringBootApplication
+@EnableJpaRepositories("com.baeldung")
+@EntityScan("com.baeldung")
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/PersonInsertRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/impl/PersonInsertRepository.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/PersonInsertRepository.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/impl/PersonInsertRepository.java
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepository.java
new file mode 100644
index 0000000000..53f692ff28
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepository.java
@@ -0,0 +1,99 @@
+package com.baeldung.boot.daos.user;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import com.baeldung.boot.domain.User;
+
+import java.time.LocalDate;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Stream;
+
+public interface UserRepository extends JpaRepository , UserRepositoryCustom{
+
+ Stream findAllByName(String name);
+
+ @Query("SELECT u FROM User u WHERE u.status = 1")
+ Collection findAllActiveUsers();
+
+ @Query("select u from User u where u.email like '%@gmail.com'")
+ List findUsersWithGmailAddress();
+
+ @Query(value = "SELECT * FROM Users u WHERE u.status = 1", nativeQuery = true)
+ Collection findAllActiveUsersNative();
+
+ @Query("SELECT u FROM User u WHERE u.status = ?1")
+ User findUserByStatus(Integer status);
+
+ @Query(value = "SELECT * FROM Users u WHERE u.status = ?1", nativeQuery = true)
+ User findUserByStatusNative(Integer status);
+
+ @Query("SELECT u FROM User u WHERE u.status = ?1 and u.name = ?2")
+ User findUserByStatusAndName(Integer status, String name);
+
+ @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
+ User findUserByStatusAndNameNamedParams(@Param("status") Integer status, @Param("name") String name);
+
+ @Query(value = "SELECT * FROM Users u WHERE u.status = :status AND u.name = :name", nativeQuery = true)
+ User findUserByStatusAndNameNamedParamsNative(@Param("status") Integer status, @Param("name") String name);
+
+ @Query("SELECT u FROM User u WHERE u.status = :status and u.name = :name")
+ User findUserByUserStatusAndUserName(@Param("status") Integer userStatus, @Param("name") String userName);
+
+ @Query("SELECT u FROM User u WHERE u.name like ?1%")
+ User findUserByNameLike(String name);
+
+ @Query("SELECT u FROM User u WHERE u.name like :name%")
+ User findUserByNameLikeNamedParam(@Param("name") String name);
+
+ @Query(value = "SELECT * FROM users u WHERE u.name LIKE ?1%", nativeQuery = true)
+ User findUserByNameLikeNative(String name);
+
+ @Query(value = "SELECT u FROM User u")
+ List findAllUsers(Sort sort);
+
+ @Query(value = "SELECT u FROM User u ORDER BY id")
+ Page findAllUsersWithPagination(Pageable pageable);
+
+ @Query(value = "SELECT * FROM Users ORDER BY id", countQuery = "SELECT count(*) FROM Users", nativeQuery = true)
+ Page findAllUsersWithPaginationNative(Pageable pageable);
+
+ @Modifying
+ @Query("update User u set u.status = :status where u.name = :name")
+ int updateUserSetStatusForName(@Param("status") Integer status, @Param("name") String name);
+
+ @Modifying
+ @Query(value = "UPDATE Users u SET u.status = ? WHERE u.name = ?", nativeQuery = true)
+ int updateUserSetStatusForNameNative(Integer status, String name);
+
+ @Query(value = "INSERT INTO Users (name, age, email, status, active) VALUES (:name, :age, :email, :status, :active)", nativeQuery = true)
+ @Modifying
+ void insertUser(@Param("name") String name, @Param("age") Integer age, @Param("email") String email, @Param("status") Integer status, @Param("active") boolean active);
+
+ @Modifying
+ @Query(value = "UPDATE Users u SET status = ? WHERE u.name = ?", nativeQuery = true)
+ int updateUserSetStatusForNameNativePostgres(Integer status, String name);
+
+ @Query(value = "SELECT u FROM User u WHERE u.name IN :names")
+ List findUserByNameList(@Param("names") Collection names);
+
+ void deleteAllByCreationDateAfter(LocalDate date);
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query("update User u set u.active = false where u.lastLoginDate < :date")
+ void deactivateUsersNotLoggedInSince(@Param("date") LocalDate date);
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query("delete User u where u.active = false")
+ int deleteDeactivatedUsers();
+
+ @Modifying(clearAutomatically = true, flushAutomatically = true)
+ @Query(value = "alter table USERS add column deleted int(1) not null default 0", nativeQuery = true)
+ void addDeletedColumn();
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustom.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustom.java
new file mode 100644
index 0000000000..c586b54027
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustom.java
@@ -0,0 +1,14 @@
+package com.baeldung.boot.daos.user;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Predicate;
+
+import com.baeldung.boot.domain.User;
+
+public interface UserRepositoryCustom {
+ List findUserByEmails(Set emails);
+
+ List findAllUsersByPredicates(Collection> predicates);
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustomImpl.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustomImpl.java
new file mode 100644
index 0000000000..63a743b6b5
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/daos/user/UserRepositoryCustomImpl.java
@@ -0,0 +1,57 @@
+package com.baeldung.boot.daos.user;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Path;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+import com.baeldung.boot.domain.User;
+
+public class UserRepositoryCustomImpl implements UserRepositoryCustom {
+
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Override
+ public List findUserByEmails(Set emails) {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery query = cb.createQuery(User.class);
+ Root user = query.from(User.class);
+
+ Path emailPath = user.get("email");
+
+ List predicates = new ArrayList<>();
+ for (String email : emails) {
+
+ predicates.add(cb.like(emailPath, email));
+
+ }
+ query.select(user)
+ .where(cb.or(predicates.toArray(new Predicate[predicates.size()])));
+
+ return entityManager.createQuery(query)
+ .getResultList();
+ }
+
+ @Override
+ public List findAllUsersByPredicates(Collection> predicates) {
+ List allUsers = entityManager.createQuery("select u from User u", User.class).getResultList();
+ Stream allUsersStream = allUsers.stream();
+ for (java.util.function.Predicate predicate : predicates) {
+ allUsersStream = allUsersStream.filter(predicate);
+ }
+
+ return allUsersStream.collect(Collectors.toList());
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/domain/Customer.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Customer.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/domain/Customer.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Customer.java
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/domain/Person.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Person.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/domain/Person.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Person.java
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Possession.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Possession.java
new file mode 100644
index 0000000000..f13491ad82
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/Possession.java
@@ -0,0 +1,83 @@
+package com.baeldung.boot.domain;
+
+import javax.persistence.*;
+import com.baeldung.boot.domain.Possession;
+
+@Entity
+@Table
+public class Possession {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private long id;
+
+ private String name;
+
+ public Possession() {
+ super();
+ }
+
+ public Possession(final String name) {
+ super();
+
+ this.name = name;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = (prime * result) + (int) (id ^ (id >>> 32));
+ result = (prime * result) + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+ final Possession other = (Possession) obj;
+ if (id != other.id) {
+ return false;
+ }
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("Possesion [id=").append(id).append(", name=").append(name).append("]");
+ return builder.toString();
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/User.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/User.java
new file mode 100644
index 0000000000..cca00e52a2
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/domain/User.java
@@ -0,0 +1,132 @@
+package com.baeldung.boot.domain;
+
+import javax.persistence.*;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Objects;
+
+@Entity
+@Table(name = "users")
+public class User {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private int id;
+ private String name;
+ private LocalDate creationDate;
+ private LocalDate lastLoginDate;
+ private boolean active;
+ private int age;
+ @Column(unique = true, nullable = false)
+ private String email;
+ private Integer status;
+ @OneToMany
+ List possessionList;
+
+ public User() {
+ super();
+ }
+
+ public User(String name, LocalDate creationDate,String email, Integer status) {
+ this.name = name;
+ this.creationDate = creationDate;
+ this.email = email;
+ this.status = status;
+ this.active = true;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(final String email) {
+ this.email = email;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(final int age) {
+ this.age = age;
+ }
+
+ public LocalDate getCreationDate() {
+ return creationDate;
+ }
+
+ public List getPossessionList() {
+ return possessionList;
+ }
+
+ public void setPossessionList(List possessionList) {
+ this.possessionList = possessionList;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("User [name=").append(name).append(", id=").append(id).append("]");
+ return builder.toString();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ User user = (User) o;
+ return id == user.id &&
+ age == user.age &&
+ Objects.equals(name, user.name) &&
+ Objects.equals(creationDate, user.creationDate) &&
+ Objects.equals(email, user.email) &&
+ Objects.equals(status, user.status);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, creationDate, age, email, status);
+ }
+
+ public LocalDate getLastLoginDate() {
+ return lastLoginDate;
+ }
+
+ public void setLastLoginDate(LocalDate lastLoginDate) {
+ this.lastLoginDate = lastLoginDate;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/CustomPassengerRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/CustomPassengerRepository.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/CustomPassengerRepository.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/CustomPassengerRepository.java
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/Passenger.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/Passenger.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/Passenger.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/Passenger.java
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java
similarity index 98%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java
index cdb8cc98fb..14d5403cb5 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/PassengerRepository.java
@@ -1,10 +1,10 @@
package com.baeldung.boot.passenger;
+import java.util.List;
+
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
-import java.util.List;
-
interface PassengerRepository extends JpaRepository, CustomPassengerRepository {
Passenger findFirstByOrderBySeatNumberAsc();
@@ -12,11 +12,11 @@ interface PassengerRepository extends JpaRepository, CustomPass
Passenger findTopByOrderBySeatNumberAsc();
List findByOrderBySeatNumberAsc();
-
- List findByLastNameOrderBySeatNumberAsc(String lastName);
-
- List findByLastName(String lastName, Sort sort);
List findByFirstNameIgnoreCase(String firstName);
+ List findByLastNameOrderBySeatNumberAsc(String lastName);
+
+ List findByLastName(String lastName, Sort sort);
+
}
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/PassengerRepositoryImpl.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/PassengerRepositoryImpl.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/passenger/PassengerRepositoryImpl.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/boot/passenger/PassengerRepositoryImpl.java
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Employee.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/entity/Employee.java
similarity index 93%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Employee.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/entity/Employee.java
index 135439863f..4c3dbd25b7 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/entity/Employee.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/entity/Employee.java
@@ -1,36 +1,36 @@
-package com.baeldung.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-@Entity
-public class Employee {
-
- @Id
- private Long id;
- private String name;
-
- public Employee() {
- }
-
- public Employee(Long id, String name) {
- this.id = id;
- this.name = name;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
+package com.baeldung.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+@Entity
+public class Employee {
+
+ @Id
+ private Long id;
+ private String name;
+
+ public Employee() {
+ }
+
+ public Employee(Long id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/User.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/BasicUser.java
similarity index 96%
rename from persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/User.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/BasicUser.java
index 94d0c023f2..2dc9c18cf6 100644
--- a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/User.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/model/BasicUser.java
@@ -5,7 +5,7 @@ import java.util.Set;
@Entity
@Table(name = "users")
-public class User {
+public class BasicUser {
@Id
@GeneratedValue
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java
new file mode 100644
index 0000000000..3b9aa2cc18
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/MultipleDbApplication.java
@@ -0,0 +1,14 @@
+package com.baeldung.multipledb;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class MultipleDbApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(MultipleDbApplication.class, args);
+ }
+
+}
+
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java
new file mode 100644
index 0000000000..bcf2cd84eb
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/PersistenceProductConfiguration.java
@@ -0,0 +1,68 @@
+package com.baeldung.multipledb;
+
+import com.google.common.base.Preconditions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+
+@Configuration
+@PropertySource({"classpath:persistence-multiple-db.properties"})
+@EnableJpaRepositories(basePackages = "com.baeldung.multipledb.dao.product", entityManagerFactoryRef = "productEntityManager", transactionManagerRef = "productTransactionManager")
+@Profile("!tc")
+public class PersistenceProductConfiguration {
+ @Autowired
+ private Environment env;
+
+ public PersistenceProductConfiguration() {
+ super();
+ }
+
+ //
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean productEntityManager() {
+ final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(productDataSource());
+ em.setPackagesToScan("com.baeldung.multipledb.model.product");
+
+ final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ em.setJpaVendorAdapter(vendorAdapter);
+ final HashMap properties = new HashMap();
+ properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ em.setJpaPropertyMap(properties);
+
+ return em;
+ }
+
+ @Bean
+ public DataSource productDataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("product.jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager productTransactionManager() {
+ final JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(productEntityManager().getObject());
+ return transactionManager;
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java
new file mode 100644
index 0000000000..022099eed0
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java
@@ -0,0 +1,13 @@
+package com.baeldung.multipledb.dao.product;
+
+import java.util.List;
+
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import com.baeldung.multipledb.model.product.ProductMultipleDB;
+
+public interface ProductRepository extends PagingAndSortingRepository {
+
+ List findAllByPrice(double price, Pageable pageable);
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/model/product/ProductMultipleDB.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/model/product/ProductMultipleDB.java
new file mode 100644
index 0000000000..8bdff340ac
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/multipledb/model/product/ProductMultipleDB.java
@@ -0,0 +1,67 @@
+package com.baeldung.multipledb.model.product;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(schema = "products")
+public class ProductMultipleDB {
+
+ @Id
+ private int id;
+
+ private String name;
+
+ private double price;
+
+ public ProductMultipleDB() {
+ super();
+ }
+
+ private ProductMultipleDB(int id, String name, double price) {
+ super();
+ this.id = id;
+ this.name = name;
+ this.price = price;
+ }
+
+ public static ProductMultipleDB from(int id, String name, double price) {
+ return new ProductMultipleDB(id, name, price);
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(final int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(final double price) {
+ this.price = price;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("Product [name=")
+ .append(name)
+ .append(", id=")
+ .append(id)
+ .append("]");
+ return builder.toString();
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/EmployeeRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/EmployeeRepository.java
similarity index 95%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/EmployeeRepository.java
rename to persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/EmployeeRepository.java
index 2c4fee80e0..8f0a80814b 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/repository/EmployeeRepository.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/EmployeeRepository.java
@@ -1,9 +1,9 @@
-package com.baeldung.repository;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.baeldung.entity.Employee;
-
-public interface EmployeeRepository extends JpaRepository {
-
-}
+package com.baeldung.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.baeldung.entity.Employee;
+
+public interface EmployeeRepository extends JpaRepository {
+
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/UserRepository.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/UserRepository.java
index bb3ce781f6..c656055751 100644
--- a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/UserRepository.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/repository/UserRepository.java
@@ -1,17 +1,17 @@
package com.baeldung.repository;
-import com.baeldung.model.User;
+import com.baeldung.model.BasicUser;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
-public interface UserRepository extends JpaRepository {
+public interface UserRepository extends JpaRepository {
@EntityGraph(attributePaths = "permissions")
- Optional findDetailedByUsername(String username);
+ Optional findDetailedByUsername(String username);
- Optional findSummaryByUsername(String username);
+ Optional findSummaryByUsername(String username);
- Optional findByUsername(String username);
+ Optional findByUsername(String username);
}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/SimpleUserService.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/SimpleUserService.java
index 6782254f61..4bd1dc5e41 100644
--- a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/SimpleUserService.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/SimpleUserService.java
@@ -1,6 +1,6 @@
package com.baeldung.service;
-import com.baeldung.model.User;
+import com.baeldung.model.BasicUser;
import com.baeldung.repository.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -18,7 +18,7 @@ public class SimpleUserService implements UserService {
@Override
@Transactional(readOnly = true)
- public Optional findOne(String username) {
+ public Optional findOne(String username) {
return userRepository.findDetailedByUsername(username);
}
}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/UserService.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/UserService.java
index 11b3dc82ce..34a07199b2 100644
--- a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/UserService.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/service/UserService.java
@@ -1,9 +1,9 @@
package com.baeldung.service;
-import com.baeldung.model.User;
+import com.baeldung.model.BasicUser;
import java.util.Optional;
public interface UserService {
- Optional findOne(String username);
+ Optional findOne(String username);
}
diff --git a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/web/DetailedUserDto.java b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/web/DetailedUserDto.java
index 0d8fe02b91..95a4f6eb07 100644
--- a/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/web/DetailedUserDto.java
+++ b/persistence-modules/spring-data-jpa-3/src/main/java/com/baeldung/web/DetailedUserDto.java
@@ -1,6 +1,6 @@
package com.baeldung.web;
-import com.baeldung.model.User;
+import com.baeldung.model.BasicUser;
import java.util.Set;
@@ -34,7 +34,7 @@ public class DetailedUserDto {
this.permissions = permissions;
}
- public static DetailedUserDto fromEntity(User user) {
+ public static DetailedUserDto fromEntity(BasicUser user) {
DetailedUserDto detailed = new DetailedUserDto();
detailed.setId(user.getId());
detailed.setUsername(user.getUsername());
diff --git a/persistence-modules/spring-data-jpa-3/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-3/src/main/resources/application.properties
new file mode 100644
index 0000000000..f127dd5e50
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.main.allow-bean-definition-overriding=true
+
+spring.jpa.properties.hibernate.jdbc.batch_size=4
+spring.jpa.properties.hibernate.order_inserts=true
+spring.jpa.properties.hibernate.order_updates=true
+spring.jpa.properties.hibernate.generate_statistics=true
diff --git a/persistence-modules/spring-data-jpa-3/src/main/resources/logback.xml b/persistence-modules/spring-data-jpa-3/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-3/src/main/resources/persistence-multiple-db.properties b/persistence-modules/spring-data-jpa-3/src/main/resources/persistence-multiple-db.properties
new file mode 100644
index 0000000000..75534e8a54
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/main/resources/persistence-multiple-db.properties
@@ -0,0 +1,13 @@
+# jdbc.X
+jdbc.driverClassName=org.h2.Driver
+user.jdbc.url=jdbc:h2:mem:spring_jpa_user;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS USERS
+product.jdbc.url=jdbc:h2:mem:spring_jpa_product;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS PRODUCTS
+jdbc.user=sa
+jdbc.pass=sa
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=false
+hibernate.hbm2ddl.auto=create-drop
+hibernate.cache.use_second_level_cache=false
+hibernate.cache.use_query_cache=false
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextIntegrationTest.java
new file mode 100644
index 0000000000..a986cc7e21
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextIntegrationTest.java
@@ -0,0 +1,17 @@
+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.baeldung.boot.Application;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class SpringContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextTest.java
new file mode 100644
index 0000000000..eaccf4acba
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringContextTest.java
@@ -0,0 +1,17 @@
+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.baeldung.boot.Application;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class SpringContextTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringJpaContextIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringJpaContextIntegrationTest.java
new file mode 100644
index 0000000000..27c71c5bcc
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/SpringJpaContextIntegrationTest.java
@@ -0,0 +1,19 @@
+package com.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.boot.Application;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+@ContextConfiguration(classes = Application.class)
+public class SpringJpaContextIntegrationTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/BatchInsertIntegrationTest.java
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java
similarity index 97%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java
index 9e81dbc04d..311f227322 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaBatchInsertsIntegrationTest.java
@@ -3,12 +3,12 @@ package com.baeldung.batchinserts;
import static com.baeldung.batchinserts.TestObjectHelper.createSchool;
import static com.baeldung.batchinserts.TestObjectHelper.createStudent;
-import com.baeldung.batchinserts.model.School;
-import com.baeldung.batchinserts.model.Student;
import java.util.List;
+
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
+
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -17,8 +17,12 @@ import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
+import com.baeldung.batchinserts.model.School;
+import com.baeldung.batchinserts.model.Student;
+import com.baeldung.boot.Application;
+
@RunWith(SpringRunner.class)
-@SpringBootTest
+@SpringBootTest(classes = Application.class)
@Transactional
@ActiveProfiles("batchinserts")
public class JpaBatchInsertsIntegrationTest {
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java
similarity index 93%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java
index 20502c793d..75b3f1f3aa 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/JpaNoBatchInsertsIntegrationTest.java
@@ -3,6 +3,8 @@ package com.baeldung.batchinserts;
import static com.baeldung.batchinserts.TestObjectHelper.createSchool;
import com.baeldung.batchinserts.model.School;
+import com.baeldung.boot.Application;
+
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.junit.After;
@@ -15,7 +17,7 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringRunner.class)
-@SpringBootTest
+@SpringBootTest(classes = Application.class)
@Transactional
@ActiveProfiles("batchinserts")
@TestPropertySource(properties = "spring.jpa.properties.hibernate.jdbc.batch_size=-1")
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/TestObjectHelper.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/TestObjectHelper.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/batchinserts/TestObjectHelper.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/batchinserts/TestObjectHelper.java
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/CustomerRepository.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/CustomerRepository.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/CustomerRepository.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/CustomerRepository.java
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/PersonInsertRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/PersonInsertRepositoryIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/PersonInsertRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/PersonInsertRepositoryIntegrationTest.java
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java
new file mode 100644
index 0000000000..17ee6a94ba
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryCommon.java
@@ -0,0 +1,545 @@
+package com.baeldung.boot.daos;
+
+import org.junit.After;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.JpaSort;
+import org.springframework.data.mapping.PropertyReferenceException;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.baeldung.boot.daos.user.UserRepository;
+import com.baeldung.boot.domain.User;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.*;
+
+public class UserRepositoryCommon {
+
+ final String USER_EMAIL = "email@example.com";
+ final String USER_EMAIL2 = "email2@example.com";
+ final String USER_EMAIL3 = "email3@example.com";
+ final String USER_EMAIL4 = "email4@example.com";
+ final Integer INACTIVE_STATUS = 0;
+ final Integer ACTIVE_STATUS = 1;
+ final String USER_EMAIL5 = "email5@example.com";
+ final String USER_EMAIL6 = "email6@example.com";
+ final String USER_NAME_ADAM = "Adam";
+ final String USER_NAME_PETER = "Peter";
+
+ @Autowired
+ protected UserRepository userRepository;
+ @Autowired
+ private EntityManager entityManager;
+
+ @Test
+ @Transactional
+ public void givenUsersWithSameNameInDB_WhenFindAllByName_ThenReturnStreamOfUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ userRepository.save(user3);
+
+ User user4 = new User();
+ user4.setName("SAMPLE");
+ user4.setEmail(USER_EMAIL4);
+ userRepository.save(user4);
+
+ try (Stream foundUsersStream = userRepository.findAllByName(USER_NAME_ADAM)) {
+ assertThat(foundUsersStream.count()).isEqualTo(3l);
+ }
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithQueryAnnotation_ThenReturnCollectionWithActiveUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ user1.setStatus(ACTIVE_STATUS);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ user3.setStatus(INACTIVE_STATUS);
+ userRepository.save(user3);
+
+ Collection allActiveUsers = userRepository.findAllActiveUsers();
+
+ assertThat(allActiveUsers.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithQueryAnnotationNative_ThenReturnCollectionWithActiveUsers() {
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ user1.setStatus(ACTIVE_STATUS);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_ADAM);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setName(USER_NAME_ADAM);
+ user3.setEmail(USER_EMAIL3);
+ user3.setStatus(INACTIVE_STATUS);
+ userRepository.save(user3);
+
+ Collection allActiveUsers = userRepository.findAllActiveUsersNative();
+
+ assertThat(allActiveUsers.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUserInDB_WhenFindUserByStatusWithQueryAnnotation_ThenReturnActiveUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByStatus(ACTIVE_STATUS);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUserInDB_WhenFindUserByStatusWithQueryAnnotationNative_ThenReturnActiveUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByStatusNative(ACTIVE_STATUS);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationIndexedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndName(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNamedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndNameNamedParams(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNativeNamedParams_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByStatusAndNameNamedParamsNative(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByStatusAndNameWithQueryAnnotationNamedParamsCustomNames_ThenReturnOneUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ user2.setStatus(ACTIVE_STATUS);
+ userRepository.save(user2);
+
+ User userByStatus = userRepository.findUserByUserStatusAndUserName(ACTIVE_STATUS, USER_NAME_ADAM);
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationIndexedParams_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLike("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationNamedParams_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLikeNamedParam("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindUserByNameLikeWithQueryAnnotationNative_ThenReturnUser() {
+ User user = new User();
+ user.setName(USER_NAME_ADAM);
+ user.setEmail(USER_EMAIL);
+ user.setStatus(ACTIVE_STATUS);
+ userRepository.save(user);
+
+ User userByStatus = userRepository.findUserByNameLikeNative("Ad");
+
+ assertThat(userByStatus.getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithSortByName_ThenReturnUsersSorted() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ List usersSortByName = userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
+
+ assertThat(usersSortByName.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test(expected = PropertyReferenceException.class)
+ public void givenUsersInDB_WhenFindAllSortWithFunction_ThenThrowException() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ userRepository.findAll(new Sort(Sort.Direction.ASC, "name"));
+
+ List usersSortByNameLength = userRepository.findAll(Sort.by("LENGTH(name)"));
+
+ assertThat(usersSortByNameLength.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllSortWithFunctionQueryAnnotationJPQL_ThenReturnUsersSorted() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+
+ userRepository.findAllUsers(Sort.by("name"));
+
+ List usersSortByNameLength = userRepository.findAllUsers(JpaSort.unsafe("LENGTH(name)"));
+
+ assertThat(usersSortByNameLength.get(0)
+ .getName()).isEqualTo(USER_NAME_ADAM);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithPageRequestQueryAnnotationJPQL_ThenReturnPageOfUsers() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL4, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE2", LocalDate.now(), USER_EMAIL5, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL6, INACTIVE_STATUS));
+
+ Page usersPage = userRepository.findAllUsersWithPagination(PageRequest.of(1, 3));
+
+ assertThat(usersPage.getContent()
+ .get(0)
+ .getName()).isEqualTo("SAMPLE1");
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindAllWithPageRequestQueryAnnotationNative_ThenReturnPageOfUsers() {
+ userRepository.save(new User(USER_NAME_ADAM, LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User(USER_NAME_PETER, LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL4, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE2", LocalDate.now(), USER_EMAIL5, INACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL6, INACTIVE_STATUS));
+
+ Page usersSortByNameLength = userRepository.findAllUsersWithPaginationNative(PageRequest.of(1, 3));
+
+ assertThat(usersSortByNameLength.getContent()
+ .get(0)
+ .getName()).isEqualTo(USER_NAME_PETER);
+ }
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationJPQL_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForName(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDB_WhenFindByEmailsWithDynamicQuery_ThenReturnCollection() {
+
+ User user1 = new User();
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ User user3 = new User();
+ user3.setEmail(USER_EMAIL3);
+ userRepository.save(user3);
+
+ Set emails = new HashSet<>();
+ emails.add(USER_EMAIL2);
+ emails.add(USER_EMAIL3);
+
+ Collection usersWithEmails = userRepository.findUserByEmails(emails);
+
+ assertThat(usersWithEmails.size()).isEqualTo(2);
+ }
+
+ @Test
+ public void givenUsersInDBWhenFindByNameListReturnCollection() {
+
+ User user1 = new User();
+ user1.setName(USER_NAME_ADAM);
+ user1.setEmail(USER_EMAIL);
+ userRepository.save(user1);
+
+ User user2 = new User();
+ user2.setName(USER_NAME_PETER);
+ user2.setEmail(USER_EMAIL2);
+ userRepository.save(user2);
+
+ List names = Arrays.asList(USER_NAME_ADAM, USER_NAME_PETER);
+
+ List usersWithNames = userRepository.findUserByNameList(names);
+
+ assertThat(usersWithNames.size()).isEqualTo(2);
+ }
+
+
+ @Test
+ @Transactional
+ public void whenInsertedWithQuery_ThenUserIsPersisted() {
+ userRepository.insertUser(USER_NAME_ADAM, 1, USER_EMAIL, ACTIVE_STATUS, true);
+ userRepository.insertUser(USER_NAME_PETER, 1, USER_EMAIL2, ACTIVE_STATUS, true);
+
+ User userAdam = userRepository.findUserByNameLike(USER_NAME_ADAM);
+ User userPeter = userRepository.findUserByNameLike(USER_NAME_PETER);
+
+ assertThat(userAdam).isNotNull();
+ assertThat(userAdam.getEmail()).isEqualTo(USER_EMAIL);
+ assertThat(userPeter).isNotNull();
+ assertThat(userPeter.getEmail()).isEqualTo(USER_EMAIL2);
+ }
+
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenFindByNameUsr01_ThenUserUsr01() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ try (Stream users = userRepository.findAllByName("usr01")) {
+ assertTrue(users.allMatch(usr -> usr.equals(usr01)));
+ }
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenFindByNameUsr00_ThenNoUsers() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ try (Stream users = userRepository.findAllByName("usr00")) {
+ assertEquals(0, users.count());
+ }
+ }
+
+ @Test
+ public void givenTwoUsers_whenFindUsersWithGmailAddress_ThenUserUsr02() {
+ User usr01 = new User("usr01", LocalDate.now(), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.now(), "usr02@gmail.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ List users = userRepository.findUsersWithGmailAddress();
+ assertEquals(1, users.size());
+ assertEquals(usr02, users.get(0));
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeleteAllByCreationDateAfter_ThenOneUserRemains() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.com", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.deleteAllByCreationDateAfter(LocalDate.of(2018, 5, 1));
+
+ List users = userRepository.findAll();
+
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ }
+
+ @Test
+ public void givenTwoUsers_whenFindAllUsersByPredicates_ThenUserUsr01() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ List> predicates = new ArrayList<>();
+ predicates.add(usr -> usr.getCreationDate().isAfter(LocalDate.of(2017, 12, 31)));
+ predicates.add(usr -> usr.getEmail().endsWith(".com"));
+
+ List users = userRepository.findAllUsersByPredicates(predicates);
+
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeactivateUsersNotLoggedInSince_ThenUserUsr02Deactivated() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.deactivateUsersNotLoggedInSince(LocalDate.of(2018, 8, 1));
+
+ List users = userRepository.findAllUsers(Sort.by(Sort.Order.asc("name")));
+ assertTrue(users.get(0).isActive());
+ assertFalse(users.get(1).isActive());
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenDeleteDeactivatedUsers_ThenUserUsr02Deleted() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.com", 0);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+ usr02.setActive(false);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ int deletedUsersCount = userRepository.deleteDeactivatedUsers();
+
+ List users = userRepository.findAll();
+ assertEquals(1, users.size());
+ assertEquals(usr01, users.get(0));
+ assertEquals(1, deletedUsersCount);
+ }
+
+ @Test
+ @Transactional
+ public void givenTwoUsers_whenAddDeletedColumn_ThenUsersHaveDeletedColumn() {
+ User usr01 = new User("usr01", LocalDate.of(2018, 1, 1), "usr01@baeldung.com", 1);
+ usr01.setLastLoginDate(LocalDate.now());
+ User usr02 = new User("usr02", LocalDate.of(2018, 6, 1), "usr02@baeldung.org", 1);
+ usr02.setLastLoginDate(LocalDate.of(2018, 7, 20));
+ usr02.setActive(false);
+
+ userRepository.save(usr01);
+ userRepository.save(usr02);
+
+ userRepository.addDeletedColumn();
+
+ Query nativeQuery = entityManager.createNativeQuery("select deleted from USERS where NAME = 'usr01'");
+ assertEquals(0, nativeQuery.getResultList().get(0));
+ }
+
+ @After
+ public void cleanUp() {
+ userRepository.deleteAll();
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java
new file mode 100644
index 0000000000..99eabc8271
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.boot.daos;
+
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.User;
+import com.baeldung.util.BaeldungPostgresqlContainer;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Created by adam.
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+@ActiveProfiles({"tc", "tc-auto"})
+public class UserRepositoryTCAutoLiveTest extends UserRepositoryCommon {
+
+ @ClassRule
+ public static PostgreSQLContainer postgreSQLContainer = BaeldungPostgresqlContainer.getInstance();
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationNativePostgres_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+ userRepository.flush();
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForNameNativePostgres(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java
new file mode 100644
index 0000000000..be8843c166
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/daos/UserRepositoryTCLiveTest.java
@@ -0,0 +1,58 @@
+package com.baeldung.boot.daos;
+
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.User;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.util.TestPropertyValues;
+import org.springframework.context.ApplicationContextInitializer;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.transaction.annotation.Transactional;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+import java.time.LocalDate;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+@ActiveProfiles("tc")
+@ContextConfiguration(initializers = {UserRepositoryTCLiveTest.Initializer.class})
+public class UserRepositoryTCLiveTest extends UserRepositoryCommon {
+
+ @ClassRule
+ public static PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1")
+ .withDatabaseName("integration-tests-db")
+ .withUsername("sa")
+ .withPassword("sa");
+
+ @Test
+ @Transactional
+ public void givenUsersInDB_WhenUpdateStatusForNameModifyingQueryAnnotationNative_ThenModifyMatchingUsers() {
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE1", LocalDate.now(), USER_EMAIL2, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE", LocalDate.now(), USER_EMAIL3, ACTIVE_STATUS));
+ userRepository.save(new User("SAMPLE3", LocalDate.now(), USER_EMAIL4, ACTIVE_STATUS));
+ userRepository.flush();
+
+ int updatedUsersSize = userRepository.updateUserSetStatusForNameNativePostgres(INACTIVE_STATUS, "SAMPLE");
+
+ assertThat(updatedUsersSize).isEqualTo(2);
+ }
+
+ static class Initializer
+ implements ApplicationContextInitializer {
+ public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
+ TestPropertyValues.of(
+ "spring.datasource.url=" + postgreSQLContainer.getJdbcUrl(),
+ "spring.datasource.username=" + postgreSQLContainer.getUsername(),
+ "spring.datasource.password=" + postgreSQLContainer.getPassword()
+ ).applyTo(configurableApplicationContext.getEnvironment());
+ }
+ }
+}
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/passenger/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/passenger/PassengerRepositoryIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/passenger/PassengerRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/passenger/PassengerRepositoryIntegrationTest.java
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/web/controllers/CustomerController.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/web/controllers/CustomerController.java
similarity index 100%
rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/web/controllers/CustomerController.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/boot/web/controllers/CustomerController.java
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java
similarity index 97%
rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java
index 2c965f72f3..cdbb307d7f 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/multipledb/ProductRepositoryIntegrationTest.java
@@ -18,12 +18,10 @@ import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
-import com.baeldung.multipledb.PersistenceProductConfiguration;
import com.baeldung.multipledb.dao.product.ProductRepository;
import com.baeldung.multipledb.model.product.ProductMultipleDB;
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/osiv/UserControllerIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/osiv/UserControllerIntegrationTest.java
index ba94fc111b..19fdf118ae 100644
--- a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/osiv/UserControllerIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/osiv/UserControllerIntegrationTest.java
@@ -1,6 +1,6 @@
package com.baeldung.osiv;
-import com.baeldung.model.User;
+import com.baeldung.model.BasicUser;
import com.baeldung.repository.UserRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -32,7 +32,7 @@ class UserControllerIntegrationTest {
@BeforeEach
void setUp() {
- User user = new User();
+ BasicUser user = new BasicUser();
user.setUsername("root");
user.setPermissions(new HashSet<>(Arrays.asList("PERM_READ", "PERM_WRITE")));
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java
similarity index 89%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java
index ebeed276c9..0fc9918701 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/repository/EmployeeRepositoryIntegrationTest.java
@@ -5,13 +5,14 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
+import com.baeldung.boot.Application;
import com.baeldung.entity.Employee;
@RunWith(SpringRunner.class)
-@DataJpaTest
+@SpringBootTest(classes = Application.class)
public class EmployeeRepositoryIntegrationTest {
private static final Employee EMPLOYEE1 = new Employee(1L, "John");
@@ -25,7 +26,7 @@ public class EmployeeRepositoryIntegrationTest {
employeeRepository.save(EMPLOYEE1);
assertEmployeePersisted(EMPLOYEE1);
}
-
+
@Test
public void givenEmployeeEntity_whenInsertWithSaveAndFlush_ThenEmployeeIsPersisted() {
employeeRepository.saveAndFlush(EMPLOYEE2);
diff --git a/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java
new file mode 100644
index 0000000000..e5ad2dd448
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/java/com/baeldung/util/BaeldungPostgresqlContainer.java
@@ -0,0 +1,35 @@
+package com.baeldung.util;
+
+import org.testcontainers.containers.PostgreSQLContainer;
+
+public class BaeldungPostgresqlContainer extends PostgreSQLContainer {
+
+ private static final String IMAGE_VERSION = "postgres:11.1";
+
+ private static BaeldungPostgresqlContainer container;
+
+
+ private BaeldungPostgresqlContainer() {
+ super(IMAGE_VERSION);
+ }
+
+ public static BaeldungPostgresqlContainer getInstance() {
+ if (container == null) {
+ container = new BaeldungPostgresqlContainer();
+ }
+ return container;
+ }
+
+ @Override
+ public void start() {
+ super.start();
+ System.setProperty("DB_URL", container.getJdbcUrl());
+ System.setProperty("DB_USERNAME", container.getUsername());
+ System.setProperty("DB_PASSWORD", container.getPassword());
+ }
+
+ @Override
+ public void stop() {
+ //do nothing, JVM handles shut down
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/resources/application-batchinserts.properties b/persistence-modules/spring-data-jpa-3/src/test/resources/application-batchinserts.properties
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/resources/application-batchinserts.properties
rename to persistence-modules/spring-data-jpa-3/src/test/resources/application-batchinserts.properties
diff --git a/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc-auto.properties b/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc-auto.properties
new file mode 100644
index 0000000000..c3005d861f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc-auto.properties
@@ -0,0 +1,4 @@
+# configuration for test containers testing
+spring.datasource.url=${DB_URL}
+spring.datasource.username=${DB_USERNAME}
+spring.datasource.password=${DB_PASSWORD}
diff --git a/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc.properties b/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc.properties
new file mode 100644
index 0000000000..3bf8693d53
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-3/src/test/resources/application-tc.properties
@@ -0,0 +1,4 @@
+# configuration for Test Containers testing
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.jpa.hibernate.ddl-auto=create-drop
+spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
diff --git a/persistence-modules/spring-data-jpa-4/README.md b/persistence-modules/spring-data-jpa-4/README.md
new file mode 100644
index 0000000000..931455224f
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/README.md
@@ -0,0 +1,12 @@
+### Relevant Articles:
+- [Derived Query Methods in Spring Data JPA Repositories](https://www.baeldung.com/spring-data-derived-queries)
+- [LIKE Queries in Spring JPA Repositories](https://www.baeldung.com/spring-jpa-like-queries)
+
+### Eclipse Config
+After importing the project into Eclipse, you may see the following error:
+"No persistence xml file found in project"
+
+This can be ignored:
+- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
+Or:
+- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
diff --git a/persistence-modules/spring-data-jpa-4/pom.xml b/persistence-modules/spring-data-jpa-4/pom.xml
new file mode 100644
index 0000000000..2d06b52134
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ spring-data-jpa-4
+ spring-data-jpa-4
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ com.h2database
+ h2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/Application.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/Application.java
new file mode 100644
index 0000000000..37dbe7dab8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/Application.java
@@ -0,0 +1,13 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/entity/User.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/entity/User.java
similarity index 95%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/entity/User.java
rename to persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/entity/User.java
index e6d38f775b..49e824f09f 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/entity/User.java
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/entity/User.java
@@ -1,70 +1,70 @@
-package com.baeldung.derivedquery.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.time.ZonedDateTime;
-
-@Table(name = "users")
-@Entity
-public class User {
-
- @Id
- @GeneratedValue
- private Integer id;
- private String name;
- private Integer age;
- private ZonedDateTime birthDate;
- private Boolean active;
-
- public User() {
- }
-
- public User(String name, Integer age, ZonedDateTime birthDate, Boolean active) {
- this.name = name;
- this.age = age;
- this.birthDate = birthDate;
- this.active = active;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getAge() {
- return age;
- }
-
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public ZonedDateTime getBirthDate() {
- return birthDate;
- }
-
- public void setBirthDate(ZonedDateTime birthDate) {
- this.birthDate = birthDate;
- }
-
- public Boolean getActive() {
- return active;
- }
-
- public void setActive(Boolean active) {
- this.active = active;
- }
-}
+package com.baeldung.derivedquery.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.time.ZonedDateTime;
+
+@Table(name = "users")
+@Entity
+public class User {
+
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+ private Integer age;
+ private ZonedDateTime birthDate;
+ private Boolean active;
+
+ public User() {
+ }
+
+ public User(String name, Integer age, ZonedDateTime birthDate, Boolean active) {
+ this.name = name;
+ this.age = age;
+ this.birthDate = birthDate;
+ this.active = active;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public ZonedDateTime getBirthDate() {
+ return birthDate;
+ }
+
+ public void setBirthDate(ZonedDateTime birthDate) {
+ this.birthDate = birthDate;
+ }
+
+ public Boolean getActive() {
+ return active;
+ }
+
+ public void setActive(Boolean active) {
+ this.active = active;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java
similarity index 96%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java
rename to persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java
index a23855d96d..e613ee1531 100644
--- a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java
+++ b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/derivedquery/repository/UserRepository.java
@@ -1,60 +1,60 @@
-package com.baeldung.derivedquery.repository;
-
-import com.baeldung.derivedquery.entity.User;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.time.ZonedDateTime;
-import java.util.Collection;
-import java.util.List;
-
-public interface UserRepository extends JpaRepository {
-
- List findByName(String name);
-
- List findByNameIs(String name);
-
- List findByNameEquals(String name);
-
- List findByNameIsNull();
-
- List findByNameNot(String name);
-
- List findByNameIsNot(String name);
-
- List findByNameStartingWith(String name);
-
- List findByNameEndingWith(String name);
-
- List findByNameContaining(String name);
-
- List findByNameLike(String name);
-
- List findByAgeLessThan(Integer age);
-
- List findByAgeLessThanEqual(Integer age);
-
- List findByAgeGreaterThan(Integer age);
-
- List findByAgeGreaterThanEqual(Integer age);
-
- List findByAgeBetween(Integer startAge, Integer endAge);
-
- List findByBirthDateAfter(ZonedDateTime birthDate);
-
- List findByBirthDateBefore(ZonedDateTime birthDate);
-
- List findByActiveTrue();
-
- List findByActiveFalse();
-
- List findByAgeIn(Collection ages);
-
- List findByNameOrBirthDate(String name, ZonedDateTime birthDate);
-
- List findByNameOrBirthDateAndActive(String name, ZonedDateTime birthDate, Boolean active);
-
- List findByNameOrderByName(String name);
-
- List findByNameOrderByNameDesc(String name);
-
-}
+package com.baeldung.derivedquery.repository;
+
+import com.baeldung.derivedquery.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.time.ZonedDateTime;
+import java.util.Collection;
+import java.util.List;
+
+public interface UserRepository extends JpaRepository {
+
+ List findByName(String name);
+
+ List findByNameIs(String name);
+
+ List findByNameEquals(String name);
+
+ List findByNameIsNull();
+
+ List findByNameNot(String name);
+
+ List findByNameIsNot(String name);
+
+ List findByNameStartingWith(String name);
+
+ List findByNameEndingWith(String name);
+
+ List findByNameContaining(String name);
+
+ List findByNameLike(String name);
+
+ List findByAgeLessThan(Integer age);
+
+ List findByAgeLessThanEqual(Integer age);
+
+ List findByAgeGreaterThan(Integer age);
+
+ List findByAgeGreaterThanEqual(Integer age);
+
+ List findByAgeBetween(Integer startAge, Integer endAge);
+
+ List findByBirthDateAfter(ZonedDateTime birthDate);
+
+ List findByBirthDateBefore(ZonedDateTime birthDate);
+
+ List findByActiveTrue();
+
+ List findByActiveFalse();
+
+ List findByAgeIn(Collection ages);
+
+ List findByNameOrBirthDate(String name, ZonedDateTime birthDate);
+
+ List findByNameOrBirthDateAndActive(String name, ZonedDateTime birthDate, Boolean active);
+
+ List findByNameOrderByName(String name);
+
+ List findByNameOrderByNameDesc(String name);
+
+}
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/like/model/Movie.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/like/model/Movie.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/like/model/Movie.java
rename to persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/like/model/Movie.java
diff --git a/persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/like/repository/MovieRepository.java b/persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/like/repository/MovieRepository.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/main/java/com/baeldung/like/repository/MovieRepository.java
rename to persistence-modules/spring-data-jpa-4/src/main/java/com/baeldung/like/repository/MovieRepository.java
diff --git a/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties
new file mode 100644
index 0000000000..72fc330767
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-4/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.jpa.show-sql=true
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java
similarity index 94%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryTest.java
rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java
index 188ed5d4d0..22d2b7c00d 100644
--- a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryTest.java
+++ b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/derivedquery/repository/UserRepositoryIntegrationTest.java
@@ -1,172 +1,172 @@
-package com.baeldung.derivedquery.repository;
-
-import com.baeldung.Application;
-import com.baeldung.derivedquery.entity.User;
-import com.baeldung.derivedquery.repository.UserRepository;
-import java.time.ZonedDateTime;
-import java.util.Arrays;
-import java.util.List;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.Assert.assertEquals;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(classes = Application.class)
-public class UserRepositoryTest {
-
- private static final String USER_NAME_ADAM = "Adam";
- private static final String USER_NAME_EVE = "Eve";
- private static final ZonedDateTime BIRTHDATE = ZonedDateTime.now();
-
- @Autowired
- private UserRepository userRepository;
-
- @Before
- public void setUp() {
-
- User user1 = new User(USER_NAME_ADAM, 25, BIRTHDATE, true);
- User user2 = new User(USER_NAME_ADAM, 20, BIRTHDATE, false);
- User user3 = new User(USER_NAME_EVE, 20, BIRTHDATE, true);
- User user4 = new User(null, 30, BIRTHDATE, false);
-
- userRepository.saveAll(Arrays.asList(user1, user2, user3, user4));
- }
-
- @After
- public void tearDown() {
-
- userRepository.deleteAll();
- }
-
- @Test
- public void whenFindByName_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByName(USER_NAME_ADAM).size());
- }
-
- @Test
- public void whenFindByNameIsNull_thenReturnsCorrectResult() {
-
- assertEquals(1, userRepository.findByNameIsNull().size());
- }
-
- @Test
- public void whenFindByNameNot_thenReturnsCorrectResult() {
-
- assertEquals(USER_NAME_EVE, userRepository.findByNameNot(USER_NAME_ADAM).get(0).getName());
- }
-
- @Test
- public void whenFindByNameStartingWith_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByNameStartingWith("A").size());
- }
-
- @Test
- public void whenFindByNameEndingWith_thenReturnsCorrectResult() {
-
- assertEquals(1, userRepository.findByNameEndingWith("e").size());
- }
-
- @Test
- public void whenByNameContaining_thenReturnsCorrectResult() {
-
- assertEquals(1, userRepository.findByNameContaining("v").size());
- }
-
-
- @Test
- public void whenByNameLike_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByNameEndingWith("%d%m").size());
- }
-
- @Test
- public void whenByAgeLessThan_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByAgeLessThan(25).size());
- }
-
-
- @Test
- public void whenByAgeLessThanEqual_thenReturnsCorrectResult() {
-
- assertEquals(3, userRepository.findByAgeLessThanEqual(25).size());
- }
-
- @Test
- public void whenByAgeGreaterThan_thenReturnsCorrectResult() {
-
- assertEquals(1, userRepository.findByAgeGreaterThan(25).size());
- }
-
- @Test
- public void whenByAgeGreaterThanEqual_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByAgeGreaterThanEqual(25).size());
- }
-
- @Test
- public void whenByAgeBetween_thenReturnsCorrectResult() {
-
- assertEquals(4, userRepository.findByAgeBetween(20, 30).size());
- }
-
- @Test
- public void whenByBirthDateAfter_thenReturnsCorrectResult() {
-
- final ZonedDateTime yesterday = BIRTHDATE.minusDays(1);
- assertEquals(4, userRepository.findByBirthDateAfter(yesterday).size());
- }
-
- @Test
- public void whenByBirthDateBefore_thenReturnsCorrectResult() {
-
- final ZonedDateTime yesterday = BIRTHDATE.minusDays(1);
- assertEquals(0, userRepository.findByBirthDateBefore(yesterday).size());
- }
-
- @Test
- public void whenByActiveTrue_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByActiveTrue().size());
- }
-
- @Test
- public void whenByActiveFalse_thenReturnsCorrectResult() {
-
- assertEquals(2, userRepository.findByActiveFalse().size());
- }
-
-
- @Test
- public void whenByAgeIn_thenReturnsCorrectResult() {
-
- final List ages = Arrays.asList(20, 25);
- assertEquals(3, userRepository.findByAgeIn(ages).size());
- }
-
- @Test
- public void whenByNameOrBirthDate() {
-
- assertEquals(4, userRepository.findByNameOrBirthDate(USER_NAME_ADAM, BIRTHDATE).size());
- }
-
- @Test
- public void whenByNameOrBirthDateAndActive() {
-
- assertEquals(3, userRepository.findByNameOrBirthDateAndActive(USER_NAME_ADAM, BIRTHDATE, false).size());
- }
-
- @Test
- public void whenByNameOrderByName() {
-
- assertEquals(2, userRepository.findByNameOrderByName(USER_NAME_ADAM).size());
- }
+package com.baeldung.derivedquery.repository;
+
+import com.baeldung.Application;
+import com.baeldung.derivedquery.entity.User;
+import com.baeldung.derivedquery.repository.UserRepository;
+import java.time.ZonedDateTime;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+public class UserRepositoryIntegrationTest {
+
+ private static final String USER_NAME_ADAM = "Adam";
+ private static final String USER_NAME_EVE = "Eve";
+ private static final ZonedDateTime BIRTHDATE = ZonedDateTime.now();
+
+ @Autowired
+ private UserRepository userRepository;
+
+ @Before
+ public void setUp() {
+
+ User user1 = new User(USER_NAME_ADAM, 25, BIRTHDATE, true);
+ User user2 = new User(USER_NAME_ADAM, 20, BIRTHDATE, false);
+ User user3 = new User(USER_NAME_EVE, 20, BIRTHDATE, true);
+ User user4 = new User(null, 30, BIRTHDATE, false);
+
+ userRepository.saveAll(Arrays.asList(user1, user2, user3, user4));
+ }
+
+ @After
+ public void tearDown() {
+
+ userRepository.deleteAll();
+ }
+
+ @Test
+ public void whenFindByName_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByName(USER_NAME_ADAM).size());
+ }
+
+ @Test
+ public void whenFindByNameIsNull_thenReturnsCorrectResult() {
+
+ assertEquals(1, userRepository.findByNameIsNull().size());
+ }
+
+ @Test
+ public void whenFindByNameNot_thenReturnsCorrectResult() {
+
+ assertEquals(USER_NAME_EVE, userRepository.findByNameNot(USER_NAME_ADAM).get(0).getName());
+ }
+
+ @Test
+ public void whenFindByNameStartingWith_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByNameStartingWith("A").size());
+ }
+
+ @Test
+ public void whenFindByNameEndingWith_thenReturnsCorrectResult() {
+
+ assertEquals(1, userRepository.findByNameEndingWith("e").size());
+ }
+
+ @Test
+ public void whenByNameContaining_thenReturnsCorrectResult() {
+
+ assertEquals(1, userRepository.findByNameContaining("v").size());
+ }
+
+
+ @Test
+ public void whenByNameLike_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByNameEndingWith("m").size());
+ }
+
+ @Test
+ public void whenByAgeLessThan_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByAgeLessThan(25).size());
+ }
+
+
+ @Test
+ public void whenByAgeLessThanEqual_thenReturnsCorrectResult() {
+
+ assertEquals(3, userRepository.findByAgeLessThanEqual(25).size());
+ }
+
+ @Test
+ public void whenByAgeGreaterThan_thenReturnsCorrectResult() {
+
+ assertEquals(1, userRepository.findByAgeGreaterThan(25).size());
+ }
+
+ @Test
+ public void whenByAgeGreaterThanEqual_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByAgeGreaterThanEqual(25).size());
+ }
+
+ @Test
+ public void whenByAgeBetween_thenReturnsCorrectResult() {
+
+ assertEquals(4, userRepository.findByAgeBetween(20, 30).size());
+ }
+
+ @Test
+ public void whenByBirthDateAfter_thenReturnsCorrectResult() {
+
+ final ZonedDateTime yesterday = BIRTHDATE.minusDays(1);
+ assertEquals(4, userRepository.findByBirthDateAfter(yesterday).size());
+ }
+
+ @Test
+ public void whenByBirthDateBefore_thenReturnsCorrectResult() {
+
+ final ZonedDateTime yesterday = BIRTHDATE.minusDays(1);
+ assertEquals(0, userRepository.findByBirthDateBefore(yesterday).size());
+ }
+
+ @Test
+ public void whenByActiveTrue_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByActiveTrue().size());
+ }
+
+ @Test
+ public void whenByActiveFalse_thenReturnsCorrectResult() {
+
+ assertEquals(2, userRepository.findByActiveFalse().size());
+ }
+
+
+ @Test
+ public void whenByAgeIn_thenReturnsCorrectResult() {
+
+ final List ages = Arrays.asList(20, 25);
+ assertEquals(3, userRepository.findByAgeIn(ages).size());
+ }
+
+ @Test
+ public void whenByNameOrBirthDate() {
+
+ assertEquals(4, userRepository.findByNameOrBirthDate(USER_NAME_ADAM, BIRTHDATE).size());
+ }
+
+ @Test
+ public void whenByNameOrBirthDateAndActive() {
+
+ assertEquals(3, userRepository.findByNameOrBirthDateAndActive(USER_NAME_ADAM, BIRTHDATE, false).size());
+ }
+
+ @Test
+ public void whenByNameOrderByName() {
+
+ assertEquals(2, userRepository.findByNameOrderByName(USER_NAME_ADAM).size());
+ }
}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/like/MovieRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/like/MovieRepositoryIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/test/java/com/baeldung/like/MovieRepositoryIntegrationTest.java
rename to persistence-modules/spring-data-jpa-4/src/test/java/com/baeldung/like/MovieRepositoryIntegrationTest.java
diff --git a/persistence-modules/spring-data-jpa-2/src/test/resources/test-movie-cleanup.sql b/persistence-modules/spring-data-jpa-4/src/test/resources/test-movie-cleanup.sql
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/test/resources/test-movie-cleanup.sql
rename to persistence-modules/spring-data-jpa-4/src/test/resources/test-movie-cleanup.sql
diff --git a/persistence-modules/spring-data-jpa-2/src/test/resources/test-movie-data.sql b/persistence-modules/spring-data-jpa-4/src/test/resources/test-movie-data.sql
similarity index 100%
rename from persistence-modules/spring-data-jpa-2/src/test/resources/test-movie-data.sql
rename to persistence-modules/spring-data-jpa-4/src/test/resources/test-movie-data.sql
diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md
index 4b4a590e10..1c43edf42b 100644
--- a/persistence-modules/spring-data-jpa/README.md
+++ b/persistence-modules/spring-data-jpa/README.md
@@ -3,24 +3,16 @@
## Spring Data JPA Example Project
### Relevant Articles:
-- [Spring JPA – Multiple Databases](http://www.baeldung.com/spring-data-jpa-multiple-databases)
-- [Spring Data JPA – Adding a Method in All Repositories](http://www.baeldung.com/spring-data-jpa-method-in-all-repositories)
-- [An Advanced Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging-advanced)
-- [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations)
-- [Spring Data Java 8 Support](http://www.baeldung.com/spring-data-java-8)
-- [A Simple Tagging Implementation with JPA](http://www.baeldung.com/jpa-tagging)
+- [Spring JPA – Multiple Databases](https://www.baeldung.com/spring-data-jpa-multiple-databases)
+- [Spring Data JPA – Adding a Method in All Repositories](https://www.baeldung.com/spring-data-jpa-method-in-all-repositories)
+- [An Advanced Tagging Implementation with JPA](https://www.baeldung.com/jpa-tagging-advanced)
+- [Spring Data Annotations](https://www.baeldung.com/spring-data-annotations)
+- [Spring Data Java 8 Support](https://www.baeldung.com/spring-data-java-8)
+- [A Simple Tagging Implementation with JPA](https://www.baeldung.com/jpa-tagging)
- [Spring Data Composable Repositories](https://www.baeldung.com/spring-data-composable-repositories)
- [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)
-- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results)
-- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting)
-- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert)
-- [Pagination and Sorting using Spring Data JPA](https://www.baeldung.com/spring-data-jpa-pagination-sorting)
-- [Spring Data JPA Query by Example](https://www.baeldung.com/spring-data-query-by-example)
-- [DB Integration Tests with Spring Boot and Testcontainers](https://www.baeldung.com/spring-boot-testcontainers-integration-test)
-- [Spring Data JPA @Modifying Annotation](https://www.baeldung.com/spring-data-jpa-modifying-annotation)
-- [Spring Data JPA Batch Inserts](https://www.baeldung.com/spring-data-jpa-batch-inserts)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/Application.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/Application.java
index 1f078801e2..c66921a3ca 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/Application.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/Application.java
@@ -5,7 +5,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import com.baeldung.boot.daos.impl.ExtendedRepositoryImpl;
-import com.baeldung.multipledb.MultipleDbApplication;
@SpringBootApplication
@EnableJpaRepositories(repositoryBaseClass = ExtendedRepositoryImpl.class)
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/config/PersistenceConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/config/PersistenceConfiguration.java
index 35a603d9f4..76d5887030 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/config/PersistenceConfiguration.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/config/PersistenceConfiguration.java
@@ -1,11 +1,13 @@
package com.baeldung.boot.config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
import com.baeldung.boot.services.IBarService;
import com.baeldung.boot.services.impl.BarSpringDataJpaService;
-import org.springframework.context.annotation.*;
-import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
-import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
-import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@Profile("!tc")
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/CustomItemTypeRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/CustomItemTypeRepositoryImpl.java
index d7cba7c2c6..e057f36b26 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/CustomItemTypeRepositoryImpl.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/daos/impl/CustomItemTypeRepositoryImpl.java
@@ -2,8 +2,6 @@ package com.baeldung.boot.daos.impl;
import javax.persistence.EntityManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@@ -13,8 +11,6 @@ import com.baeldung.boot.domain.ItemType;
@Repository
public class CustomItemTypeRepositoryImpl implements CustomItemTypeRepository {
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomItemTypeRepositoryImpl.class);
-
@Autowired
private EntityManager entityManager;
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/services/impl/AbstractService.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/services/impl/AbstractService.java
index 8e4f643adc..f88d018bbb 100644
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/services/impl/AbstractService.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/boot/services/impl/AbstractService.java
@@ -31,7 +31,7 @@ public abstract class AbstractService implements IOperat
@Override
public Page findPaginated(final int page, final int size) {
- return getDao().findAll(new PageRequest(page, size));
+ return getDao().findAll(PageRequest.of(page, size));
}
// write
diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java
index 022099eed0..9b235776dc 100755
--- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java
+++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/multipledb/dao/product/ProductRepository.java
@@ -1,13 +1,9 @@
package com.baeldung.multipledb.dao.product;
-import java.util.List;
-
-import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.baeldung.multipledb.model.product.ProductMultipleDB;
public interface ProductRepository extends PagingAndSortingRepository {
- List findAllByPrice(double price, Pageable pageable);
-}
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ArticleRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ArticleRepositoryIntegrationTest.java
index dfb04b3dfb..20fc3cbeaf 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ArticleRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ArticleRepositoryIntegrationTest.java
@@ -1,24 +1,19 @@
package com.baeldung.boot.daos;
-import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
-import com.baeldung.boot.daos.ArticleRepository;
-import com.baeldung.boot.domain.Article;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.junit4.SpringRunner;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.boot.domain.Article;
@RunWith(SpringRunner.class)
@DataJpaTest(properties="spring.datasource.data=classpath:import_entities.sql")
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
index 66de5911db..71f92c94ab 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/ExtendedStudentRepositoryIntegrationTest.java
@@ -1,9 +1,10 @@
package com.baeldung.boot.daos;
-import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
-import com.baeldung.boot.daos.ExtendedStudentRepository;
-import com.baeldung.boot.domain.Student;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.List;
+
+import javax.annotation.Resource;
import org.junit.Before;
import org.junit.Test;
@@ -12,10 +13,8 @@ import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
-import javax.annotation.Resource;
-import java.util.List;
-
-import static org.assertj.core.api.Assertions.assertThat;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.Student;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {Application.class})
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
index 877e59d5a2..5d73e261a4 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/InventoryRepositoryIntegrationTest.java
@@ -1,23 +1,20 @@
package com.baeldung.boot.daos;
-import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
-import com.baeldung.boot.daos.InventoryRepository;
-import com.baeldung.boot.domain.MerchandiseEntity;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.math.BigDecimal;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
+import java.math.BigDecimal;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.MerchandiseEntity;
+
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class InventoryRepositoryIntegrationTest {
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/JpaRepositoriesIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/JpaRepositoriesIntegrationTest.java
index 30925d9b68..9e4b78dce3 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/JpaRepositoriesIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/JpaRepositoriesIntegrationTest.java
@@ -13,21 +13,12 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
-import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
-import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
-import com.baeldung.boot.daos.ItemTypeRepository;
-import com.baeldung.boot.daos.LocationRepository;
-import com.baeldung.boot.daos.ReadOnlyLocationRepository;
-import com.baeldung.boot.daos.StoreRepository;
import com.baeldung.boot.domain.Item;
import com.baeldung.boot.domain.ItemType;
import com.baeldung.boot.domain.Location;
import com.baeldung.boot.domain.Store;
-import com.baeldung.multipledb.PersistenceProductConfiguration;
-import com.baeldung.multipledb.PersistenceUserConfiguration;
@RunWith(SpringRunner.class)
@DataJpaTest(properties="spring.datasource.data=classpath:import_entities.sql")
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java
index ab8d97bd75..99eabc8271 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/daos/UserRepositoryTCAutoLiveTest.java
@@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class UserRepositoryTCAutoLiveTest extends UserRepositoryCommon {
@ClassRule
- public static PostgreSQLContainer postgreSQLContainer = BaeldungPostgresqlContainer.getInstance();
+ public static PostgreSQLContainer postgreSQLContainer = BaeldungPostgresqlContainer.getInstance();
@Test
@Transactional
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/FooServicePersistenceIntegrationTest.java
index f0e4aa7317..72de4918a2 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/FooServicePersistenceIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/FooServicePersistenceIntegrationTest.java
@@ -1,10 +1,7 @@
package com.baeldung.boot.services;
-import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
-import com.baeldung.boot.domain.Foo;
-import com.baeldung.boot.services.IFooService;
-import com.baeldung.boot.services.IOperations;
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertNotNull;
import org.junit.Ignore;
import org.junit.Test;
@@ -13,12 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.InvalidDataAccessApiUsageException;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.boot.Application;
+import com.baeldung.boot.domain.Foo;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/SpringDataJPABarAuditIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/SpringDataJPABarAuditIntegrationTest.java
index 810cf70769..644d1ec805 100644
--- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/SpringDataJPABarAuditIntegrationTest.java
+++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/boot/services/SpringDataJPABarAuditIntegrationTest.java
@@ -18,14 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.test.context.support.WithMockUser;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.baeldung.boot.Application;
-import com.baeldung.boot.config.PersistenceConfiguration;
import com.baeldung.boot.domain.Bar;
-import com.baeldung.boot.services.IBarService;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
diff --git a/persistence-modules/spring-mybatis/pom.xml b/persistence-modules/spring-mybatis/pom.xml
index ecdcd1d923..9946c937c8 100644
--- a/persistence-modules/spring-mybatis/pom.xml
+++ b/persistence-modules/spring-mybatis/pom.xml
@@ -9,7 +9,7 @@
com.baeldung
parent-boot-2
- 1.0.0-SNAPSHOT
+ 0.0.1-SNAPSHOT
../../parent-boot-2
@@ -34,6 +34,7 @@
org.mybatis.spring.boot
mybatis-spring-boot-starter
+ ${mybatis-spring-boot-starter.version}
diff --git a/pom.xml b/pom.xml
index 82a3eaf3d0..d80b1ff3cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -421,9 +421,9 @@
core-java-modules/core-java-concurrency-basic-2
core-java-modules/core-java-concurrency-collections
core-java-modules/core-java-io
+ core-java-modules/core-java-io-2
core-java-modules/core-java-io-apis
core-java-modules/core-java-io-conversions
- core-java-modules/core-java-io-files
core-java-modules/core-java-nio
core-java-modules/core-java-nio-2
core-java-modules/core-java-security
@@ -924,7 +924,6 @@
spring-boot-di
greeter-spring-boot-autoconfigure
greeter-spring-boot-sample-app
- persistence-modules/spring-boot-h2/spring-boot-h2-database
spring-boot-jasypt
spring-boot-keycloak
spring-boot-mvc
@@ -949,16 +948,12 @@
spring-cloud/spring-cloud-data-flow/time-processor
spring-cloud/spring-cloud-data-flow/time-source
spring-cucumber
- persistence-modules/spring-data-keyvalue
spring-data-rest
spring-dispatcher-servlet
spring-drools
spring-di
spring-ehcache
spring-freemarker
- persistence-modules/spring-hibernate-3
- persistence-modules/spring-hibernate4
- persistence-modules/spring-mybatis
spring-integration
spring-jenkins-pipeline
spring-jersey
@@ -1015,11 +1010,6 @@
spring-vault
spring-vertx
spring-zuul/spring-zuul-foos-resource
- persistence-modules/hibernate-mapping
- persistence-modules/spring-data-dynamodb
- persistence-modules/spring-data-eclipselink
- persistence-modules/spring-data-solr
- persistence-modules/spring-hibernate-5
spring-boot-flowable
spring-security-kerberos
@@ -1204,9 +1194,9 @@
core-java-modules/core-java-concurrency-basic-2
core-java-modules/core-java-concurrency-collections
core-java-modules/core-java-io
+ core-java-modules/core-java-io-2
core-java-modules/core-java-io-apis
core-java-modules/core-java-io-conversions
- core-java-modules/core-java-io-files
core-java-modules/core-java-nio
core-java-modules/core-java-nio-2
core-java-modules/core-java-security
@@ -1653,7 +1643,7 @@
core-java-modules/core-java-concurrency-advanced
core-java-modules/core-java-concurrency-advanced-2
core-java-modules/core-java-concurrency-advanced-3
- core-kotlin
+ core-kotlin
core-kotlin-2
jenkins/plugins
@@ -1663,6 +1653,7 @@
libraries
persistence-modules/hibernate5
+ persistence-modules/hibernate-mapping
persistence-modules/java-jpa
persistence-modules/java-jpa-2
persistence-modules/java-mongodb
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml
new file mode 100644
index 0000000000..ce9272ed59
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+ com.baeldung.spring.cloud.eureka
+ spring-cloud-eureka-self-preservation
+ spring-cloud-eureka-self-preservation
+ Spring Cloud Eureka Server Self Preservation
+ pom
+
+
+ com.baeldung.spring.cloud
+ spring-cloud
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+ spring-cloud-eureka-server
+ spring-cloud-eureka-client
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring-boot.version}
+ test
+
+
+
+
+ 2.1.3.RELEASE
+ Greenwich.SR3
+
+
+
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml
new file mode 100644
index 0000000000..2c522a8d9d
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+ spring-cloud-eureka-client
+ spring-cloud-eureka-client
+ Spring Cloud Eureka Sample Client
+ jar
+
+
+ com.baeldung.spring.cloud.eureka
+ spring-cloud-eureka-self-preservation
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-parent
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java
new file mode 100644
index 0000000000..c76af4d75e
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/java/com/baeldung/spring/cloud/eureka/client/EurekaClientApplication.java
@@ -0,0 +1,15 @@
+package com.baeldung.spring.cloud.eureka.client;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+
+@SpringBootApplication
+@EnableEurekaClient
+public class EurekaClientApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(EurekaClientApplication.class, args);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/resources/application.properties b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/resources/application.properties
new file mode 100644
index 0000000000..5b3040e465
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-client/src/main/resources/application.properties
@@ -0,0 +1,6 @@
+spring.application.name=Eurekaclient
+server.port=${PORT:0}
+eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
+eureka.instance.preferIpAddress = true
+eureka.client.should-unregister-on-shutdown=false
+eureka.instance.lease-renewal-interval-in-seconds=30
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml
new file mode 100644
index 0000000000..7d9d9d33a8
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/pom.xml
@@ -0,0 +1,36 @@
+
+
+ 4.0.0
+ spring-cloud-eureka-server
+ spring-cloud-eureka-server
+ Spring Cloud Eureka Server
+ jar
+
+
+ com.baeldung.spring.cloud.eureka
+ spring-cloud-eureka-self-preservation
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-server
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-parent
+ ${spring-cloud-dependencies.version}
+ pom
+ import
+
+
+
+
+
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java
new file mode 100644
index 0000000000..d55145448d
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/java/com/baeldung/spring/cloud/eureka/server/EurekaServerApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.cloud.eureka.server;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
+
+@SpringBootApplication
+@EnableEurekaServer
+public class EurekaServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(EurekaServerApplication.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/resources/application.properties b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/resources/application.properties
new file mode 100644
index 0000000000..ae0bc52c5b
--- /dev/null
+++ b/spring-cloud/spring-cloud-eureka-self-preservation/spring-cloud-eureka-server/src/main/resources/application.properties
@@ -0,0 +1,11 @@
+spring.application.name=Eurekaserver
+eureka.client.registerWithEureka=false
+eureka.client.fetchRegistry=false
+server.port=8761
+eureka.instance.hostname=localhost
+eureka.server.expected-client-renewal-interval-seconds=30
+eureka.instance.lease-expiration-duration-in-seconds=90
+eureka.server.eviction-interval-timer-in-ms=60000
+eureka.server.renewal-percent-threshold=0.85
+eureka.server.renewal-threshold-update-interval-ms=900000
+eureka.server.enable-self-preservation=true
\ No newline at end of file