diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
new file mode 100644
index 0000000000..9e8439cb87
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/HeapNode.java
@@ -0,0 +1,13 @@
+package com.baeldung.algorithms.minheapmerge;
+
+public class HeapNode {
+
+ int element;
+ int arrayIndex;
+ int nextElementIndex = 1;
+
+ public HeapNode(int element, int arrayIndex) {
+ this.element = element;
+ this.arrayIndex = arrayIndex;
+ }
+}
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
new file mode 100644
index 0000000000..b77ce43160
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/minheapmerge/MinHeap.java
@@ -0,0 +1,88 @@
+package com.baeldung.algorithms.minheapmerge;
+
+public class MinHeap {
+
+ HeapNode[] heapNodes;
+
+ public MinHeap(HeapNode heapNodes[]) {
+ this.heapNodes = heapNodes;
+ heapifyFromLastLeafsParent();
+ }
+
+ void heapifyFromLastLeafsParent() {
+ int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
+ while (lastLeafsParentIndex >= 0) {
+ heapify(lastLeafsParentIndex);
+ lastLeafsParentIndex--;
+ }
+ }
+
+ void heapify(int index) {
+ int leftNodeIndex = getLeftNodeIndex(index);
+ int rightNodeIndex = getRightNodeIndex(index);
+ int smallestElementIndex = index;
+ if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
+ smallestElementIndex = leftNodeIndex;
+ }
+ if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
+ smallestElementIndex = rightNodeIndex;
+ }
+ if (smallestElementIndex != index) {
+ swap(index, smallestElementIndex);
+ heapify(smallestElementIndex);
+ }
+ }
+
+ int getParentNodeIndex(int index) {
+ return (index - 1) / 2;
+ }
+
+ int getLeftNodeIndex(int index) {
+ return (2 * index + 1);
+ }
+
+ int getRightNodeIndex(int index) {
+ return (2 * index + 2);
+ }
+
+ HeapNode getRootNode() {
+ return heapNodes[0];
+ }
+
+ void heapifyFromRoot() {
+ heapify(0);
+ }
+
+ void swap(int i, int j) {
+ HeapNode temp = heapNodes[i];
+ heapNodes[i] = heapNodes[j];
+ heapNodes[j] = temp;
+ }
+
+ static int[] merge(int[][] array) {
+ HeapNode[] heapNodes = new HeapNode[array.length];
+ int resultingArraySize = 0;
+
+ for (int i = 0; i < array.length; i++) {
+ HeapNode node = new HeapNode(array[i][0], i);
+ heapNodes[i] = node;
+ resultingArraySize += array[i].length;
+ }
+
+ MinHeap minHeap = new MinHeap(heapNodes);
+ int[] resultingArray = new int[resultingArraySize];
+
+ for (int i = 0; i < resultingArraySize; i++) {
+ HeapNode root = minHeap.getRootNode();
+ resultingArray[i] = root.element;
+
+ if (root.nextElementIndex < array[root.arrayIndex].length) {
+ root.element = array[root.arrayIndex][root.nextElementIndex++];
+ } else {
+ root.element = Integer.MAX_VALUE;
+ }
+ minHeap.heapifyFromRoot();
+ }
+ return resultingArray;
+ }
+}
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
new file mode 100644
index 0000000000..80d0d20f05
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/minheapmerge/MinHeapUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.algorithms.minheapmerge;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class MinHeapUnitTest {
+
+ private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
+ private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
+
+ @Test
+ public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
+ int[] resultArray = MinHeap.merge(inputArray);
+
+ assertThat(resultArray.length, is(equalTo(10)));
+ assertThat(resultArray, is(equalTo(expectedArray)));
+ }
+
+}
diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml
index a114946c47..333339ed33 100644
--- a/apache-poi/pom.xml
+++ b/apache-poi/pom.xml
@@ -32,7 +32,7 @@
- 3.15
+ 4.1.1
1.0.6
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelCellFormatter.java b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelCellFormatter.java
new file mode 100644
index 0000000000..4a8854620c
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelCellFormatter.java
@@ -0,0 +1,20 @@
+package com.baeldung.poi.excel;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.Workbook;
+
+public class ExcelCellFormatter {
+
+ public String getCellStringValue(Cell cell) {
+ DataFormatter formatter = new DataFormatter();
+ return formatter.formatCellValue(cell);
+ }
+
+ public String getCellStringValueWithFormula(Cell cell, Workbook workbook) {
+ DataFormatter formatter = new DataFormatter();
+ FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
+ return formatter.formatCellValue(cell, evaluator);
+ }
+}
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java
new file mode 100644
index 0000000000..08dd0e07ab
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaHelper.java
@@ -0,0 +1,83 @@
+package com.baeldung.poi.excel.read.cellvalueandnotformula;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.util.CellAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+public class CellValueAndNotFormulaHelper {
+
+ public Object getCellValueByFetchingLastCachedValue(String fileLocation, String cellLocation) throws IOException {
+ Object cellValue = new Object();
+
+ FileInputStream inputStream = new FileInputStream(new File(fileLocation));
+ Workbook workbook = new XSSFWorkbook(inputStream);
+
+ Sheet sheet = workbook.getSheetAt(0);
+
+ CellAddress cellAddress = new CellAddress(cellLocation);
+ Row row = sheet.getRow(cellAddress.getRow());
+ Cell cell = row.getCell(cellAddress.getColumn());
+
+ if (cell.getCellType() == CellType.FORMULA) {
+ switch (cell.getCachedFormulaResultType()) {
+ case BOOLEAN:
+ cellValue = cell.getBooleanCellValue();
+ break;
+ case NUMERIC:
+ cellValue = cell.getNumericCellValue();
+ break;
+ case STRING:
+ cellValue = cell.getStringCellValue();
+ break;
+ default:
+ cellValue = null;
+ }
+ }
+
+ workbook.close();
+ return cellValue;
+ }
+
+ public Object getCellValueByEvaluatingFormula(String fileLocation, String cellLocation) throws IOException {
+ Object cellValue = new Object();
+
+ FileInputStream inputStream = new FileInputStream(new File(fileLocation));
+ Workbook workbook = new XSSFWorkbook(inputStream);
+
+ Sheet sheet = workbook.getSheetAt(0);
+ FormulaEvaluator evaluator = workbook.getCreationHelper()
+ .createFormulaEvaluator();
+
+ CellAddress cellAddress = new CellAddress(cellLocation);
+ Row row = sheet.getRow(cellAddress.getRow());
+ Cell cell = row.getCell(cellAddress.getColumn());
+
+ if (cell.getCellType() == CellType.FORMULA) {
+ switch (evaluator.evaluateFormulaCell(cell)) {
+ case BOOLEAN:
+ cellValue = cell.getBooleanCellValue();
+ break;
+ case NUMERIC:
+ cellValue = cell.getNumericCellValue();
+ break;
+ case STRING:
+ cellValue = cell.getStringCellValue();
+ break;
+ default:
+ cellValue = null;
+ }
+ }
+
+ workbook.close();
+ return cellValue;
+ }
+}
diff --git a/apache-poi/src/main/resources/ExcelCellFormatterTest.xlsx b/apache-poi/src/main/resources/ExcelCellFormatterTest.xlsx
new file mode 100644
index 0000000000..54e8734d58
Binary files /dev/null and b/apache-poi/src/main/resources/ExcelCellFormatterTest.xlsx differ
diff --git a/apache-poi/src/main/resources/test.xlsx b/apache-poi/src/main/resources/test.xlsx
new file mode 100644
index 0000000000..64fe14f25b
Binary files /dev/null and b/apache-poi/src/main/resources/test.xlsx differ
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelCellFormatterUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelCellFormatterUnitTest.java
new file mode 100644
index 0000000000..d9f96ee93c
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelCellFormatterUnitTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.poi.excel;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Before;
+import org.junit.Test;
+
+public class ExcelCellFormatterUnitTest {
+ private static final String FILE_NAME = "ExcelCellFormatterTest.xlsx";
+ private static final int STRING_CELL_INDEX = 0;
+ private static final int BOOLEAN_CELL_INDEX = 1;
+ private static final int RAW_NUMERIC_CELL_INDEX = 2;
+ private static final int FORMATTED_NUMERIC_CELL_INDEX = 3;
+ private static final int FORMULA_CELL_INDEX = 4;
+
+ private String fileLocation;
+
+ @Before
+ public void setup() throws IOException, URISyntaxException {
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ }
+
+ @Test
+ public void givenStringCell_whenGetCellStringValue_thenReturnStringValue() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+
+ ExcelCellFormatter formatter = new ExcelCellFormatter();
+ assertEquals("String Test", formatter.getCellStringValue(row.getCell(STRING_CELL_INDEX)));
+ workbook.close();
+ }
+
+ @Test
+ public void givenBooleanCell_whenGetCellStringValue_thenReturnBooleanStringValue() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+
+ ExcelCellFormatter formatter = new ExcelCellFormatter();
+ assertEquals("TRUE", formatter.getCellStringValue(row.getCell(BOOLEAN_CELL_INDEX)));
+ workbook.close();
+ }
+
+ @Test
+ public void givenNumericCell_whenGetCellStringValue_thenReturnNumericStringValue() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+
+ ExcelCellFormatter formatter = new ExcelCellFormatter();
+ assertEquals("1.234", formatter.getCellStringValue(row.getCell(RAW_NUMERIC_CELL_INDEX)));
+ assertEquals("1.23", formatter.getCellStringValue(row.getCell(FORMATTED_NUMERIC_CELL_INDEX)));
+ workbook.close();
+ }
+
+ @Test
+ public void givenFormualCell_whenGetCellStringValue_thenReturnOriginalFormulaString() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+
+ ExcelCellFormatter formatter = new ExcelCellFormatter();
+ assertEquals("SUM(1+2)", formatter.getCellStringValue(row.getCell(FORMULA_CELL_INDEX)));
+ workbook.close();
+ }
+
+ @Test
+ public void givenFormualCell_whenGetCellStringValueForFormula_thenReturnOriginalFormulatring() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+
+ ExcelCellFormatter formatter = new ExcelCellFormatter();
+ assertEquals("3", formatter.getCellStringValueWithFormula(row.getCell(FORMULA_CELL_INDEX), workbook));
+ workbook.close();
+ }
+
+}
\ No newline at end of file
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java
new file mode 100644
index 0000000000..885a955e9b
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/read/cellvalueandnotformula/CellValueAndNotFormulaUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.poi.excel.read.cellvalueandnotformula;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CellValueAndNotFormulaUnitTest {
+
+ private CellValueAndNotFormulaHelper readCellValueAndNotFormulaHelper;
+ private String fileLocation;
+ private static final String FILE_NAME = "test.xlsx";
+
+ @Before
+ public void setup() throws URISyntaxException {
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ readCellValueAndNotFormulaHelper = new CellValueAndNotFormulaHelper();
+ }
+
+ @Test
+ public void givenExcelCell_whenReadCellValueByLastCachedValue_thenProduceCorrectResult() throws IOException {
+ final double expectedResult = 7.0;
+ final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByFetchingLastCachedValue(fileLocation, "C2");
+
+ assertEquals(expectedResult, cellValue);
+ }
+
+ @Test
+ public void givenExcelCell_whenReadCellValueByEvaluatingFormula_thenProduceCorrectResult() throws IOException {
+ final double expectedResult = 7.0;
+ final Object cellValue = readCellValueAndNotFormulaHelper.getCellValueByEvaluatingFormula(fileLocation, "C2");
+
+ assertEquals(expectedResult, cellValue);
+ }
+}
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
index 302959d0d9..50433ea890 100644
--- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
+++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
@@ -75,6 +75,7 @@ class WebserviceUnitTest extends GroovyTestCase {
assert stories.size() == 5
}
+ /* see BAEL-3753
void test_whenConsumingSoap_thenReceiveResponse() {
def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
def soapClient = new SOAPClient(url)
@@ -89,6 +90,7 @@ class WebserviceUnitTest extends GroovyTestCase {
def words = response.NumberToWordsResponse
assert words == "one thousand two hundred and thirty four "
}
+ */
void test_whenConsumingRestGet_thenReceiveResponse() {
def path = "/get"
@@ -149,4 +151,4 @@ class WebserviceUnitTest extends GroovyTestCase {
assert e?.response?.statusCode != 200
}
}
-}
\ No newline at end of file
+}
diff --git a/core-java-modules/core-java-datetime-computations/README.md b/core-java-modules/core-java-date-operations-1/README.md
similarity index 84%
rename from core-java-modules/core-java-datetime-computations/README.md
rename to core-java-modules/core-java-date-operations-1/README.md
index 591ddeaa94..b63fab63db 100644
--- a/core-java-modules/core-java-datetime-computations/README.md
+++ b/core-java-modules/core-java-date-operations-1/README.md
@@ -1,6 +1,5 @@
-## Java Date/time computations Cookbooks and Examples
-
-This module contains articles about date and time computations in Java.
+## Core Date Operations (Part 1)
+This module contains articles about date operations in Java.
### Relevant Articles:
- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
@@ -13,3 +12,4 @@ This module contains articles about date and time computations in Java.
- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
- [Introduction to Joda-Time](http://www.baeldung.com/joda-time)
+- [[Next -->]](/core-java-modules/core-java-date-operations-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-computations/pom.xml b/core-java-modules/core-java-date-operations-1/pom.xml
similarity index 93%
rename from core-java-modules/core-java-datetime-computations/pom.xml
rename to core-java-modules/core-java-date-operations-1/pom.xml
index af6b110296..83216f1ad8 100644
--- a/core-java-modules/core-java-datetime-computations/pom.xml
+++ b/core-java-modules/core-java-date-operations-1/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- core-java-datetime-computations
+ core-java-date-operations-1
${project.parent.version}
- core-java-datetime-computations
+ core-java-date-operations-1
jar
@@ -41,7 +41,7 @@
- core-java-datetime-computations
+ core-java-date-operations-1
src/main/resources
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/AgeCalculator.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/date/AgeCalculator.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/AgeCalculator.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/date/AgeCalculator.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/DateWithoutTime.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/date/DateWithoutTime.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/DateWithoutTime.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/date/DateWithoutTime.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/AddHoursToDate.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/AddHoursToDate.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/AddHoursToDate.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/AddHoursToDate.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
diff --git a/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/java9/time/TimeApi.java b/core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/java9/time/TimeApi.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/java9/time/TimeApi.java
rename to core-java-modules/core-java-date-operations-1/src/main/java/com/baeldung/java9/time/TimeApi.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/DateDiffUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateDiffUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/DateDiffUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
diff --git a/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java b/core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
rename to core-java-modules/core-java-date-operations-1/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/README.md b/core-java-modules/core-java-date-operations-2/README.md
similarity index 84%
rename from core-java-modules/core-java-date-operations/README.md
rename to core-java-modules/core-java-date-operations-2/README.md
index 24bb493dce..478d3baf19 100644
--- a/core-java-modules/core-java-date-operations/README.md
+++ b/core-java-modules/core-java-date-operations-2/README.md
@@ -1,4 +1,4 @@
-## Core Date Operations
+## Core Date Operations (Part 2)
This module contains articles about date operations in Java.
### Relevant Articles:
@@ -6,3 +6,4 @@ This module contains articles about date operations in Java.
- [Skipping Weekends While Adding Days to LocalDate in Java 8](https://www.baeldung.com/java-localdate-add-days-skip-weekends)
- [Checking If Two Java Dates Are on the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day)
- [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime)
+- [[<-- Prev]](/core-java-modules/core-java-date-operations-1)
diff --git a/core-java-modules/core-java-date-operations/pom.xml b/core-java-modules/core-java-date-operations-2/pom.xml
similarity index 78%
rename from core-java-modules/core-java-date-operations/pom.xml
rename to core-java-modules/core-java-date-operations-2/pom.xml
index 4d267964ee..155b8ad0b7 100644
--- a/core-java-modules/core-java-date-operations/pom.xml
+++ b/core-java-modules/core-java-date-operations-2/pom.xml
@@ -3,9 +3,9 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- core-java-date-operations
+ core-java-date-operations-2
${project.parent.version}
- core-java-date-operations
+ core-java-date-operations-2
jar
@@ -31,11 +31,18 @@
hirondelle-date4j
${hirondelle-date4j.version}
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
2.10
1.5.1
+ 3.14.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java
similarity index 97%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java
index fea268964a..ab48934f1a 100644
--- a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/date/comparison/DateComparisonUtils.java
@@ -1,65 +1,65 @@
-package com.baeldung.date.comparison;
-
-import java.text.SimpleDateFormat;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.ZoneId;
-import java.time.temporal.ChronoUnit;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-import org.apache.commons.lang3.time.DateUtils;
-
-import hirondelle.date4j.DateTime;
-
-public class DateComparisonUtils {
-
- public static boolean isSameDayUsingLocalDate(Date date1, Date date2) {
- LocalDate localDate1 = date1.toInstant()
- .atZone(ZoneId.systemDefault())
- .toLocalDate();
- LocalDate localDate2 = date2.toInstant()
- .atZone(ZoneId.systemDefault())
- .toLocalDate();
- return localDate1.isEqual(localDate2);
- }
-
- public static boolean isSameDayUsingInstant(Date date1, Date date2) {
- Instant instant1 = date1.toInstant()
- .truncatedTo(ChronoUnit.DAYS);
- Instant instant2 = date2.toInstant()
- .truncatedTo(ChronoUnit.DAYS);
- return instant1.equals(instant2);
- }
-
- public static boolean isSameDayUsingSimpleDateFormat(Date date1, Date date2) {
- SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
- return fmt.format(date1)
- .equals(fmt.format(date2));
- }
-
- public static boolean isSameDayUsingCalendar(Date date1, Date date2) {
- Calendar calendar1 = Calendar.getInstance();
- calendar1.setTime(date1);
- Calendar calendar2 = Calendar.getInstance();
- calendar2.setTime(date2);
- return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
- }
-
- public static boolean isSameDayUsingApacheCommons(Date date1, Date date2) {
- return DateUtils.isSameDay(date1, date2);
- }
-
- public static boolean isSameDayUsingJoda(Date date1, Date date2) {
- org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1);
- org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2);
- return localDate1.equals(localDate2);
- }
-
- public static boolean isSameDayUsingDate4j(Date date1, Date date2) {
- DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault());
- DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault());
- return dateObject1.isSameDayAs(dateObject2);
- }
-}
+package com.baeldung.date.comparison;
+
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.apache.commons.lang3.time.DateUtils;
+
+import hirondelle.date4j.DateTime;
+
+public class DateComparisonUtils {
+
+ public static boolean isSameDayUsingLocalDate(Date date1, Date date2) {
+ LocalDate localDate1 = date1.toInstant()
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ LocalDate localDate2 = date2.toInstant()
+ .atZone(ZoneId.systemDefault())
+ .toLocalDate();
+ return localDate1.isEqual(localDate2);
+ }
+
+ public static boolean isSameDayUsingInstant(Date date1, Date date2) {
+ Instant instant1 = date1.toInstant()
+ .truncatedTo(ChronoUnit.DAYS);
+ Instant instant2 = date2.toInstant()
+ .truncatedTo(ChronoUnit.DAYS);
+ return instant1.equals(instant2);
+ }
+
+ public static boolean isSameDayUsingSimpleDateFormat(Date date1, Date date2) {
+ SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
+ return fmt.format(date1)
+ .equals(fmt.format(date2));
+ }
+
+ public static boolean isSameDayUsingCalendar(Date date1, Date date2) {
+ Calendar calendar1 = Calendar.getInstance();
+ calendar1.setTime(date1);
+ Calendar calendar2 = Calendar.getInstance();
+ calendar2.setTime(date2);
+ return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH) && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
+ }
+
+ public static boolean isSameDayUsingApacheCommons(Date date1, Date date2) {
+ return DateUtils.isSameDay(date1, date2);
+ }
+
+ public static boolean isSameDayUsingJoda(Date date1, Date date2) {
+ org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1);
+ org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2);
+ return localDate1.equals(localDate2);
+ }
+
+ public static boolean isSameDayUsingDate4j(Date date1, Date date2) {
+ DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault());
+ DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault());
+ return dateObject1.isSameDayAs(dateObject2);
+ }
+}
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/CalendarUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/CalendarUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/CalendarUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/CalendarUtils.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/DateUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/DateUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/DateUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/DateUtils.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/DateUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/DateUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/DateUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/DateUtils.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/TimeUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/TimeUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/TimeUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/TimeUtils.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/TimestampUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/TimestampUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/sql/TimestampUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/datetime/sql/TimestampUtils.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java
diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java
rename to core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/DatabaseMigrationTask.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/DatabaseMigrationTask.java
new file mode 100644
index 0000000000..322c1d2f4e
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/DatabaseMigrationTask.java
@@ -0,0 +1,19 @@
+package com.baeldung.timer;
+
+import java.util.List;
+import java.util.TimerTask;
+
+public class DatabaseMigrationTask extends TimerTask {
+ private List oldDatabase;
+ private List newDatabase;
+
+ public DatabaseMigrationTask(List oldDatabase, List newDatabase) {
+ this.oldDatabase = oldDatabase;
+ this.newDatabase = newDatabase;
+ }
+
+ @Override
+ public void run() {
+ newDatabase.addAll(oldDatabase);
+ }
+}
diff --git a/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/NewsletterTask.java b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/NewsletterTask.java
new file mode 100644
index 0000000000..16dd6c12ff
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/main/java/com/baeldung/timer/NewsletterTask.java
@@ -0,0 +1,14 @@
+package com.baeldung.timer;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.TimerTask;
+
+public class NewsletterTask extends TimerTask {
+ @Override
+ public void run() {
+ System.out.println("Email sent at: "
+ + LocalDateTime.ofInstant(Instant.ofEpochMilli(scheduledExecutionTime()), ZoneId.systemDefault()));
+ }
+}
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java
index faa2b18c91..477c348ea2 100644
--- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java
@@ -1,57 +1,57 @@
-package com.baeldung.date.comparison;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Date;
-
-import org.junit.Test;
-
-public class DateComparisonUtilsUnitTest {
-
- private Date day1Morning = toDate(LocalDateTime.of(2019, 10, 19, 6, 30, 40));
- private Date day1Evening = toDate(LocalDateTime.of(2019, 10, 19, 18, 30, 50));
- private Date day2Morning = toDate(LocalDateTime.of(2019, 10, 20, 6, 30, 50));
-
- private Date toDate(LocalDateTime localDateTime) {
- return Date.from(localDateTime.atZone(ZoneId.systemDefault())
- .toInstant());
- }
-
- @Test
- public void givenDatesWithDifferentTime_whenIsSameDay_thenReturnsTrue() {
- assertTrue(DateComparisonUtils.isSameDayUsingLocalDate(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingInstant(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingCalendar(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingApacheCommons(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingJoda(day1Morning, day1Evening));
- assertTrue(DateComparisonUtils.isSameDayUsingDate4j(day1Morning, day1Evening));
- }
-
- @Test
- public void givenDates_whenIsDifferentDay_thenReturnsFalse() {
- assertFalse(DateComparisonUtils.isSameDayUsingLocalDate(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingLocalDate(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingInstant(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingInstant(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingCalendar(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingCalendar(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingApacheCommons(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingApacheCommons(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingJoda(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingJoda(day1Evening, day2Morning));
-
- assertFalse(DateComparisonUtils.isSameDayUsingDate4j(day1Morning, day2Morning));
- assertFalse(DateComparisonUtils.isSameDayUsingDate4j(day1Evening, day2Morning));
- }
-}
+package com.baeldung.date.comparison;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+import org.junit.Test;
+
+public class DateComparisonUtilsUnitTest {
+
+ private Date day1Morning = toDate(LocalDateTime.of(2019, 10, 19, 6, 30, 40));
+ private Date day1Evening = toDate(LocalDateTime.of(2019, 10, 19, 18, 30, 50));
+ private Date day2Morning = toDate(LocalDateTime.of(2019, 10, 20, 6, 30, 50));
+
+ private Date toDate(LocalDateTime localDateTime) {
+ return Date.from(localDateTime.atZone(ZoneId.systemDefault())
+ .toInstant());
+ }
+
+ @Test
+ public void givenDatesWithDifferentTime_whenIsSameDay_thenReturnsTrue() {
+ assertTrue(DateComparisonUtils.isSameDayUsingLocalDate(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingInstant(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingCalendar(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingApacheCommons(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingJoda(day1Morning, day1Evening));
+ assertTrue(DateComparisonUtils.isSameDayUsingDate4j(day1Morning, day1Evening));
+ }
+
+ @Test
+ public void givenDates_whenIsDifferentDay_thenReturnsFalse() {
+ assertFalse(DateComparisonUtils.isSameDayUsingLocalDate(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingLocalDate(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingInstant(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingInstant(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingSimpleDateFormat(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingCalendar(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingCalendar(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingApacheCommons(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingApacheCommons(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingJoda(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingJoda(day1Evening, day2Morning));
+
+ assertFalse(DateComparisonUtils.isSameDayUsingDate4j(day1Morning, day2Morning));
+ assertFalse(DateComparisonUtils.isSameDayUsingDate4j(day1Evening, day2Morning));
+ }
+}
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/DateUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/sql/DateUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/DateUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/sql/DateUtilsUnitTest.java
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-2/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/sql/TimeUtilsUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimestampUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/sql/TimestampUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/sql/TimestampUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/datetime/sql/TimestampUtilsUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/jvmtimezone/ModifyDefaultTimezoneUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/jvmtimezone/ModifyDefaultTimezoneUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/jvmtimezone/ModifyDefaultTimezoneUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/jvmtimezone/ModifyDefaultTimezoneUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/jvmtimezone/ModifyTimezonePropertyUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/jvmtimezone/ModifyTimezonePropertyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/jvmtimezone/ModifyTimezonePropertyUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/jvmtimezone/ModifyTimezonePropertyUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java
diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java
rename to core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java
diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/DatabaseMigrationTaskUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/DatabaseMigrationTaskUnitTest.java
new file mode 100644
index 0000000000..5f3ae63901
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/DatabaseMigrationTaskUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.timer;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class DatabaseMigrationTaskUnitTest {
+ @Test
+ void givenDatabaseMigrationTask_whenTimerScheduledForNowPlusTwoSeconds_thenDataMigratedAfterTwoSeconds() throws Exception {
+ List oldDatabase = Arrays.asList("Harrison Ford", "Carrie Fisher", "Mark Hamill");
+ List newDatabase = new ArrayList<>();
+
+ LocalDateTime twoSecondsLater = LocalDateTime.now().plusSeconds(2);
+ Date twoSecondsLaterAsDate = Date.from(twoSecondsLater.atZone(ZoneId.systemDefault()).toInstant());
+
+ new Timer().schedule(new DatabaseMigrationTask(oldDatabase, newDatabase), twoSecondsLaterAsDate);
+
+ while (LocalDateTime.now().isBefore(twoSecondsLater)) {
+ assertThat(newDatabase).isEmpty();
+ Thread.sleep(500);
+ }
+ assertThat(newDatabase).containsExactlyElementsOf(oldDatabase);
+ }
+
+ @Test
+ void givenDatabaseMigrationTask_whenTimerScheduledInTwoSeconds_thenDataMigratedAfterTwoSeconds() throws Exception {
+ List oldDatabase = Arrays.asList("Harrison Ford", "Carrie Fisher", "Mark Hamill");
+ List newDatabase = new ArrayList<>();
+
+ new Timer().schedule(new DatabaseMigrationTask(oldDatabase, newDatabase), 2000);
+
+ LocalDateTime twoSecondsLater = LocalDateTime.now().plusSeconds(2);
+
+ while (LocalDateTime.now().isBefore(twoSecondsLater)) {
+ assertThat(newDatabase).isEmpty();
+ Thread.sleep(500);
+ }
+ assertThat(newDatabase).containsExactlyElementsOf(oldDatabase);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java
new file mode 100644
index 0000000000..ffbe39c2bc
--- /dev/null
+++ b/core-java-modules/core-java-date-operations-2/src/test/java/com/baeldung/timer/NewsletterTaskUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.timer;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+
+import java.util.Timer;
+
+class NewsletterTaskUnitTest {
+ private final Timer timer = new Timer();
+
+ @AfterEach
+ void afterEach() {
+ timer.cancel();
+ }
+
+ @Test
+ void givenNewsletterTask_whenTimerScheduledEachSecondFixedDelay_thenNewsletterSentEachSecond() throws Exception {
+ timer.schedule(new NewsletterTask(), 0, 1000);
+
+ for (int i = 0; i < 3; i++) {
+ Thread.sleep(1000);
+ }
+ }
+
+ @Test
+ void givenNewsletterTask_whenTimerScheduledEachSecondFixedRate_thenNewsletterSentEachSecond() throws Exception {
+ timer.scheduleAtFixedRate(new NewsletterTask(), 0, 1000);
+
+ for (int i = 0; i < 3; i++) {
+ Thread.sleep(1000);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datebasics/CreateDate.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datebasics/CreateDate.java
new file mode 100644
index 0000000000..327827e03a
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datebasics/CreateDate.java
@@ -0,0 +1,45 @@
+package com.baeldung.datebasics;
+
+import java.time.Clock;
+import java.time.LocalDate;
+import java.time.Month;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+
+public class CreateDate {
+ public LocalDate getTodaysDate() {
+ return LocalDate.now();
+ }
+
+ public LocalDate getTodaysDateFromClock() {
+ return LocalDate.now(Clock.systemDefaultZone());
+ }
+
+ public LocalDate getTodaysDateFromZone(String zone) {
+ return LocalDate.now(ZoneId.of(zone));
+ }
+
+ public LocalDate getCustomDateOne(int year, int month, int dayOfMonth) {
+ return LocalDate.of(year, month, dayOfMonth);
+ }
+
+ public LocalDate getCustomDateTwo(int year, Month month, int dayOfMonth) {
+ return LocalDate.of(year, month, dayOfMonth);
+ }
+
+ public LocalDate getDateFromEpochDay(long epochDay) {
+ return LocalDate.ofEpochDay(epochDay);
+ }
+
+ public LocalDate getDateFromYearAndDayOfYear(int year, int dayOfYear) {
+ return LocalDate.ofYearDay(year, dayOfYear);
+ }
+
+ public LocalDate getDateFromString(String date) {
+ return LocalDate.parse(date);
+ }
+
+ public LocalDate getDateFromStringAndFormatter(String date, String pattern) {
+ return LocalDate.parse(date, DateTimeFormatter.ofPattern(pattern));
+ }
+}
diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datebasics/CreateDateUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datebasics/CreateDateUnitTest.java
new file mode 100644
index 0000000000..54f3285ea0
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datebasics/CreateDateUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.datebasics;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.Month;
+
+import org.junit.Test;
+
+public class CreateDateUnitTest {
+ private CreateDate date = new CreateDate();
+
+ @Test
+ public void whenUsingNowMethod_thenLocalDate() {
+ assertEquals("2020-01-08", date.getTodaysDate());
+ }
+
+ @Test
+ public void whenUsingClock_thenLocalDate() {
+ assertEquals("2020-01-08", date.getTodaysDateFromClock());
+ }
+
+ @Test
+ public void givenValues_whenUsingZone_thenLocalDate() {
+ assertEquals("2020-01-08", date.getTodaysDateFromZone("Asia/Kolkata"));
+ }
+
+ @Test
+ public void givenValues_whenUsingOfMethod_thenLocalDate() {
+ assertEquals("2020-01-08", date.getCustomDateOne(2020, 1, 8));
+ }
+
+ @Test
+ public void givenValuesWithMonthEnum_whenUsingOfMethod_thenLocalDate() {
+ assertEquals("2020-01-08", date.getCustomDateTwo(2020, Month.JANUARY, 8));
+ }
+
+ @Test
+ public void givenValues_whenUsingEpochDay_thenLocalDate() {
+ assertEquals("2020-01-08", date.getDateFromEpochDay(18269));
+ }
+
+ @Test
+ public void givenValues_whenUsingYearDay_thenLocalDate() {
+ assertEquals("2020-01-08", date.getDateFromYearAndDayOfYear(2020, 8));
+ }
+
+ @Test
+ public void givenValues_whenUsingParse_thenLocalDate() {
+ assertEquals("2020-01-08", date.getDateFromString("2020-01-08"));
+ }
+
+ @Test
+ public void givenValuesWithFormatter_whenUsingParse_thenLocalDate() {
+ assertEquals("2020-01-08", date.getDateFromStringAndFormatter("8-Jan-2020", "d-MMM-yyyy"));
+ }
+}
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java
index fd4c1933f6..336276786a 100644
--- a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java
@@ -1,7 +1,5 @@
package com.baeldung.powerset;
-import com.google.common.collect.Sets;
-
import javax.annotation.Nullable;
import java.util.AbstractSet;
import java.util.ArrayList;
@@ -163,7 +161,7 @@ public class PowerSetUtility {
return unMapIndex(powerSetIndices);
}
- private List> iterativePowerSetByLoopOverNumbersWithReverseLexicographicalOrder(int n) {
+ private List> iterativePowerSetByLoopOverNumbers(int n) {
List> powerSet = new ArrayList<>();
for (int i = 0; i < (1 << n); i++) {
List subset = new ArrayList<>(n);
@@ -174,7 +172,7 @@ public class PowerSetUtility {
return powerSet;
}
- private List> iterativePowerSetByLoopOverNumbersWithGrayCodeOrder(int n) {
+ private List> iterativePowerSetByLoopOverNumbersWithMinimalChange(int n) {
List> powerSet = new ArrayList<>();
for (int i = 0; i < (1 << n); i++) {
List subset = new ArrayList<>(n);
@@ -195,32 +193,16 @@ public class PowerSetUtility {
public List> iterativePowerSetByLoopOverNumbers(Set set) {
initializeMap(set);
- List> sets = iterativePowerSetByLoopOverNumbersWithReverseLexicographicalOrder(set.size());
+ List> sets = iterativePowerSetByLoopOverNumbers(set.size());
return unMapListBinary(sets);
}
public List> iterativePowerSetByLoopOverNumbersMinimalChange(Set set) {
initializeMap(set);
- List> sets = iterativePowerSetByLoopOverNumbersWithGrayCodeOrder(set.size());
+ List> sets = iterativePowerSetByLoopOverNumbersWithMinimalChange(set.size());
return unMapListBinary(sets);
}
- public static int getRankInLexicographicalOrder(List subset) {
- int rank = 0;
- for (int i = 0; i < subset.size(); i++)
- if (subset.get(i))
- rank += (1 << (subset.size() - i - 1));
- return rank;
- }
-
- public static List getSubsetForRankInLexicographicalOrder(int rank, int sizeOfSet) {
- Boolean[] subset = new Boolean[sizeOfSet];
- for(int j = 0; j < sizeOfSet; j++) {
- subset[sizeOfSet - j - 1] = ((rank & (1 << j)) > 0);
- }
- return Arrays.asList(subset);
- }
-
private Set> recursivePowerSetIndexRepresentation(int idx, int n) {
if (idx == n) {
Set> empty = new HashSet<>();
diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java
index 0a20c36692..8b7c338479 100644
--- a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java
+++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java
@@ -137,7 +137,7 @@ public class PowerSetUtilityUnitTest {
}
@Test
- public void givenSet_WhenPowerSetIsCalculatedIterativePowerSetByLoopOverNumbersMinimalChange_ThenItContainsAllSubsetsInGrayOrder() {
+ public void givenSet_WhenPowerSetIsCalculatedIterativePowerSetByLoopOverNumbersWithMinimalChange_ThenItContainsAllSubsets() {
Set set = RandomSetOfStringGenerator.generateRandomSet();
List> powerSet = new PowerSetUtility().iterativePowerSetByLoopOverNumbersMinimalChange(set);
@@ -172,42 +172,6 @@ public class PowerSetUtilityUnitTest {
}
}
- @Test
- public void givenSubset_WhenPowerSetIsInLexicographicalOrder_ReturnCorrectRank() {
- int n = new Random().nextInt(5) + 5; //a number in [5, 10)
- for(int i = 0; i < ( 1 << n); i++) {
- Boolean[] subset = new Boolean[n];
- for(int j=0; j < n; j++) {
- subset[n - j - 1] = ((i & (1 << j)) > 0);
- }
- Assertions.assertEquals(i, PowerSetUtility.getRankInLexicographicalOrder(Arrays.asList(subset)));
- }
- }
-
- @Test
- public void givenRanking_WhenPowerSetIsInLexicographicalOrder_ReturnTheSubset() {
- int n = new Random().nextInt(5) + 5; //a number in [5, 10)
- List> powerSet = new ArrayList<>();
- for(int i = 0; i < (1 << n); i++) {
- powerSet.add(PowerSetUtility.getSubsetForRankInLexicographicalOrder(i, n));
- }
- //To make sure that the size of power set is (2 power n)
- MatcherAssert.assertThat(powerSet, IsCollectionWithSize.hasSize((1 << n)));
- //To make sure that number of occurrence of each index is (2 power n-1)
- Map counter = new HashMap<>();
- for (List subset : powerSet) {
- for (int i = 0; i < subset.size(); i++) {
- if(subset.get(i)) {
- int num = counter.getOrDefault(i, 0);
- counter.put(i, num + 1);
- }
- }
- }
- counter.forEach((k, v) -> Assertions.assertEquals((1 << (n - 1)), v.intValue()));
- //To make sure that one subset is not generated twice
- Assertions.assertEquals(powerSet.size(), new HashSet<>(powerSet).size());
- }
-
static class RandomSetOfStringGenerator {
private static List fruits = Arrays.asList("Apples", "Avocados", "Banana", "Blueberry", "Cherry", "Clementine", "Cucumber", "Date", "Fig",
"Grapefruit"/*, "Grape", "Kiwi", "Lemon", "Mango", "Mulberry", "Melon", "Nectarine", "Olive", "Orange"*/);
diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
index 6b292ad8ab..728c83a107 100644
--- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
@@ -6,7 +6,7 @@ import org.junit.Test;
public class TernaryOperatorUnitTest {
@Test
- public void givenACondition_whenUsingTernaryOperator_thenItEvaluatesConditionAndReturnsAValue() {
+ public void whenUsingTernaryOperator_thenConditionIsEvaluatedAndValueReturned() {
int number = 10;
String msg = number > 10 ? "Number is greater than 10" : "Number is less than or equal to 10";
@@ -14,7 +14,7 @@ public class TernaryOperatorUnitTest {
}
@Test
- public void givenATrueCondition_whenUsingTernaryOperator_thenOnlyExpression1IsEvaluated() {
+ public void whenConditionIsTrue_thenOnlyFirstExpressionIsEvaluated() {
int exp1 = 0, exp2 = 0;
int result = 12 > 10 ? ++exp1 : ++exp2;
@@ -24,7 +24,7 @@ public class TernaryOperatorUnitTest {
}
@Test
- public void givenAFalseCondition_whenUsingTernaryOperator_thenOnlyExpression2IsEvaluated() {
+ public void whenConditionIsFalse_thenOnlySecondExpressionIsEvaluated() {
int exp1 = 0, exp2 = 0;
int result = 8 > 10 ? ++exp1 : ++exp2;
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 1dadbf1efa..b3b9be9ee4 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -18,7 +18,7 @@
core-java-optional
core-java-lang-operators
core-java-networking-2
- core-java-date-operations
+ core-java-date-operations-2
diff --git a/netflix/README.md b/netflix-modules/README.md
similarity index 89%
rename from netflix/README.md
rename to netflix-modules/README.md
index 0af07d37a8..4afea527df 100644
--- a/netflix/README.md
+++ b/netflix-modules/README.md
@@ -1,4 +1,4 @@
-## Netflix
+## Netflix Modules
This module contains articles about Netflix.
diff --git a/netflix/genie/pom.xml b/netflix-modules/genie/pom.xml
similarity index 92%
rename from netflix/genie/pom.xml
rename to netflix-modules/genie/pom.xml
index 2288c5338a..835bbf2b50 100644
--- a/netflix/genie/pom.xml
+++ b/netflix-modules/genie/pom.xml
@@ -10,7 +10,7 @@
com.baeldung
- netflix
+ netflix-modules
1.0.0-SNAPSHOT
diff --git a/netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/docker-compose.yml b/netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/docker-compose.yml
similarity index 100%
rename from netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/docker-compose.yml
rename to netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/docker-compose.yml
diff --git a/netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/init_demo.py b/netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/init_demo.py
similarity index 100%
rename from netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/init_demo.py
rename to netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/init_demo.py
diff --git a/netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/run_spark_submit_job.py b/netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/run_spark_submit_job.py
similarity index 100%
rename from netflix/genie/src/main/resources/com/baeldung/netflix/genie/docker/run_spark_submit_job.py
rename to netflix-modules/genie/src/main/resources/com/baeldung/netflix/genie/docker/run_spark_submit_job.py
diff --git a/netflix/pom.xml b/netflix-modules/pom.xml
similarity index 89%
rename from netflix/pom.xml
rename to netflix-modules/pom.xml
index 6cf81cd7ab..5a082e8f1a 100644
--- a/netflix/pom.xml
+++ b/netflix-modules/pom.xml
@@ -2,9 +2,9 @@
4.0.0
- netflix
+ netflix-modules
1.0.0-SNAPSHOT
- Netflix
+ Netflix Modules
pom
Module for Netflix projects
diff --git a/pom.xml b/pom.xml
index cb2fe5a929..c28fcdb273 100644
--- a/pom.xml
+++ b/pom.xml
@@ -400,7 +400,7 @@
core-java-modules/core-java-lang-math
mustache
mybatis
+
ninja
- netflix
+ netflix-modules
optaplanner
orika
@@ -669,7 +670,7 @@
- netflix
+ netflix-modules
parent-boot-1
parent-boot-2
@@ -1040,7 +1041,7 @@
core-java-modules/core-java-lang-math
mustache
mybatis
+
ninja
- netflix
+ netflix-modules
optaplanner
orika
diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml
index ab2b92102c..8dbce0fd6c 100644
--- a/spring-boot-admin/pom.xml
+++ b/spring-boot-admin/pom.xml
@@ -11,6 +11,7 @@
com.baeldung
parent-boot-2
0.0.1-SNAPSHOT
+ ../parent-boot-2
diff --git a/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/FilePropertyInjectionUnitTest.java b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/FilePropertyInjectionUnitTest.java
new file mode 100644
index 0000000000..874f632401
--- /dev/null
+++ b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/FilePropertyInjectionUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.properties.testproperty;
+
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource("/foo.properties")
+public class FilePropertyInjectionUnitTest {
+
+ @Value("${foo}")
+ private String foo;
+
+ @Test
+ public void whenFilePropertyProvided_thenProperlyInjected() {
+ assertThat(foo).isEqualTo("bar");
+ }
+}
diff --git a/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/PropertyInjectionUnitTest.java b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/PropertyInjectionUnitTest.java
new file mode 100644
index 0000000000..9492e18322
--- /dev/null
+++ b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/PropertyInjectionUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.testproperty;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource(properties = {"foo=bar"})
+public class PropertyInjectionUnitTest {
+
+ @Value("${foo}")
+ private String foo;
+
+ @Test
+ public void whenPropertyProvided_thenProperlyInjected() {
+ assertThat(foo).isEqualTo("bar");
+ }
+}
diff --git a/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/SpringBootPropertyInjectionIntegrationTest.java b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/SpringBootPropertyInjectionIntegrationTest.java
new file mode 100644
index 0000000000..fdca7e814d
--- /dev/null
+++ b/spring-boot-properties/src/test/java/com/baeldung/properties/testproperty/SpringBootPropertyInjectionIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.properties.testproperty;
+
+import com.baeldung.properties.reloading.SpringBootPropertiesTestApplication;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(properties = {"foo=bar"}, classes = SpringBootPropertiesTestApplication.class)
+public class SpringBootPropertyInjectionIntegrationTest {
+
+ @Value("${foo}")
+ private String foo;
+
+ @Test
+ public void whenSpringBootPropertyProvided_thenProperlyInjected() {
+ assertThat(foo).isEqualTo("bar");
+ }
+}
diff --git a/spring-boot-properties/src/test/resources/foo.properties b/spring-boot-properties/src/test/resources/foo.properties
new file mode 100644
index 0000000000..c9f0304f65
--- /dev/null
+++ b/spring-boot-properties/src/test/resources/foo.properties
@@ -0,0 +1 @@
+foo=bar
\ No newline at end of file
diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml
index 2152a0a00d..b8ebd27e13 100644
--- a/spring-boot/pom.xml
+++ b/spring-boot/pom.xml
@@ -7,16 +7,17 @@
spring-boot
war
This is simple boot application for Spring boot actuator test
+ 0.0.1-SNAPSHOT
- com.baeldung
parent-boot-2
+ com.baeldung
0.0.1-SNAPSHOT
../parent-boot-2
-
+
org.junit.jupiter
@@ -198,6 +199,16 @@
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+
+
+ @
+
+ false
+
+
@@ -251,6 +262,7 @@
5.2.4
18.0
2.2.4
+ @
diff --git a/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java b/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java
new file mode 100644
index 0000000000..405cec3eac
--- /dev/null
+++ b/spring-boot/src/main/java/com/baeldung/buildproperties/Application.java
@@ -0,0 +1,18 @@
+package com.baeldung.buildproperties;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.PropertySource;
+
+@SpringBootApplication
+@ComponentScan(basePackages = "com.baeldung.buildproperties")
+@PropertySource("classpath:build.properties")
+//@PropertySource("classpath:build.yml")
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
diff --git a/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java b/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java
new file mode 100644
index 0000000000..2a0d27188e
--- /dev/null
+++ b/spring-boot/src/main/java/com/baeldung/buildproperties/BuildInfoService.java
@@ -0,0 +1,21 @@
+package com.baeldung.buildproperties;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BuildInfoService {
+ @Value("${application-description}")
+ private String applicationDescription;
+
+ @Value("${application-version}")
+ private String applicationVersion;
+
+ public String getApplicationDescription() {
+ return applicationDescription;
+ }
+
+ public String getApplicationVersion() {
+ return applicationVersion;
+ }
+}
diff --git a/spring-boot/src/main/resources/build.properties b/spring-boot/src/main/resources/build.properties
new file mode 100644
index 0000000000..1612b8086d
--- /dev/null
+++ b/spring-boot/src/main/resources/build.properties
@@ -0,0 +1,2 @@
+application-description=@project.description@
+application-version=@project.version@
\ No newline at end of file
diff --git a/spring-boot/src/main/resources/build.yml b/spring-boot/src/main/resources/build.yml
new file mode 100644
index 0000000000..528d2e3440
--- /dev/null
+++ b/spring-boot/src/main/resources/build.yml
@@ -0,0 +1,2 @@
+application-description: ^project.description^
+application-version: ^project.version^
\ No newline at end of file
diff --git a/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java
new file mode 100644
index 0000000000..cb056fe56d
--- /dev/null
+++ b/spring-boot/src/test/java/com/baeldung/buildproperties/BuildInfoServiceIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.buildproperties;
+
+import static org.junit.Assert.assertThat;
+
+import org.hamcrest.Matchers;
+import org.junit.jupiter.api.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;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Application.class)
+class BuildInfoServiceIntegrationTest {
+
+ @Autowired
+ private BuildInfoService service;
+
+ @Test
+ void whenGetApplicationDescription_thenSuccess() {
+ assertThat(service.getApplicationDescription(), Matchers.is("This is simple boot application for Spring boot actuator test"));
+ assertThat(service.getApplicationVersion(), Matchers.is("0.0.1-SNAPSHOT"));
+ }
+}
diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java
index 5d02d34f53..c32e36d7e3 100644
--- a/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java
+++ b/spring-boot/src/test/java/org/baeldung/boot/repository/FooRepositoryIntegrationTest.java
@@ -1,19 +1,17 @@
package org.baeldung.boot.repository;
-import static org.junit.Assert.assertThat;
-
import org.baeldung.boot.DemoApplicationIntegrationTest;
import org.baeldung.demo.model.Foo;
import org.baeldung.demo.repository.FooRepository;
-
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.is;
-
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
@Transactional
public class FooRepositoryIntegrationTest extends DemoApplicationIntegrationTest {
@Autowired
@@ -28,8 +26,10 @@ public class FooRepositoryIntegrationTest extends DemoApplicationIntegrationTest
@Test
public void testFindByName() {
Foo foo = fooRepository.findByName("Bar");
+
assertThat(foo, notNullValue());
- assertThat(foo.getId(), is(2));
+ assertThat(foo.getId(), notNullValue());
+ assertThat(foo.getName(), is("Bar"));
}
}
diff --git a/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java
index baa4f70e83..b22282e896 100644
--- a/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java
+++ b/spring-boot/src/test/java/org/baeldung/boot/repository/HibernateSessionIntegrationTest.java
@@ -1,9 +1,5 @@
package org.baeldung.boot.repository;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
import org.baeldung.boot.DemoApplicationIntegrationTest;
import org.baeldung.demo.model.Foo;
import org.baeldung.demo.repository.FooRepository;
@@ -11,6 +7,10 @@ import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
@Transactional
public class HibernateSessionIntegrationTest extends DemoApplicationIntegrationTest {
@Autowired
@@ -18,13 +18,12 @@ public class HibernateSessionIntegrationTest extends DemoApplicationIntegrationT
@Test
public void whenSavingWithCurrentSession_thenThrowNoException() {
- Foo foo = new Foo("Exception Solved");
- fooRepository.save(foo);
- foo = null;
- foo = fooRepository.findByName("Exception Solved");
+ fooRepository.save(new Foo("Exception Solved"));
+
+ Foo foo = fooRepository.findByName("Exception Solved");
assertThat(foo, notNullValue());
- assertThat(foo.getId(), is(1));
+ assertThat(foo.getId(), notNullValue());
assertThat(foo.getName(), is("Exception Solved"));
}
}
diff --git a/spring-core-2/src/main/java/com/baeldung/scopes/ScopesConfig.java b/spring-core-2/src/main/java/com/baeldung/scopes/ScopesConfig.java
new file mode 100644
index 0000000000..2291baa62d
--- /dev/null
+++ b/spring-core-2/src/main/java/com/baeldung/scopes/ScopesConfig.java
@@ -0,0 +1,49 @@
+package com.baeldung.scopes;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+import org.springframework.context.annotation.ScopedProxyMode;
+import org.springframework.web.context.annotation.ApplicationScope;
+import org.springframework.web.context.annotation.RequestScope;
+import org.springframework.web.context.annotation.SessionScope;
+
+@Configuration
+public class ScopesConfig {
+
+ @Bean
+ @Scope("singleton")
+ public Person personSingleton() {
+ return new Person();
+ }
+
+ @Bean
+ @Scope("prototype")
+ public Person personPrototype() {
+ return new Person();
+ }
+
+ @Bean
+ @RequestScope
+ public HelloMessageGenerator requestScopedBean() {
+ return new HelloMessageGenerator();
+ }
+
+ @Bean
+ @SessionScope
+ public HelloMessageGenerator sessionScopedBean() {
+ return new HelloMessageGenerator();
+ }
+
+ @Bean
+ @ApplicationScope
+ public HelloMessageGenerator applicationScopedBean() {
+ return new HelloMessageGenerator();
+ }
+
+ @Bean
+ @Scope(scopeName = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
+ public HelloMessageGenerator websocketScopedBean() {
+ return new HelloMessageGenerator();
+ }
+}
diff --git a/spring-exceptions/README.md b/spring-exceptions/README.md
index f8c7553f05..2136402d49 100644
--- a/spring-exceptions/README.md
+++ b/spring-exceptions/README.md
@@ -1,4 +1,4 @@
-## Spring `Exception`s
+## Spring Exceptions
This module contains articles about Spring `Exception`s
diff --git a/spring-mvc-basics/src/main/webapp/WEB-INF/view/userHome.jsp b/spring-mvc-basics/src/main/webapp/WEB-INF/view/userHome.jsp
new file mode 100644
index 0000000000..38c08d5a18
--- /dev/null
+++ b/spring-mvc-basics/src/main/webapp/WEB-INF/view/userHome.jsp
@@ -0,0 +1,55 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+
+
+
+
+ User Form
+
+
+
+
+
+
New User
+
${message}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java b/spring-mvc-views/src/main/java/com/baeldung/themes/config/DataSourceConfig.java
similarity index 94%
rename from spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/config/DataSourceConfig.java
index 803c30f29d..3b1abfd459 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/config/DataSourceConfig.java
@@ -1,4 +1,4 @@
-package com.baeldung.config;
+package com.baeldung.themes.config;
import org.springframework.context.annotation.Bean;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
@@ -27,7 +27,7 @@ public class DataSourceConfig {
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource);
- em.setPackagesToScan("com.baeldung.domain");
+ em.setPackagesToScan("com.baeldung.themes.domain");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return em;
}
diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/InitSecurity.java b/spring-mvc-views/src/main/java/com/baeldung/themes/config/InitSecurity.java
similarity index 82%
rename from spring-mvc-views/src/main/java/com/baeldung/config/InitSecurity.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/config/InitSecurity.java
index 2bf659f476..929e49cb79 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/config/InitSecurity.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/config/InitSecurity.java
@@ -1,4 +1,4 @@
-package com.baeldung.config;
+package com.baeldung.themes.config;
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-mvc-views/src/main/java/com/baeldung/themes/config/SecurityConfig.java
similarity index 98%
rename from spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/config/SecurityConfig.java
index 2e0a413cf3..78a52d4f8b 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/config/SecurityConfig.java
@@ -1,4 +1,4 @@
-package com.baeldung.config;
+package com.baeldung.themes.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/ThemeMVCConfig.java b/spring-mvc-views/src/main/java/com/baeldung/themes/config/ThemeMVCConfig.java
similarity index 94%
rename from spring-mvc-views/src/main/java/com/baeldung/config/ThemeMVCConfig.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/config/ThemeMVCConfig.java
index 86f6f54195..1d3f94258e 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/config/ThemeMVCConfig.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/config/ThemeMVCConfig.java
@@ -1,6 +1,6 @@
-package com.baeldung.config;
+package com.baeldung.themes.config;
-import com.baeldung.theme.resolver.UserPreferenceThemeResolver;
+import com.baeldung.themes.resolver.UserPreferenceThemeResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/WebInitializer.java b/spring-mvc-views/src/main/java/com/baeldung/themes/config/WebInitializer.java
similarity index 96%
rename from spring-mvc-views/src/main/java/com/baeldung/config/WebInitializer.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/config/WebInitializer.java
index 5516fb7b3c..3fbe8d043d 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/config/WebInitializer.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/config/WebInitializer.java
@@ -1,4 +1,4 @@
-package com.baeldung.config;
+package com.baeldung.themes.config;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/controllers/AppController.java b/spring-mvc-views/src/main/java/com/baeldung/themes/controllers/AppController.java
similarity index 85%
rename from spring-mvc-views/src/main/java/com/baeldung/controllers/AppController.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/controllers/AppController.java
index 31343492e1..ed398fa60a 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/controllers/AppController.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/controllers/AppController.java
@@ -1,4 +1,4 @@
-package com.baeldung.controllers;
+package com.baeldung.themes.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/domain/UserPreference.java b/spring-mvc-views/src/main/java/com/baeldung/themes/domain/UserPreference.java
similarity index 93%
rename from spring-mvc-views/src/main/java/com/baeldung/domain/UserPreference.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/domain/UserPreference.java
index 81034de947..89f8ea1a36 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/domain/UserPreference.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/domain/UserPreference.java
@@ -1,4 +1,4 @@
-package com.baeldung.domain;
+package com.baeldung.themes.domain;
import javax.persistence.Entity;
import javax.persistence.Id;
diff --git a/spring-mvc-views/src/main/java/com/baeldung/repository/UserPreferenceRepository.java b/spring-mvc-views/src/main/java/com/baeldung/themes/repository/UserPreferenceRepository.java
similarity index 66%
rename from spring-mvc-views/src/main/java/com/baeldung/repository/UserPreferenceRepository.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/repository/UserPreferenceRepository.java
index 77e5da0498..d4e4ff0a5e 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/repository/UserPreferenceRepository.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/repository/UserPreferenceRepository.java
@@ -1,6 +1,6 @@
-package com.baeldung.repository;
+package com.baeldung.themes.repository;
-import com.baeldung.domain.UserPreference;
+import com.baeldung.themes.domain.UserPreference;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface UserPreferenceRepository extends PagingAndSortingRepository {
diff --git a/spring-mvc-views/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java b/spring-mvc-views/src/main/java/com/baeldung/themes/resolver/UserPreferenceThemeResolver.java
similarity index 95%
rename from spring-mvc-views/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java
rename to spring-mvc-views/src/main/java/com/baeldung/themes/resolver/UserPreferenceThemeResolver.java
index 4c59734d41..ff160110fd 100644
--- a/spring-mvc-views/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java
+++ b/spring-mvc-views/src/main/java/com/baeldung/themes/resolver/UserPreferenceThemeResolver.java
@@ -1,7 +1,7 @@
-package com.baeldung.theme.resolver;
+package com.baeldung.themes.resolver;
-import com.baeldung.domain.UserPreference;
-import com.baeldung.repository.UserPreferenceRepository;
+import com.baeldung.themes.domain.UserPreference;
+import com.baeldung.themes.repository.UserPreferenceRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
diff --git a/spring-scheduling/pom.xml b/spring-scheduling/pom.xml
index a337de39b7..8726fea438 100644
--- a/spring-scheduling/pom.xml
+++ b/spring-scheduling/pom.xml
@@ -5,7 +5,7 @@
spring-scheduling
0.1-SNAPSHOT
spring-scheduling
- war
+ jar
com.baeldung
diff --git a/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java b/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java
new file mode 100644
index 0000000000..33978962bb
--- /dev/null
+++ b/spring-security-modules/spring-security-rest/src/main/java/org/baeldung/security/SecurityWebApplicationInitializer.java
@@ -0,0 +1,10 @@
+package org.baeldung.security;
+
+import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
+
+public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
+
+ public SecurityWebApplicationInitializer() {
+ super(SecurityJavaConfig.class);
+ }
+}
diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java
new file mode 100644
index 0000000000..ed50732183
--- /dev/null
+++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationsUninitializedUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.mockito;
+
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+import java.util.List;
+
+public class MockitoAnnotationsUninitializedUnitTest {
+
+ @Mock
+ List mockedList;
+
+ @Test(expected = NullPointerException.class)
+ public void whenMockitoAnnotationsUninitialized_thenNPEThrown() {
+ Mockito.when(mockedList.size()).thenReturn(1);
+ }
+}
diff --git a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java
index 4dbe94991f..df3eeccca2 100644
--- a/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java
+++ b/testing-modules/mocks/src/test/java/com/baeldung/jmockit/LoginControllerIntegrationTest.java
@@ -130,30 +130,33 @@ public class LoginControllerIntegrationTest {
};
}
+
@Test
public void partialMocking() {
- // use partial mock
- final LoginService partialLoginService = new LoginService();
+ LoginService partialLoginService = new LoginService();
partialLoginService.setLoginDao(loginDao);
loginController.loginService = partialLoginService;
- final UserForm userForm = new UserForm();
+ UserForm userForm = new UserForm();
userForm.username = "foo";
- // let service's login use implementation so let's mock DAO call
- new Expectations() {{
- loginDao.login(userForm);
- result = 1;
- // no expectation for loginService.login
+
+ new Expectations(partialLoginService) {{
+ // let's mock DAO call
+ loginDao.login(userForm); result = 1;
+
+ // no expectation for login method so that real implementation is used
+
+ // mock setCurrentUser call
partialLoginService.setCurrentUser("foo");
}};
String login = loginController.login(userForm);
Assert.assertEquals("OK", login);
- // verify mocked call
- new FullVerifications(partialLoginService) {
- };
- new FullVerifications(loginDao) {
- };
+ // verify mocked call
+ new Verifications() {{
+ partialLoginService.setCurrentUser("foo");
+ }};
+
}
}
diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/Book.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/Book.java
new file mode 100644
index 0000000000..dc8f1dcf64
--- /dev/null
+++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/Book.java
@@ -0,0 +1,35 @@
+package com.baeldung.cucumberhooks.books;
+
+public class Book {
+
+ private String title;
+ private String author;
+
+ public Book(String title, String author) {
+ this.title = title;
+ this.author = author;
+ }
+
+ public Book() {}
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ @Override
+ public String toString() {
+ return "Book [title=" + title + ", author=" + author + "]";
+ }
+}
diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/BookStore.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/BookStore.java
new file mode 100644
index 0000000000..cc4e42d28f
--- /dev/null
+++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberhooks/books/BookStore.java
@@ -0,0 +1,28 @@
+package com.baeldung.cucumberhooks.books;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class BookStore {
+ private List books = new ArrayList<>();
+
+ public void addBook(Book book) {
+ books.add(book);
+ }
+
+ public void addAllBooks(Collection books) {
+ this.books.addAll(books);
+ }
+
+ public List booksByAuthor(String author) {
+ return books.stream()
+ .filter(book -> Objects.equals(author, book.getAuthor()))
+ .collect(Collectors.toList());
+ }
+
+ public Optional bookByTitle(String title) {
+ return books.stream()
+ .filter(book -> book.getTitle().equals(title))
+ .findFirst();
+ }
+}
diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksIntegrationTest.java
new file mode 100644
index 0000000000..4db8157c21
--- /dev/null
+++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksIntegrationTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.cucumberhooks.books;
+
+import io.cucumber.core.api.Scenario;
+import io.cucumber.java.After;
+import io.cucumber.java.AfterStep;
+import io.cucumber.java.Before;
+import io.cucumber.java.BeforeStep;
+import io.cucumber.java8.En;
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(features = "classpath:features/book-store-with-hooks.feature",
+ glue = "com.baeldung.cucumberhooks.books"
+)
+public class BookStoreWithHooksIntegrationTest implements En {
+
+ public BookStoreWithHooksIntegrationTest() {
+ Before(1, () -> startBrowser());
+ }
+
+ @Before(order=2, value="@Screenshots")
+ public void beforeScenario(Scenario scenario) {
+ takeScreenshot();
+ }
+
+ @After
+ public void afterScenario(Scenario scenario) {
+ takeScreenshot();
+ }
+
+ @BeforeStep
+ public void beforeStep(Scenario scenario) {
+ takeScreenshot();
+ }
+
+ @AfterStep
+ public void afterStep(Scenario scenario) {
+ takeScreenshot();
+ closeBrowser();
+ }
+
+ public void takeScreenshot() {
+ //code to take and save screenshot
+ }
+
+ public void startBrowser() {
+ //code to open browser
+ }
+
+ public void closeBrowser() {
+ //code to close browser
+ }
+}
diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksRunSteps.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksRunSteps.java
new file mode 100644
index 0000000000..8ebda5ffa4
--- /dev/null
+++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberhooks/books/BookStoreWithHooksRunSteps.java
@@ -0,0 +1,44 @@
+package com.baeldung.cucumberhooks.books;
+
+import io.cucumber.datatable.DataTable;
+import io.cucumber.java.en.Given;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import io.cucumber.java8.En;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class BookStoreWithHooksRunSteps implements En {
+
+ private BookStore store;
+ private List foundBooks;
+ private Book foundBook;
+
+ public BookStoreWithHooksRunSteps() {
+ store = new BookStore();
+ foundBooks = new ArrayList<>();
+ }
+
+ @Given("^The following books are available in the store$")
+ public void haveBooksInTheStore(DataTable table) {
+ List> rows = table.asLists(String.class);
+
+ for (List columns: rows) {
+ store.addBook(new Book(columns.get(0), columns.get(1)));
+ }
+ }
+
+ @When("^I ask for a book by the author (.+)$")
+ public void searchForBooksByAuthor(String author) {
+ foundBooks = store.booksByAuthor(author);
+ }
+
+ @Then("^The salesperson says that there are (\\d+) books$")
+ public void findBooks(int count) {
+ assertEquals(count, foundBooks.size());
+ }
+
+}
diff --git a/testing-modules/testing-libraries/src/test/resources/features/book-store-with-hooks.feature b/testing-modules/testing-libraries/src/test/resources/features/book-store-with-hooks.feature
new file mode 100644
index 0000000000..78e136d68d
--- /dev/null
+++ b/testing-modules/testing-libraries/src/test/resources/features/book-store-with-hooks.feature
@@ -0,0 +1,17 @@
+Feature: Book Store With Hooks
+ Background: The Book Store
+ Given The following books are available in the store
+ | The Devil in the White City | Erik Larson |
+ | The Lion, the Witch and the Wardrobe | C.S. Lewis |
+ | In the Garden of Beasts | Erik Larson |
+
+ @Screenshots
+ Scenario: 1 - Find books by author
+ When I ask for a book by the author Erik Larson
+ Then The salesperson says that there are 2 books
+
+ Scenario: 2 - Find books by author, but isn't there
+ When I ask for a book by the author Marcel Proust
+ Then The salesperson says that there are 0 books
+
+