diff --git a/README.md b/README.md
index 88750cf654..1ae225b1f3 100644
--- a/README.md
+++ b/README.md
@@ -18,27 +18,33 @@ Java and Spring Tutorials
This project is **a collection of small and focused tutorials** - each covering a single and well defined area of development in the Java ecosystem.
A strong focus of these is, of course, the Spring Framework - Spring, Spring Boot and Spring Security.
-In additional to Spring, the modules here are covering a number of aspects in Java.
+In addition to Spring, the modules here cover a number of aspects of Java.
Profile based segregation
====================
We are using maven build profiles to segregate the huge list of individual projects we have in our repository.
-The projects are broadly divided into 3 list: first, second and heavy.
+As for now, vast majority of the modules require JDK8 to build and run correctly.
-Next, they are segregated further on the basis of tests that we want to execute.
+The projects are broadly divided into 3 lists: first, second and heavy.
-Therefore, we have a total of 6 profiles:
+Next, they are segregated further on the basis of the tests that we want to execute.
-| Profile | Includes | Type of test enabled |
-| ----------------------- | --------------------------- | -------------------- |
-| default-first | First set of projects | *UnitTest |
-| integration-lite-first | First set of projects | *IntegrationTest |
-| default-second | Second set of projects | *UnitTest |
-| integration-lite-second | Second set of projects | *IntegrationTest |
-| default-heavy | Heavy/long running projects | *UnitTest |
-| integration-heavy | Heavy/long running projects | *IntegrationTest |
+Additionally, there are 2 profiles dedicated for JDK9 and above builds.
+
+Therefore, we have a total of 8 profiles:
+
+| Profile | Includes | Type of test enabled |
+| -------------------------- | --------------------------- | -------------------- |
+| default-first | First set of projects | *UnitTest |
+| integration-lite-first | First set of projects | *IntegrationTest |
+| default-second | Second set of projects | *UnitTest |
+| integration-lite-second | Second set of projects | *IntegrationTest |
+| default-heavy | Heavy/long running projects | *UnitTest |
+| integration-heavy | Heavy/long running projects | *IntegrationTest |
+| default-jdk9-and-above | JDK9 and above projects | *UnitTest |
+| integration-jdk9-and-above | JDK9 and above projects | *IntegrationTest |
Building the project
====================
@@ -53,15 +59,22 @@ or if we want to build the entire repository with Integration Tests enabled, we
`mvn clean install -Pintegration-lite-first,integration-lite-second,integration-heavy`
+Analogously, for the JDK9 and above projects the commands are:
+
+`mvn clean install -Pdefault-jdk9-and-above`
+
+and
+
+`mvn clean install -Pintegration-jdk9-and-above`
Building a single module
====================
-To build a specific module run the command: `mvn clean install` in the module directory
+To build a specific module, run the command: `mvn clean install` in the module directory.
Running a Spring Boot module
====================
-To run a Spring Boot module run the command: `mvn spring-boot:run` in the module directory
+To run a Spring Boot module, run the command: `mvn spring-boot:run` in the module directory.
Working with the IDE
@@ -81,11 +94,8 @@ To run the integration tests, use the command:
`mvn clean install -Pintegration-lite-second` or
-`mvn clean install -Pintegration-heavy`
+`mvn clean install -Pintegration-heavy` or
+
+`mvn clean install -Pintegration-jdk9-and-above`
depending on the list where our module exists
-
-
-
-
-
diff --git a/akka-http/pom.xml b/akka-http/pom.xml
index 4b73fbc960..a64d7a80f6 100644
--- a/akka-http/pom.xml
+++ b/akka-http/pom.xml
@@ -41,4 +41,4 @@
2.5.11
-
+
\ No newline at end of file
diff --git a/algorithms-genetic/pom.xml b/algorithms-genetic/pom.xml
index 00c9b88dfe..c53ae0f776 100644
--- a/algorithms-genetic/pom.xml
+++ b/algorithms-genetic/pom.xml
@@ -35,18 +35,11 @@
jenetics${io.jenetics.version}
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- 3.6.13.7.0
- 3.9.01.11
diff --git a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java b/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
index 3139b49586..7ea556b7fe 100644
--- a/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
+++ b/algorithms-genetic/src/main/java/com/baeldung/algorithms/ga/annealing/Travel.java
@@ -18,15 +18,16 @@ public class Travel {
}
public void generateInitialTravel() {
- if (travel.isEmpty())
+ if (travel.isEmpty()) {
new Travel(10);
+ }
Collections.shuffle(travel);
}
public void swapCities() {
int a = generateRandomIndex();
int b = generateRandomIndex();
- previousTravel = travel;
+ previousTravel = new ArrayList<>(travel);
City x = travel.get(a);
City y = travel.get(b);
travel.set(a, y);
diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-miscellaneous-1/pom.xml
index dd3742d4b0..c6f247f4e3 100644
--- a/algorithms-miscellaneous-1/pom.xml
+++ b/algorithms-miscellaneous-1/pom.xml
@@ -35,12 +35,6 @@
${lombok.version}provided
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- com.github.dpaukovcombinatoricslib3
@@ -70,9 +64,7 @@
3.6.1
- 3.9.01.11
- 27.0.1-jre3.3.02.7
diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-miscellaneous-2/pom.xml
index fcefc3ccba..a411cfdb71 100644
--- a/algorithms-miscellaneous-2/pom.xml
+++ b/algorithms-miscellaneous-2/pom.xml
@@ -45,12 +45,6 @@
tradukisto${tradukisto.version}
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
-
@@ -78,7 +72,6 @@
1.0.11.0.11.0.1
- 3.9.01.112.7
diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-miscellaneous-3/pom.xml
index 19eca8eca7..2f180da5e1 100644
--- a/algorithms-miscellaneous-3/pom.xml
+++ b/algorithms-miscellaneous-3/pom.xml
@@ -14,12 +14,6 @@
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- org.apache.commonscommons-collections4
@@ -43,7 +37,7 @@
org.apache.commonscommons-lang3
- ${commons.lang3.version}
+ ${commons-lang3.version}pl.pragmatists
@@ -69,11 +63,7 @@
- 3.9.0
- 4.3
- 28.0-jre2.6.0
- 3.8.11.1.0
diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-miscellaneous-4/pom.xml
index 1eae038bc0..1dc9a62f64 100644
--- a/algorithms-miscellaneous-4/pom.xml
+++ b/algorithms-miscellaneous-4/pom.xml
@@ -25,17 +25,6 @@
${lombok.version}provided
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
-
-
- 3.9.0
- 27.0.1-jre
-
-
\ No newline at end of file
diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
index 1ba535dfbc..7ceede9cb9 100644
--- a/algorithms-miscellaneous-5/pom.xml
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -34,26 +34,12 @@
guava${guava.version}
-
- org.junit.platform
- junit-platform-commons
- ${junit.platform.version}
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- 1.0.1
- 3.9.01.113.6.1
- 28.1-jre
- 1.6.0
\ No newline at end of file
diff --git a/algorithms-miscellaneous-6/pom.xml b/algorithms-miscellaneous-6/pom.xml
index c9479d160e..584ec8a8dd 100644
--- a/algorithms-miscellaneous-6/pom.xml
+++ b/algorithms-miscellaneous-6/pom.xml
@@ -19,17 +19,6 @@
guava${guava.version}
-
- org.junit.platform
- junit-platform-commons
- ${junit.platform.version}
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- org.projectlomboklombok
@@ -44,9 +33,6 @@
- 28.1-jre
- 3.9.0
- 1.6.03.6.1
diff --git a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
index 5ee913d251..f14aa2b0d2 100644
--- a/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
+++ b/algorithms-miscellaneous-6/src/main/java/com/baeldung/algorithms/caesarcipher/CaesarCipher.java
@@ -1,11 +1,16 @@
package com.baeldung.algorithms.caesarcipher;
import org.apache.commons.math3.stat.inference.ChiSquareTest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.stream.IntStream;
public class CaesarCipher {
+
+ private final Logger log = LoggerFactory.getLogger(CaesarCipher.class);
+
private static final char LETTER_A = 'a';
private static final char LETTER_Z = 'z';
private static final int ALPHABET_SIZE = LETTER_Z - LETTER_A + 1;
@@ -72,7 +77,7 @@ public class CaesarCipher {
private int probableOffset(double[] chiSquares) {
int probableOffset = 0;
for (int offset = 0; offset < chiSquares.length; offset++) {
- System.out.println(String.format("Chi-Square for offset %d: %.2f", offset, chiSquares[offset]));
+ log.debug(String.format("Chi-Square for offset %d: %.2f", offset, chiSquares[offset]));
if (chiSquares[offset] < chiSquares[probableOffset]) {
probableOffset = offset;
}
diff --git a/guest/core-java-9/src/main/resources/logback.xml b/algorithms-miscellaneous-6/src/main/resources/logback.xml
similarity index 100%
rename from guest/core-java-9/src/main/resources/logback.xml
rename to algorithms-miscellaneous-6/src/main/resources/logback.xml
diff --git a/algorithms-searching/pom.xml b/algorithms-searching/pom.xml
index a67c062403..edb8a0c423 100644
--- a/algorithms-searching/pom.xml
+++ b/algorithms-searching/pom.xml
@@ -13,15 +13,6 @@
1.0.0-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
-
-
-
algorithms-searching
@@ -32,8 +23,4 @@
-
- 3.9.0
-
-
\ No newline at end of file
diff --git a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java b/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
index 9d301f9578..ef1c7393c8 100644
--- a/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
+++ b/algorithms-searching/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
@@ -16,7 +16,7 @@ public class BreadthFirstSearchAlgorithm {
Tree currentNode;
while (!queue.isEmpty()) {
currentNode = queue.remove();
- LOGGER.info("Visited node with value: {}", currentNode.getValue());
+ LOGGER.debug("Visited node with value: {}", currentNode.getValue());
if (currentNode.getValue().equals(value)) {
return Optional.of(currentNode);
@@ -37,7 +37,7 @@ public class BreadthFirstSearchAlgorithm {
while (!queue.isEmpty()) {
currentNode = queue.remove();
- LOGGER.info("Visited node with value: {}", currentNode.getValue());
+ LOGGER.debug("Visited node with value: {}", currentNode.getValue());
if (currentNode.getValue().equals(value)) {
return Optional.of(currentNode);
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java b/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
index faf06ced31..4389795ffb 100644
--- a/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
+++ b/algorithms-searching/src/test/java/com/baeldung/algorithms/quadtree/QuadTreeSearchUnitTest.java
@@ -35,6 +35,7 @@ public class QuadTreeSearchUnitTest {
public void givenQuadTree_whenSearchingForRange_thenReturn1MatchingItem() {
Region searchArea = new Region(200, 200, 250, 250);
List result = quadTree.search(searchArea, null, "");
+
LOGGER.debug(result.toString());
LOGGER.debug(quadTree.printSearchTraversePath());
@@ -47,6 +48,7 @@ public class QuadTreeSearchUnitTest {
public void givenQuadTree_whenSearchingForRange_thenReturn2MatchingItems() {
Region searchArea = new Region(0, 0, 100, 100);
List result = quadTree.search(searchArea, null, "");
+
LOGGER.debug(result.toString());
LOGGER.debug(quadTree.printSearchTraversePath());
diff --git a/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java b/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
index ef4a05a9a1..d9a4f2962c 100644
--- a/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
+++ b/algorithms-searching/src/test/java/com/baeldung/algorithms/suffixtree/SuffixTreeUnitTest.java
@@ -24,7 +24,7 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForA_thenReturn6Matches() {
List matches = suffixTree.searchText("a");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] { "h[a]vanabanana", "hav[a]nabanana", "havan[a]banana", "havanab[a]nana", "havanaban[a]na", "havanabanan[a]" }, matches.toArray());
}
@@ -32,7 +32,7 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForNab_thenReturn1Match() {
List matches = suffixTree.searchText("nab");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] { "hava[nab]anana" }, matches.toArray());
}
@@ -40,7 +40,7 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForNag_thenReturnNoMatches() {
List matches = suffixTree.searchText("nag");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] {}, matches.toArray());
}
@@ -48,7 +48,7 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForBanana_thenReturn2Matches() {
List matches = suffixTree.searchText("ana");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] { "hav[ana]banana", "havanab[ana]na", "havanaban[ana]" }, matches.toArray());
}
@@ -56,7 +56,7 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForNa_thenReturn4Matches() {
List matches = suffixTree.searchText("na");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] { "hava[na]banana", "havanaba[na]na", "havanabana[na]" }, matches.toArray());
}
@@ -64,14 +64,14 @@ public class SuffixTreeUnitTest {
public void givenSuffixTree_whenSearchingForX_thenReturnNoMatches() {
List matches = suffixTree.searchText("x");
matches.stream()
- .forEach(m -> LOGGER.info(m));
+ .forEach(m -> LOGGER.debug(m));
Assert.assertArrayEquals(new String[] {}, matches.toArray());
}
private static void printTree() {
suffixTree.printTree();
- LOGGER.info("\n" + suffixTree.printTree());
- LOGGER.info("==============================================");
+ LOGGER.debug("\n" + suffixTree.printTree());
+ LOGGER.debug("==============================================");
}
}
diff --git a/algorithms-sorting-2/pom.xml b/algorithms-sorting-2/pom.xml
index f2a31d957d..a8477bf624 100644
--- a/algorithms-sorting-2/pom.xml
+++ b/algorithms-sorting-2/pom.xml
@@ -29,25 +29,11 @@
${lombok.version}provided
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter-api.version}
- test
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- 3.6.1
- 3.9.01.11
- 5.3.1
\ No newline at end of file
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index cae5eb6efc..383014d528 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -30,25 +30,11 @@
${lombok.version}provided
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter-api.version}
- test
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- 3.6.1
- 3.9.01.11
- 5.3.1
\ No newline at end of file
diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml
index 8003743f95..b373d78dd1 100644
--- a/apache-kafka/pom.xml
+++ b/apache-kafka/pom.xml
@@ -98,12 +98,6 @@
jackson-databind${jackson.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.testcontainerskafka
@@ -170,13 +164,11 @@
- 3.6.22.8.01.15.31.15.31.5.03.0.0
- 29.0-jre2.4.80.8.1-spark3.0-s_2.122.5.2
diff --git a/apache-libraries/pom.xml b/apache-libraries/pom.xml
index b4cf11b07d..3d78869865 100644
--- a/apache-libraries/pom.xml
+++ b/apache-libraries/pom.xml
@@ -156,13 +156,6 @@
solr-solrj${solr.solr-solrj.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -202,7 +195,6 @@
1.81.8.22.19.0
- 3.9.01.1.21.1.0.Final1.2.0
diff --git a/guest/deep-jsf/src/main/resources/logback.xml b/apache-olingo/olingo2/src/main/resources/logback.xml
similarity index 100%
rename from guest/deep-jsf/src/main/resources/logback.xml
rename to apache-olingo/olingo2/src/main/resources/logback.xml
diff --git a/apache-olingo/olingo2/src/test/resources/logback-test.xml b/apache-olingo/olingo2/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..8d4771e308
--- /dev/null
+++ b/apache-olingo/olingo2/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apache-poi-2/.gitignore b/apache-poi-2/.gitignore
new file mode 100644
index 0000000000..d5c7c78cb1
--- /dev/null
+++ b/apache-poi-2/.gitignore
@@ -0,0 +1,4 @@
+*.docx
+temp.xls
+temp.xlsx
+number_test.xlsx
diff --git a/apache-poi-2/README.md b/apache-poi-2/README.md
new file mode 100644
index 0000000000..2fd0135b11
--- /dev/null
+++ b/apache-poi-2/README.md
@@ -0,0 +1,12 @@
+## Apache POI
+
+This module contains articles about Apache POI.
+
+### Relevant Articles:
+
+- [Adding a Column to an Excel Sheet Using Apache POI](https://www.baeldung.com/java-excel-add-column)
+- [Add an Image to a Cell in an Excel File With Java](https://www.baeldung.com/java-add-image-excel)
+- [Numeric Format Using POI](https://www.baeldung.com/apache-poi-numeric-format)
+- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi)
+- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow)
+- More articles: [[<-- prev]](../apache-poi)
diff --git a/guest/logback-example/pom.xml b/apache-poi-2/pom.xml
similarity index 51%
rename from guest/logback-example/pom.xml
rename to apache-poi-2/pom.xml
index e7e83c743f..a46365c63c 100644
--- a/guest/logback-example/pom.xml
+++ b/apache-poi-2/pom.xml
@@ -1,28 +1,29 @@
-4.0.0
- com.stackify
- logback-example
+ apache-poi-20.0.1-SNAPSHOT
- logback-example
+ apache-poi-2com.baeldungparent-modules1.0.0-SNAPSHOT
- ../../
- org.codehaus.janino
- janino
- ${janino.version}
+ org.apache.poi
+ poi-ooxml
+ ${poi.version}
- 3.0.7
+ 5.0.0
-
\ No newline at end of file
+
+
+
diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/ExcelColumn.java b/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/ExcelColumn.java
new file mode 100644
index 0000000000..00ca24f6e8
--- /dev/null
+++ b/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/ExcelColumn.java
@@ -0,0 +1,16 @@
+package com.baeldung.poi.excel.newcolumn;
+import org.apache.poi.ss.usermodel.CellType;
+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;
+
+
+public class ExcelColumn {
+
+ public void addColumn(Sheet sheet, CellType cellType) {
+ for (Row currentRow : sheet) {
+ currentRow.createCell(currentRow.getLastCellNum(), cellType);
+ }
+ }
+}
diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/numeric/ExcelNumericFormat.java b/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/numeric/ExcelNumericFormat.java
new file mode 100644
index 0000000000..02148c783b
--- /dev/null
+++ b/apache-poi-2/src/main/java/com/baeldung/poi/excel/newcolumn/numeric/ExcelNumericFormat.java
@@ -0,0 +1,19 @@
+package com.baeldung.poi.excel.newcolumn.numeric;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.DataFormat;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Workbook;
+
+public class ExcelNumericFormat {
+
+ public static void applyNumericFormat(Workbook outWorkbook, Row row, Cell cell, Double value, String styleFormat) {
+ CellStyle style = outWorkbook.createCellStyle();
+ DataFormat format = outWorkbook.createDataFormat();
+ style.setDataFormat(format.getFormat(styleFormat));
+ cell.setCellValue(value);
+ cell.setCellStyle(style);
+ }
+
+}
diff --git a/apache-poi-2/src/main/java/com/baeldung/poi/excel/write/addimageincell/ExcelCellImageHelper.java b/apache-poi-2/src/main/java/com/baeldung/poi/excel/write/addimageincell/ExcelCellImageHelper.java
new file mode 100644
index 0000000000..6bd4f9d66b
--- /dev/null
+++ b/apache-poi-2/src/main/java/com/baeldung/poi/excel/write/addimageincell/ExcelCellImageHelper.java
@@ -0,0 +1,76 @@
+package com.baeldung.poi.excel.write.addimageincell;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+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.util.IOUtils;
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
+import org.apache.poi.xssf.usermodel.XSSFDrawing;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * This Helper class Add an Image to a Cell of an Excel File With apache-poi api.
+ *
+ */
+public class ExcelCellImageHelper {
+
+ public static void main(String[] args) throws IOException, InvalidFormatException {
+ try (final Workbook workbook = new XSSFWorkbook();
+ FileOutputStream saveExcel = new FileOutputStream("target/baeldung-apachepoi.xlsx");) {
+
+ Sheet sheet = workbook.createSheet("Avengers");
+
+ XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch();
+ XSSFClientAnchor ironManAnchor = new XSSFClientAnchor();
+ XSSFClientAnchor spiderManAnchor = new XSSFClientAnchor();
+
+ // Fill row1 data
+ Row row1 = sheet.createRow(0);
+ row1.setHeight((short) 1000);
+ row1.createCell(0)
+ .setCellValue("IRON-MAN");
+ updateCellWithImage(workbook, 1, drawing, ironManAnchor, "ironman.png");
+
+ // Fill row2 data
+ Row row2 = sheet.createRow(1);
+ row2.setHeight((short) 1000);
+ row2.createCell(0)
+ .setCellValue("SPIDER-MAN");
+ updateCellWithImage(workbook, 2, drawing, spiderManAnchor, "spiderman.png");
+
+ // Resize all columns to fit the content size
+ for (int i = 0; i < 2; i++) {
+ sheet.autoSizeColumn(i);
+ }
+ workbook.write(saveExcel);
+ }
+
+ }
+
+ /**
+ * This method position the anchor for a given rowNum and add the image correctly.
+ * @param workbook
+ * @param rowNum
+ * @param drawing
+ * @param inputImageAnchor
+ * @throws IOException
+ */
+ private static void updateCellWithImage(Workbook workbook, int rowNum, XSSFDrawing drawing, XSSFClientAnchor inputImageAnchor, String inputImageName) throws IOException {
+ InputStream inputImageStream = ExcelCellImageHelper.class.getClassLoader()
+ .getResourceAsStream(inputImageName);
+ byte[] inputImageBytes = IOUtils.toByteArray(inputImageStream);
+ int inputImagePictureID = workbook.addPicture(inputImageBytes, Workbook.PICTURE_TYPE_PNG);
+ inputImageStream.close();
+ inputImageAnchor.setCol1(1);
+ inputImageAnchor.setRow1(rowNum - 1);
+ inputImageAnchor.setCol2(2);
+ inputImageAnchor.setRow2(rowNum);
+ drawing.createPicture(inputImageAnchor, inputImagePictureID);
+ }
+
+}
diff --git a/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java b/apache-poi-2/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
similarity index 89%
rename from apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
rename to apache-poi-2/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
index e2af4f8808..5b40301de5 100644
--- a/apache-poi/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
+++ b/apache-poi-2/src/main/java/com/baeldung/poi/powerpoint/PowerPointHelper.java
@@ -5,7 +5,22 @@ import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.util.IOUtils;
-import org.apache.poi.xslf.usermodel.*;
+import org.apache.poi.xslf.usermodel.SlideLayout;
+import org.apache.poi.xslf.usermodel.XMLSlideShow;
+import org.apache.poi.xslf.usermodel.XSLFAutoShape;
+import org.apache.poi.xslf.usermodel.XSLFHyperlink;
+import org.apache.poi.xslf.usermodel.XSLFPictureData;
+import org.apache.poi.xslf.usermodel.XSLFPictureShape;
+import org.apache.poi.xslf.usermodel.XSLFShape;
+import org.apache.poi.xslf.usermodel.XSLFSlide;
+import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
+import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
+import org.apache.poi.xslf.usermodel.XSLFTable;
+import org.apache.poi.xslf.usermodel.XSLFTableCell;
+import org.apache.poi.xslf.usermodel.XSLFTableRow;
+import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
+import org.apache.poi.xslf.usermodel.XSLFTextRun;
+import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.awt.*;
import java.io.FileInputStream;
@@ -155,8 +170,8 @@ public class PowerPointHelper {
/**
* Retrieve the placeholder inside a slide
- *
- * @param slide
+ *
+ * @param slide
* The slide
* @return List of placeholder inside a slide
*/
diff --git a/apache-poi/src/main/java/com/baeldung/poi/word/WordDocument.java b/apache-poi-2/src/main/java/com/baeldung/poi/word/WordDocument.java
similarity index 93%
rename from apache-poi/src/main/java/com/baeldung/poi/word/WordDocument.java
rename to apache-poi-2/src/main/java/com/baeldung/poi/word/WordDocument.java
index 599da86eaa..ee754beeb9 100644
--- a/apache-poi/src/main/java/com/baeldung/poi/word/WordDocument.java
+++ b/apache-poi-2/src/main/java/com/baeldung/poi/word/WordDocument.java
@@ -1,7 +1,11 @@
package com.baeldung.poi.word;
import org.apache.poi.util.Units;
-import org.apache.poi.xwpf.usermodel.*;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.FileOutputStream;
import java.io.IOException;
diff --git a/apache-poi-2/src/main/resources/ironman.png b/apache-poi-2/src/main/resources/ironman.png
new file mode 100644
index 0000000000..30096294c9
Binary files /dev/null and b/apache-poi-2/src/main/resources/ironman.png differ
diff --git a/apache-poi/src/main/resources/logo-leaf.png b/apache-poi-2/src/main/resources/logo-leaf.png
similarity index 100%
rename from apache-poi/src/main/resources/logo-leaf.png
rename to apache-poi-2/src/main/resources/logo-leaf.png
diff --git a/apache-poi/src/main/resources/poi-word-para1.txt b/apache-poi-2/src/main/resources/poi-word-para1.txt
similarity index 100%
rename from apache-poi/src/main/resources/poi-word-para1.txt
rename to apache-poi-2/src/main/resources/poi-word-para1.txt
diff --git a/apache-poi/src/main/resources/poi-word-para2.txt b/apache-poi-2/src/main/resources/poi-word-para2.txt
similarity index 100%
rename from apache-poi/src/main/resources/poi-word-para2.txt
rename to apache-poi-2/src/main/resources/poi-word-para2.txt
diff --git a/apache-poi/src/main/resources/poi-word-para3.txt b/apache-poi-2/src/main/resources/poi-word-para3.txt
similarity index 100%
rename from apache-poi/src/main/resources/poi-word-para3.txt
rename to apache-poi-2/src/main/resources/poi-word-para3.txt
diff --git a/apache-poi-2/src/main/resources/spiderman.png b/apache-poi-2/src/main/resources/spiderman.png
new file mode 100644
index 0000000000..32982bbe65
Binary files /dev/null and b/apache-poi-2/src/main/resources/spiderman.png differ
diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/ExcelColumnUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/ExcelColumnUnitTest.java
new file mode 100644
index 0000000000..9b991719b1
--- /dev/null
+++ b/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/ExcelColumnUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.poi.excel.newcolumn;
+
+import org.apache.poi.ss.usermodel.CellType;
+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;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+
+public class ExcelColumnUnitTest {
+ private static final String FILE_NAME = "newColumnTest.xlsx";
+ private String fileLocation;
+
+ @Before
+ public void setup() throws URISyntaxException {
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ }
+
+ @Test
+ public void givenExistingRows_whenAddNewColumn_thenRowColumnNumberIncreased() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ Row row = sheet.getRow(0);
+ assertEquals(5, row.getLastCellNum());
+
+ ExcelColumn excelColumn = new ExcelColumn();
+ excelColumn.addColumn(sheet, CellType.STRING);
+ assertEquals(6, row.getLastCellNum());
+
+ workbook.close();
+ }
+
+}
\ No newline at end of file
diff --git a/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/numeric/NumberCellValueUnitTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/numeric/NumberCellValueUnitTest.java
new file mode 100644
index 0000000000..ae1090fd69
--- /dev/null
+++ b/apache-poi-2/src/test/java/com/baeldung/poi/excel/newcolumn/numeric/NumberCellValueUnitTest.java
@@ -0,0 +1,105 @@
+package com.baeldung.poi.excel.newcolumn.numeric;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+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.Test;
+import org.junit.jupiter.api.Assertions;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.DecimalFormat;
+
+public class NumberCellValueUnitTest {
+
+ @Test
+ public void decimalDisplay_whenAddedDouble_thenNumericCellCreated() throws IOException {
+ File file = new File("number_test.xlsx");
+ try (Workbook outWorkbook = new XSSFWorkbook()) {
+ Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
+ Row row = sheet.createRow(0);
+ Cell cell = row.createCell(0);
+ ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, 10.251, "0.00");
+ FileOutputStream fileOut = new FileOutputStream(file);
+ outWorkbook.write(fileOut);
+ fileOut.close();
+ }
+ try (Workbook inWorkbook = new XSSFWorkbook("number_test.xlsx")) {
+ Sheet sheet = inWorkbook.cloneSheet(0);
+ Row row = sheet.getRow(0);
+ Assertions.assertEquals(10.251, row.getCell(0)
+ .getNumericCellValue());
+ file.delete();
+ }
+ }
+
+ @Test
+ public void decimalRoundedDisplay_whenAddedDouble_thenNumericCellCreated() throws IOException {
+ File file = new File("number_test.xlsx");
+ try (Workbook outWorkbook = new XSSFWorkbook()) {
+ Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
+ Row row = sheet.createRow(0);
+ Cell cell = row.createCell(0);
+ ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, 10.251123, "#,##0.0000");
+ FileOutputStream fileOut = new FileOutputStream(file);
+ outWorkbook.write(fileOut);
+ fileOut.close();
+ }
+ try (Workbook inWorkbook = new XSSFWorkbook("number_test.xlsx")) {
+ Sheet sheet = inWorkbook.cloneSheet(0);
+ Row row = sheet.getRow(0);
+ Assertions.assertEquals(10.251123, row.getCell(0)
+ .getNumericCellValue());
+ file.delete();
+ }
+ }
+
+ @Test
+ public void decimalDisplayInXLS_whenAddedDouble_thenNumericCellCreated() throws IOException {
+ File file = new File("number_test.xls");
+ try (Workbook outWorkbook = new HSSFWorkbook()) {
+ Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
+ Row row = sheet.createRow(0);
+ Cell cell = row.createCell(0);
+ ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, 10.251, "0.00");
+ FileOutputStream fileOut = new FileOutputStream(file);
+ outWorkbook.write(fileOut);
+ fileOut.close();
+ }
+ try (Workbook inWorkbook = new HSSFWorkbook(new FileInputStream(file))) {
+ Sheet sheet = inWorkbook.cloneSheet(0);
+ Row row = sheet.getRow(0);
+ Assertions.assertEquals(10.251, row.getCell(0)
+ .getNumericCellValue());
+ file.delete();
+ }
+ }
+
+ @Test
+ public void decimalValue_whenAddedDouble_thenNumericCellCreated() throws IOException {
+ File file = new File("number_test.xlsx");
+ try (Workbook outWorkbook = new XSSFWorkbook()) {
+ Sheet sheet = outWorkbook.createSheet("Numeric Sheet");
+ Row row = sheet.createRow(0);
+ Cell cell = row.createCell(0);
+ DecimalFormat df = new DecimalFormat("#,###.##");
+ ExcelNumericFormat.applyNumericFormat(outWorkbook, row, cell, Double.valueOf(df.format(10.251)), "#,###.##");
+
+ FileOutputStream fileOut = new FileOutputStream(file);
+ outWorkbook.write(fileOut);
+ fileOut.close();
+ }
+ try (Workbook inWorkbook = new XSSFWorkbook("number_test.xlsx")) {
+ Sheet sheet = inWorkbook.cloneSheet(0);
+ Row row = sheet.getRow(0);
+ Assertions.assertEquals(10.25, row.getCell(0)
+ .getNumericCellValue());
+ file.delete();
+ }
+ }
+}
\ No newline at end of file
diff --git a/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
similarity index 99%
rename from apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
rename to apache-poi-2/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
index 7253238e80..aff0ab3821 100644
--- a/apache-poi/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
+++ b/apache-poi-2/src/test/java/com/baeldung/poi/powerpoint/PowerPointIntegrationTest.java
@@ -1,8 +1,5 @@
package com.baeldung.poi.powerpoint;
-import java.io.File;
-import java.util.List;
-
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
@@ -13,12 +10,15 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
+import java.io.File;
+import java.util.List;
+
public class PowerPointIntegrationTest {
private PowerPointHelper pph;
private String fileLocation;
private static final String FILE_NAME = "presentation.pptx";
-
+
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
diff --git a/apache-poi/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java b/apache-poi-2/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java
similarity index 100%
rename from apache-poi/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java
rename to apache-poi-2/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java
index 98b5c5b520..fe83aa4a4d 100644
--- a/apache-poi/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java
+++ b/apache-poi-2/src/test/java/com/baeldung/poi/word/WordIntegrationTest.java
@@ -1,19 +1,19 @@
package com.baeldung.poi.word;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.junit.BeforeClass;
import org.junit.Test;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
public class WordIntegrationTest {
static WordDocument wordDocument;
diff --git a/apache-poi-2/src/test/resources/newColumnTest.xlsx b/apache-poi-2/src/test/resources/newColumnTest.xlsx
new file mode 100644
index 0000000000..54e8734d58
Binary files /dev/null and b/apache-poi-2/src/test/resources/newColumnTest.xlsx differ
diff --git a/apache-poi/README.md b/apache-poi/README.md
index d500787536..34e7631087 100644
--- a/apache-poi/README.md
+++ b/apache-poi/README.md
@@ -1,14 +1,17 @@
## Apache POI
-This module contains articles about Apache POI
+This module contains articles about Apache POI.
### Relevant Articles:
-- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi)
- [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel)
-- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow)
- [Merge Cells in Excel Using Apache POI](https://www.baeldung.com/java-apache-poi-merge-cells)
- [Get String Value of Excel Cell with Apache POI](https://www.baeldung.com/java-apache-poi-cell-string-value)
- [Read Excel Cell Value Rather Than Formula With Apache POI](https://www.baeldung.com/apache-poi-read-cell-value-formula)
- [Setting Formulas in Excel with Apache POI](https://www.baeldung.com/java-apache-poi-set-formulas)
- [Insert a Row in Excel Using Apache POI](https://www.baeldung.com/apache-poi-insert-excel-row)
+- [Multiline Text in Excel Cell Using Apache POI](https://www.baeldung.com/apache-poi-write-multiline-text)
+- [Set Background Color of a Cell with Apache POI](https://www.baeldung.com/apache-poi-background-color)
+- [Add Borders to Excel Cells With Apache POI](https://www.baeldung.com/apache-poi-add-borders)
+- [Reading Values From Excel in Java](https://www.baeldung.com/java-read-dates-excel)
+- More articles: [[next -->]](../apache-poi-2)
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java
new file mode 100644
index 0000000000..50bbfbbe3c
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java
@@ -0,0 +1,75 @@
+package com.baeldung.poi.excel;
+
+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.DateUtil;
+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;
+
+public class ExcelUtility {
+ private static final String ENDLINE = System.getProperty("line.separator");
+
+ public static String readExcel(String filePath) throws IOException {
+ File file = new File(filePath);
+ FileInputStream inputStream = null;
+ StringBuilder toReturn = new StringBuilder();
+ try {
+ inputStream = new FileInputStream(file);
+ Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream);
+ for (Sheet sheet : baeuldungWorkBook) {
+ toReturn.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ toReturn.append("Worksheet :")
+ .append(sheet.getSheetName())
+ .append(ENDLINE);
+ toReturn.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ int firstRow = sheet.getFirstRowNum();
+ int lastRow = sheet.getLastRowNum();
+ for (int index = firstRow + 1; index <= lastRow; index++) {
+ Row row = sheet.getRow(index);
+ toReturn.append("|| ");
+ for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
+ Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+ printCellValue(cell, toReturn);
+ }
+ toReturn.append(" ||")
+ .append(ENDLINE);
+ }
+ }
+ inputStream.close();
+
+ } catch (IOException e) {
+ throw e;
+ }
+ return toReturn.toString();
+ }
+
+ public static void printCellValue(Cell cell, StringBuilder toReturn) {
+ CellType cellType = cell.getCellType()
+ .equals(CellType.FORMULA) ? cell.getCachedFormulaResultType() : cell.getCellType();
+ if (cellType.equals(CellType.STRING)) {
+ toReturn.append(cell.getStringCellValue())
+ .append(" | ");
+ }
+ if (cellType.equals(CellType.NUMERIC)) {
+ if (DateUtil.isCellDateFormatted(cell)) {
+ toReturn.append(cell.getDateCellValue())
+ .append(" | ");
+ } else {
+ toReturn.append(cell.getNumericCellValue())
+ .append(" | ");
+ }
+ }
+ if (cellType.equals(CellType.BOOLEAN)) {
+ toReturn.append(cell.getBooleanCellValue())
+ .append(" | ");
+ }
+ }
+}
\ No newline at end of file
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig
new file mode 100644
index 0000000000..c058f3abcf
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/ExcelUtility.java.orig
@@ -0,0 +1,128 @@
+package com.baeldung.poi.excel;
+
+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.DateUtil;
+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;
+
+public class ExcelUtility {
+<<<<<<< HEAD
+ private static final String ENDLINE = System.getProperty("line.separator");
+
+ public static String readExcel(String filePath) throws IOException {
+ File file = new File(filePath);
+ FileInputStream inputStream = null;
+ StringBuilder toReturn = new StringBuilder();
+ try {
+ inputStream = new FileInputStream(file);
+ Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream);
+ for (Sheet sheet : baeuldungWorkBook) {
+ toReturn.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ toReturn.append("Worksheet :")
+ .append(sheet.getSheetName())
+ .append(ENDLINE);
+ toReturn.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ int firstRow = sheet.getFirstRowNum();
+ int lastRow = sheet.getLastRowNum();
+ for (int index = firstRow + 1; index <= lastRow; index++) {
+ Row row = sheet.getRow(index);
+ toReturn.append("|| ");
+ for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
+ Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+ printCellValue(cell, toReturn);
+ }
+ toReturn.append(" ||")
+ .append(ENDLINE);
+ }
+ }
+ inputStream.close();
+
+ } catch (IOException e) {
+ throw e;
+ }
+ return toReturn.toString();
+ }
+
+ public static void printCellValue(Cell cell, StringBuilder toReturn) {
+ CellType cellType = cell.getCellType()
+ .equals(CellType.FORMULA) ? cell.getCachedFormulaResultType() : cell.getCellType();
+ if (cellType.equals(CellType.STRING)) {
+ toReturn.append(cell.getStringCellValue())
+ .append(" | ");
+ }
+ if (cellType.equals(CellType.NUMERIC)) {
+ if (DateUtil.isCellDateFormatted(cell)) {
+ toReturn.append(cell.getDateCellValue())
+ .append(" | ");
+ } else {
+ toReturn.append(cell.getNumericCellValue())
+ .append(" | ");
+ }
+ }
+ if (cellType.equals(CellType.BOOLEAN)) {
+ toReturn.append(cell.getBooleanCellValue())
+ .append(" | ");
+ }
+ }
+=======
+ private static final String ENDLINE = System.getProperty("line.separator");
+
+ public static String readExcel(String filePath) throws IOException {
+ File file = new File(filePath);
+ FileInputStream inputStream = null;
+ StringBuilder toReturn = new StringBuilder();
+ try {
+ inputStream = new FileInputStream(file);
+ Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream);
+ for (Sheet sheet : baeuldungWorkBook) {
+ toReturn.append("--------------------------------------------------------------------").append(ENDLINE);
+ toReturn.append("Worksheet :").append(sheet.getSheetName()).append(ENDLINE);
+ toReturn.append("--------------------------------------------------------------------").append(ENDLINE);
+ int firstRow = sheet.getFirstRowNum();
+ int lastRow = sheet.getLastRowNum();
+ for (int index = firstRow + 1; index <= lastRow; index++) {
+ Row row = sheet.getRow(index);
+ toReturn.append("|| ");
+ for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
+ Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
+ printCellValue(cell, toReturn);
+ }
+ toReturn.append(" ||").append(ENDLINE);
+ }
+ }
+ inputStream.close();
+
+ } catch (IOException e) {
+ throw e;
+ }
+ return toReturn.toString();
+ }
+
+ public static void printCellValue(Cell cell, StringBuilder toReturn) {
+ CellType cellType = cell.getCellType().equals(CellType.FORMULA) ? cell.getCachedFormulaResultType()
+ : cell.getCellType();
+ if (cellType.equals(CellType.STRING)) {
+ toReturn.append(cell.getStringCellValue()).append(" | ");
+ }
+ if (cellType.equals(CellType.NUMERIC)) {
+ if (DateUtil.isCellDateFormatted(cell)) {
+ toReturn.append(cell.getDateCellValue()).append(" | ");
+ } else {
+ toReturn.append(cell.getNumericCellValue()).append(" | ");
+ }
+ }
+ if (cellType.equals(CellType.BOOLEAN)) {
+ toReturn.append(cell.getBooleanCellValue()).append(" | ");
+ }
+ }
+>>>>>>> master
+}
\ No newline at end of file
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellBordersHandler.java b/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellBordersHandler.java
new file mode 100644
index 0000000000..1c96db0b60
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellBordersHandler.java
@@ -0,0 +1,37 @@
+package com.baeldung.poi.excel.cellstyle;
+
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.RegionUtil;
+
+public class CellBordersHandler {
+
+ public void setRegionBorder(CellRangeAddress region, Sheet sheet, BorderStyle borderStyle) {
+ RegionUtil.setBorderTop(borderStyle, region, sheet);
+ RegionUtil.setBorderBottom(borderStyle, region, sheet);
+ RegionUtil.setBorderLeft(borderStyle, region, sheet);
+ RegionUtil.setBorderRight(borderStyle, region, sheet);
+ }
+
+ public void setRegionBorderWithColor(CellRangeAddress region, Sheet sheet, BorderStyle borderStyle, short color) {
+ RegionUtil.setTopBorderColor(color, region, sheet);
+ RegionUtil.setBottomBorderColor(color, region, sheet);
+ RegionUtil.setLeftBorderColor(color, region, sheet);
+ RegionUtil.setRightBorderColor(color, region, sheet);
+ RegionUtil.setBorderTop(borderStyle, region, sheet);
+ RegionUtil.setBorderBottom(borderStyle, region, sheet);
+ RegionUtil.setBorderLeft(borderStyle, region, sheet);
+ RegionUtil.setBorderRight(borderStyle, region, sheet);
+ }
+
+ public void setCrazyBorder(CellRangeAddress region, Sheet sheet) {
+ RegionUtil.setTopBorderColor(IndexedColors.RED.index, region, sheet);
+ RegionUtil.setBottomBorderColor(IndexedColors.GREEN.index, region, sheet);
+ RegionUtil.setLeftBorderColor(IndexedColors.BLUE.index, region, sheet);
+ RegionUtil.setRightBorderColor(IndexedColors.VIOLET.index, region, sheet);
+ RegionUtil.setBorderTop(BorderStyle.DASH_DOT, region, sheet);
+ RegionUtil.setBorderBottom(BorderStyle.DOUBLE, region, sheet);
+ RegionUtil.setBorderLeft(BorderStyle.DOTTED, region, sheet);
+ RegionUtil.setBorderRight(BorderStyle.SLANTED_DASH_DOT, region, sheet);
+ }
+}
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellStyleHandler.java b/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellStyleHandler.java
new file mode 100644
index 0000000000..4d97fe50cb
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/cellstyle/CellStyleHandler.java
@@ -0,0 +1,30 @@
+package com.baeldung.poi.excel.cellstyle;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.IndexedColors;
+
+public class CellStyleHandler {
+
+ public void changeCellBackgroundColor(Cell cell) {
+ CellStyle cellStyle = cell.getCellStyle();
+ if(cellStyle == null) {
+ cellStyle = cell.getSheet().getWorkbook().createCellStyle();
+ }
+ cellStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
+ cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+ cell.setCellStyle(cellStyle);
+ }
+
+ public void changeCellBackgroundColorWithPattern(Cell cell) {
+ CellStyle cellStyle = cell.getCellStyle();
+ if(cellStyle == null) {
+ cellStyle = cell.getSheet().getWorkbook().createCellStyle();
+ }
+ cellStyle.setFillBackgroundColor(IndexedColors.BLACK.index);
+ cellStyle.setFillPattern(FillPatternType.BIG_SPOTS);
+ cellStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
+ cell.setCellStyle(cellStyle);
+ }
+}
diff --git a/apache-poi/src/main/java/com/baeldung/poi/excel/multilinetext/MultilineText.java b/apache-poi/src/main/java/com/baeldung/poi/excel/multilinetext/MultilineText.java
new file mode 100644
index 0000000000..231d7b8968
--- /dev/null
+++ b/apache-poi/src/main/java/com/baeldung/poi/excel/multilinetext/MultilineText.java
@@ -0,0 +1,17 @@
+package com.baeldung.poi.excel.multilinetext;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+
+public class MultilineText {
+ public void formatMultilineText(Cell cell, int cellNumber) {
+ cell.getRow()
+ .setHeightInPoints(cell.getSheet()
+ .getDefaultRowHeightInPoints() * 2);
+ CellStyle cellStyle = cell.getSheet()
+ .getWorkbook()
+ .createCellStyle();
+ cellStyle.setWrapText(true);
+ cell.setCellStyle(cellStyle);
+ }
+}
diff --git a/apache-poi/src/main/resources/cellstyle/CellStyleHandlerTest.xlsx b/apache-poi/src/main/resources/cellstyle/CellStyleHandlerTest.xlsx
new file mode 100644
index 0000000000..29f128211b
Binary files /dev/null and b/apache-poi/src/main/resources/cellstyle/CellStyleHandlerTest.xlsx differ
diff --git a/apache-poi/src/main/resources/com/baeldung/poi/excel/multilinetext/MultilineTextTest.xlsx b/apache-poi/src/main/resources/com/baeldung/poi/excel/multilinetext/MultilineTextTest.xlsx
new file mode 100644
index 0000000000..c6b963d5a5
Binary files /dev/null and b/apache-poi/src/main/resources/com/baeldung/poi/excel/multilinetext/MultilineTextTest.xlsx differ
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java
new file mode 100644
index 0000000000..b4d3fdd732
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.poi.excel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ExcelUtilityUnitTest {
+ private static final String FILE_NAME = "baeldung.xlsx";
+ private String fileLocation;
+ private static final String ENDLINE = System.getProperty("line.separator");
+ private StringBuilder output;
+
+ @Before
+ public void setupUnitTest() throws IOException, URISyntaxException, ParseException {
+ output = new StringBuilder();
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("Worksheet :Sheet1")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("|| Name1 | Surname1 | 3.55696564113E11 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021")
+ .toString())
+ .append(" | ‡ | ||")
+ .append(ENDLINE);
+ output.append("|| Name2 | Surname2 | 5.646513512E9 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/12/2021")
+ .toString())
+ .append(" | false | ||")
+ .append(ENDLINE);
+ output.append("|| Name3 | Surname3 | 3.55696564113E11 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021")
+ .toString())
+ .append(" | 7.17039641738E11 | ||")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("Worksheet :Sheet2")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("|| Name4 | Surname4 | 3.55675623232E11 | 13/04/2021 | ||")
+ .append(ENDLINE);
+
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME)
+ .toURI())
+ .toString();
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenReturnStringValue() throws IOException {
+ assertEquals(output.toString(), ExcelUtility.readExcel(fileLocation));
+
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenThrowException() {
+ assertThrows(IOException.class, () -> {
+ ExcelUtility.readExcel("baeldung");
+ });
+ }
+
+}
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig
new file mode 100644
index 0000000000..cfc3062b5a
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/ExcelUtilityUnitTest.java.orig
@@ -0,0 +1,112 @@
+package com.baeldung.poi.excel;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ExcelUtilityUnitTest {
+<<<<<<< HEAD
+ private static final String FILE_NAME = "baeldung.xlsx";
+ private String fileLocation;
+ private static final String ENDLINE = System.getProperty("line.separator");
+ private StringBuilder output;
+
+ @Before
+ public void setupUnitTest() throws IOException, URISyntaxException, ParseException {
+ output = new StringBuilder();
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("Worksheet :Sheet1")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("|| Name1 | Surname1 | 3.55696564113E11 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021")
+ .toString())
+ .append(" | ‡ | ||")
+ .append(ENDLINE);
+ output.append("|| Name2 | Surname2 | 5.646513512E9 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/12/2021")
+ .toString())
+ .append(" | false | ||")
+ .append(ENDLINE);
+ output.append("|| Name3 | Surname3 | 3.55696564113E11 | ")
+ .append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021")
+ .toString())
+ .append(" | 7.17039641738E11 | ||")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("Worksheet :Sheet2")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------")
+ .append(ENDLINE);
+ output.append("|| Name4 | Surname4 | 3.55675623232E11 | 13/04/2021 | ||")
+ .append(ENDLINE);
+
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME)
+ .toURI())
+ .toString();
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenReturnStringValue() throws IOException {
+ assertEquals(output.toString(), ExcelUtility.readExcel(fileLocation));
+
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenThrowException() {
+ assertThrows(IOException.class, () -> {
+ ExcelUtility.readExcel("baeldung");
+ });
+ }
+=======
+ private static final String FILE_NAME = "baeldung.xlsx";
+ private String fileLocation;
+ private static final String ENDLINE = System.getProperty("line.separator");
+ private StringBuilder output;
+
+ @Before
+ public void setupUnitTest() throws IOException, URISyntaxException, ParseException {
+ output = new StringBuilder();
+ output.append("--------------------------------------------------------------------").append(ENDLINE);
+ output.append("Worksheet :Sheet1").append(ENDLINE);
+ output.append("--------------------------------------------------------------------").append(ENDLINE);
+ output.append("|| Name1 | Surname1 | 3.55696564113E11 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021").toString()).append(" | ‡ | ||")
+ .append(ENDLINE);
+ output.append("|| Name2 | Surname2 | 5.646513512E9 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/12/2021").toString()).append(" | false | ||")
+ .append(ENDLINE);
+ output.append("|| Name3 | Surname3 | 3.55696564113E11 | ").append(new SimpleDateFormat("dd/MM/yyyy").parse("4/11/2021").toString()).append(" | 7.17039641738E11 | ||")
+ .append(ENDLINE);
+ output.append("--------------------------------------------------------------------").append(ENDLINE);
+ output.append("Worksheet :Sheet2").append(ENDLINE);
+ output.append("--------------------------------------------------------------------").append(ENDLINE);
+ output.append("|| Name4 | Surname4 | 3.55675623232E11 | 13/04/2021 | ||").append(ENDLINE);
+
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenReturnStringValue() throws IOException {
+ assertEquals(output.toString(), ExcelUtility.readExcel(fileLocation));
+
+ }
+
+ @Test
+ public void givenStringPath_whenReadExcel_thenThrowException() {
+ assertThrows(IOException.class, () -> {
+ ExcelUtility.readExcel("baeldung");
+ });
+ }
+>>>>>>> master
+
+}
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellBorderHandlerUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellBorderHandlerUnitTest.java
new file mode 100644
index 0000000000..3cabff2dff
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellBorderHandlerUnitTest.java
@@ -0,0 +1,130 @@
+package com.baeldung.poi.excel.cellstyle;
+
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.*;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+
+public class CellBorderHandlerUnitTest {
+ private static final String FILE_NAME = "cellstyle/CellStyleHandlerTest.xlsx";
+ private static final int SHEET_INDEX = 0;
+
+ private static CellBordersHandler cellBordersHandler;
+ private static Workbook workbook;
+
+ @BeforeClass
+ public static void setup() throws URISyntaxException, IOException {
+ String fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ cellBordersHandler = new CellBordersHandler();
+ workbook = new XSSFWorkbook(fileLocation);
+ createRowsAndCells(workbook);
+ }
+
+ private static void createRowsAndCells(Workbook workbook) {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+ for (int rowIndex = 0; rowIndex < 10; rowIndex++) {
+ Row row = sheet.getRow(rowIndex);
+ if (row == null) {
+ row = sheet.createRow(rowIndex);
+ }
+ for (int colIndex = 0; colIndex < 10; colIndex++) {
+ Cell cell = row.getCell(colIndex);
+ if (cell == null) {
+ row.createCell(colIndex);
+ }
+ }
+ }
+ }
+
+ @Test
+ public void givenWorkbookCell_whenSetRegionBorder() {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+
+ CellRangeAddress region = new CellRangeAddress(1, 1, 1, 1);
+ cellBordersHandler.setRegionBorder(region, sheet, BorderStyle.THICK);
+
+ Row row = sheet.getRow(1);
+ Cell cell = row.getCell(1);
+ assertEquals(cell.getCellStyle().getBorderTop(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderBottom(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderLeft(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderRight(), BorderStyle.THICK);
+ }
+
+ @Test
+ public void givenWorkbookCell_whenSetRegionBorderWithColor() {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+
+ CellRangeAddress region = new CellRangeAddress(1, 1, 3, 3);
+ cellBordersHandler.setRegionBorderWithColor(region, sheet, BorderStyle.THICK, IndexedColors.MAROON.index);
+
+ Row row = sheet.getRow(1);
+ Cell cell = row.getCell(1 + 2);
+ assertEquals(cell.getCellStyle().getBorderTop(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderBottom(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderLeft(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getBorderRight(), BorderStyle.THICK);
+ assertEquals(cell.getCellStyle().getTopBorderColor(), IndexedColors.MAROON.index);
+ assertEquals(cell.getCellStyle().getBottomBorderColor(), IndexedColors.MAROON.index);
+ assertEquals(cell.getCellStyle().getLeftBorderColor(), IndexedColors.MAROON.index);
+ assertEquals(cell.getCellStyle().getRightBorderColor(), IndexedColors.MAROON.index);
+ }
+
+ @Test
+ public void givenWorkbookCell_whenSetCrazyBorder() {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+
+ CellRangeAddress region = new CellRangeAddress(1, 1, 5, 5);
+ cellBordersHandler.setCrazyBorder(region, sheet);
+
+ Row row = sheet.getRow(1);
+ Cell cell = row.getCell(5);
+ assertEquals(cell.getCellStyle().getBorderTop(), BorderStyle.DASH_DOT);
+ assertEquals(cell.getCellStyle().getBorderBottom(), BorderStyle.DOUBLE);
+ assertEquals(cell.getCellStyle().getBorderLeft(), BorderStyle.DOTTED);
+ assertEquals(cell.getCellStyle().getBorderRight(), BorderStyle.SLANTED_DASH_DOT);
+ assertEquals(cell.getCellStyle().getTopBorderColor(), IndexedColors.RED.index);
+ assertEquals(cell.getCellStyle().getBottomBorderColor(), IndexedColors.GREEN.index);
+ assertEquals(cell.getCellStyle().getLeftBorderColor(), IndexedColors.BLUE.index);
+ assertEquals(cell.getCellStyle().getRightBorderColor(), IndexedColors.VIOLET.index);
+ }
+
+ @Test
+ public void givenWorkbookRegion_whenSetRegionBorder() {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+
+ CellRangeAddress region = new CellRangeAddress(3, 5, 1, 5);
+ cellBordersHandler.setRegionBorder(region, sheet, BorderStyle.MEDIUM);
+
+ Row row = sheet.getRow(3);
+ Cell cell = row.getCell(1);
+ assertEquals(cell.getCellStyle().getBorderTop(), BorderStyle.MEDIUM);
+ assertEquals(cell.getCellStyle().getBorderLeft(), BorderStyle.MEDIUM);
+ }
+
+ @Test
+ public void givenWorkbookRegion_whenSetRegionBorderWithColor() {
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+
+ CellRangeAddress region = new CellRangeAddress(7, 8, 1, 5);
+ cellBordersHandler.setRegionBorderWithColor(region, sheet, BorderStyle.MEDIUM, IndexedColors.ORANGE.index);
+
+ Row row = sheet.getRow(7);
+ Cell cell = row.getCell(1);
+ assertEquals(cell.getCellStyle().getBorderTop(), BorderStyle.MEDIUM);
+ assertEquals(cell.getCellStyle().getBorderLeft(), BorderStyle.MEDIUM);
+ assertEquals(cell.getCellStyle().getTopBorderColor(), IndexedColors.ORANGE.index);
+ assertEquals(cell.getCellStyle().getLeftBorderColor(), IndexedColors.ORANGE.index);
+ }
+
+ @AfterClass
+ public static void close() throws IOException {
+ workbook.close();
+ }
+}
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellStyleHandlerUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellStyleHandlerUnitTest.java
new file mode 100644
index 0000000000..e131db8e56
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/cellstyle/CellStyleHandlerUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.poi.excel.cellstyle;
+
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import static org.junit.Assert.assertEquals;
+
+public class CellStyleHandlerUnitTest {
+ private static final String FILE_NAME = "cellstyle/CellStyleHandlerTest.xlsx";
+ private static final int SHEET_INDEX = 0;
+ private static final int ROW_INDEX = 0;
+ private static final int CELL_INDEX = 0;
+
+ private String fileLocation;
+ private CellStyleHandler cellStyleHandler;
+
+ @Before
+ public void setup() throws URISyntaxException {
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME).toURI()).toString();
+ cellStyleHandler = new CellStyleHandler();
+ }
+
+ @Test
+ public void givenWorkbookCell_whenChangeCellBackgroundColor() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+ Row row = sheet.getRow(ROW_INDEX);
+ Cell cell = row.getCell(CELL_INDEX);
+
+ cellStyleHandler.changeCellBackgroundColor(cell);
+
+ assertEquals(IndexedColors.LIGHT_BLUE.index, cell.getCellStyle().getFillForegroundColor());
+ workbook.close();
+ }
+
+ @Test
+ public void givenWorkbookCell_whenChangeCellBackgroundColorWithPattern() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(SHEET_INDEX);
+ Row row = sheet.getRow(ROW_INDEX);
+ Cell cell = row.getCell(CELL_INDEX + 1);
+
+ cellStyleHandler.changeCellBackgroundColorWithPattern(cell);
+
+ assertEquals(IndexedColors.LIGHT_BLUE.index, cell.getCellStyle().getFillForegroundColor());
+ workbook.close();
+ }
+}
diff --git a/apache-poi/src/test/java/com/baeldung/poi/excel/multilinetext/MultilineTextUnitTest.java b/apache-poi/src/test/java/com/baeldung/poi/excel/multilinetext/MultilineTextUnitTest.java
new file mode 100644
index 0000000000..ee002be155
--- /dev/null
+++ b/apache-poi/src/test/java/com/baeldung/poi/excel/multilinetext/MultilineTextUnitTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.poi.excel.multilinetext;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Paths;
+
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.DataFormatter;
+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 MultilineTextUnitTest {
+ private static String FILE_NAME = "com/baeldung/poi/excel/multilinetext/MultilineTextTest.xlsx";
+ private static final String NEW_FILE_NAME = "MultilineTextTest_output.xlsx";
+ private static final int STRING_ROW_INDEX = 1;
+ private static final int STRING_CELL_INDEX = 0;
+
+ private String fileLocation;
+
+ @Before
+ public void setup() throws IOException, URISyntaxException {
+ fileLocation = Paths.get(ClassLoader.getSystemResource(FILE_NAME)
+ .toURI())
+ .toString();
+ }
+
+ @Test
+ public void givenMultilineTextCell_whenFormated_thenMultilineTextVisible() throws IOException {
+ Workbook workbook = new XSSFWorkbook(fileLocation);
+ Sheet sheet = workbook.getSheetAt(0);
+ sheet.createRow(STRING_ROW_INDEX);
+ Row row = sheet.getRow(STRING_ROW_INDEX);
+ Cell cell = row.createCell(STRING_CELL_INDEX);
+
+ cell.setCellValue("Hello \n world!");
+ MultilineText multilineText = new MultilineText();
+ multilineText.formatMultilineText(cell, STRING_CELL_INDEX);
+
+ FileOutputStream outputStream = new FileOutputStream(NEW_FILE_NAME);
+ workbook.write(outputStream);
+ outputStream.close();
+
+ File file = new File(NEW_FILE_NAME);
+ FileInputStream fileInputStream = new FileInputStream(file);
+ Workbook testWorkbook = new XSSFWorkbook(fileInputStream);
+ assertTrue(row.getHeightInPoints() == testWorkbook.getSheetAt(0)
+ .getRow(STRING_ROW_INDEX)
+ .getHeightInPoints());
+ DataFormatter formatter = new DataFormatter();
+ assertEquals("Hello \n world!", formatter.formatCellValue(testWorkbook.getSheetAt(0)
+ .getRow(STRING_ROW_INDEX)
+ .getCell(STRING_CELL_INDEX)));
+ testWorkbook.close();
+ fileInputStream.close();
+ file.delete();
+
+ workbook.close();
+ }
+}
diff --git a/apache-poi/src/test/resources/baeldung.xlsx b/apache-poi/src/test/resources/baeldung.xlsx
new file mode 100644
index 0000000000..a6ed6c4e6a
Binary files /dev/null and b/apache-poi/src/test/resources/baeldung.xlsx differ
diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index f956883d5f..325a9939b9 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -39,10 +39,6 @@
runtime
-
- org.springframework.boot
- spring-boot-starter-web
- org.springframework.bootspring-boot-starter-security
diff --git a/guest/remote-debugging/src/main/resources/logback.xml b/apache-shiro/src/main/resources/logback.xml
similarity index 100%
rename from guest/remote-debugging/src/main/resources/logback.xml
rename to apache-shiro/src/main/resources/logback.xml
diff --git a/apache-shiro/src/test/resources/logback-test.xml b/apache-shiro/src/test/resources/logback-test.xml
new file mode 100644
index 0000000000..8d4771e308
--- /dev/null
+++ b/apache-shiro/src/test/resources/logback-test.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ [%d{ISO8601}]-[%thread] %-5level %logger - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/atomikos/pom.xml b/atomikos/pom.xml
index 405231fea7..cd798825d1 100644
--- a/atomikos/pom.xml
+++ b/atomikos/pom.xml
@@ -71,12 +71,6 @@
derby${derby.version}
-
- junit
- junit
- ${junit.version}
- test
- javax.transaction
diff --git a/aws-lambda/lambda/pom.xml b/aws-lambda/lambda/pom.xml
index b6074f16d3..8bfe7a0ade 100644
--- a/aws-lambda/lambda/pom.xml
+++ b/aws-lambda/lambda/pom.xml
@@ -10,9 +10,8 @@
com.baeldung
- parent-modules
+ aws-lambda1.0.0-SNAPSHOT
- ../../
@@ -62,6 +61,14 @@
com.googlecode.json-simplejson-simple${json-simple.version}
+
+
+
+ junit
+ junit
+
+
diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml
index 3264356977..fc655f282d 100644
--- a/aws-lambda/pom.xml
+++ b/aws-lambda/pom.xml
@@ -11,7 +11,6 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../
diff --git a/aws-lambda/shipping-tracker/ShippingFunction/pom.xml b/aws-lambda/shipping-tracker/ShippingFunction/pom.xml
index 99f9c1d051..51e9cb9bd3 100644
--- a/aws-lambda/shipping-tracker/ShippingFunction/pom.xml
+++ b/aws-lambda/shipping-tracker/ShippingFunction/pom.xml
@@ -5,30 +5,24 @@
com.baeldungShippingFunction1.0
- jarShippingFunction
+ jarcom.amazonawsaws-lambda-java-core
- 1.2.0
+ ${aws-lambda-java-core.version}com.amazonawsaws-lambda-java-events
- 3.1.0
+ ${aws-lambda-java-events.version}com.fasterxml.jackson.corejackson-databind
- 2.11.2
-
-
- junit
- junit
- 4.12
- test
+ ${jackson-databind.version}org.hibernate
@@ -43,7 +37,7 @@
org.postgresqlpostgresql
- 42.2.16
+ ${postgresql.version}
@@ -71,6 +65,10 @@
1.81.85.4.21.Final
+ 1.2.0
+ 3.1.0
+ 2.11.2
+ 42.2.16
\ No newline at end of file
diff --git a/aws-lambda/todo-reminder/ToDoFunction/pom.xml b/aws-lambda/todo-reminder/ToDoFunction/pom.xml
index 832cee841d..cb6dd08d1e 100644
--- a/aws-lambda/todo-reminder/ToDoFunction/pom.xml
+++ b/aws-lambda/todo-reminder/ToDoFunction/pom.xml
@@ -5,77 +5,77 @@
helloworldToDoFunction1.0
- jarToDoFunction
+ jarcom.amazonawsaws-lambda-java-core
- 1.2.1
+ ${aws-lambda-java-core.version}com.amazonawsaws-lambda-java-events
- 3.6.0
+ ${aws-lambda-java-events.version}uk.org.webcomperelightweight-config
- 1.1.0
+ ${lightweight-config.version}com.amazonawsaws-lambda-java-log4j2
- 1.2.0
+ ${aws-lambda-java-log4j2.version}org.apache.logging.log4jlog4j-slf4j-impl
- 2.13.2
+ ${log4j-slf4j-impl.version}io.github.openfeignfeign-core
- 11.2
+ ${feign-core.version}io.github.openfeignfeign-slf4j
- 11.2
+ ${feign-core.version}io.github.openfeignfeign-gson
- 11.2
+ ${feign-core.version}com.google.injectguice
- 5.0.1
+ ${guice.version}
- junit
- junit
- 4.13.1
+ org.junit.vintage
+ junit-vintage-engine
+ ${junit-jupiter.version}testuk.org.webcomperesystem-stubs-junit4
- 1.2.0
+ ${system-stubs-junit4.version}testorg.mockitomockito-core
- 3.3.0
+ ${mockito-core.version}testorg.assertjassertj-core
- 3.19.0
+ ${assertj-core.version}test
@@ -103,6 +103,17 @@
1.81.8
+ 1.2.1
+ 3.6.0
+ 1.1.0
+ 1.2.0
+ 2.13.2
+ 11.2
+ 5.0.1
+ 1.2.0
+ 4.1.0
+ 3.19.0
+ 5.8.1
\ No newline at end of file
diff --git a/aws/pom.xml b/aws/pom.xml
index 1663266612..a57dd6690e 100644
--- a/aws/pom.xml
+++ b/aws/pom.xml
@@ -20,18 +20,6 @@
aws-java-sdk${aws-java-sdk.version}
-
- org.mockito
- mockito-core
- ${mockito-core.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- com.amazonawsaws-lambda-java-core
@@ -117,8 +105,6 @@
1.1.02.8.01.11.290
- 2.21.0
- 3.8.01.11.86https://s3-us-west-2.amazonaws.com/dynamodb-local/release1.10.L001
diff --git a/axon/pom.xml b/axon/pom.xml
index 426c340bfc..00e3f0f4c5 100644
--- a/axon/pom.xml
+++ b/axon/pom.xml
@@ -19,7 +19,7 @@
org.axonframeworkaxon-bom
- 4.5.0
+ ${axon.version}pomimport
@@ -56,4 +56,8 @@
+
+ 4.5.0
+
+
\ No newline at end of file
diff --git a/blade/pom.xml b/blade/pom.xml
index 6ab3a594f2..9c8638f0bc 100644
--- a/blade/pom.xml
+++ b/blade/pom.xml
@@ -36,12 +36,6 @@
provided
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- org.apache.httpcomponentshttpclient
@@ -70,6 +64,7 @@
maven-failsafe-plugin${maven-failsafe-plugin.version}
+ true**/*LiveTest.java
@@ -118,7 +113,6 @@
4.5.64.5.64.4.10
- 3.11.13.0.0-M30.73.1.0
diff --git a/cdi/pom.xml b/cdi/pom.xml
index 5eb566dcfb..ee23e082c7 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -25,12 +25,6 @@
weld-se-core${weld-se-core.version}
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- org.aspectjaspectjweaver
@@ -53,7 +47,6 @@
2.0.SP13.0.5.Final1.9.2
- 3.10.0
\ No newline at end of file
diff --git a/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml b/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
index 74603bf0fb..7fcce181a3 100644
--- a/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
+++ b/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
@@ -10,9 +10,8 @@
com.baeldung
- parent-boot-2
+ cloud-foundry-uaa0.0.1-SNAPSHOT
- ../../parent-boot-2
diff --git a/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml b/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml
index 276c8bbaa6..4dffd4d768 100644
--- a/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml
+++ b/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml
@@ -10,9 +10,8 @@
com.baeldung
- parent-boot-2
+ cloud-foundry-uaa0.0.1-SNAPSHOT
- ../../parent-boot-2
diff --git a/cloud-foundry-uaa/pom.xml b/cloud-foundry-uaa/pom.xml
index 03a5b978d4..6ae43b2c08 100644
--- a/cloud-foundry-uaa/pom.xml
+++ b/cloud-foundry-uaa/pom.xml
@@ -4,14 +4,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0cloud-foundry-uaa
- 0.0.1-SNAPSHOTcloud-foundry-uaapomcom.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
diff --git a/core-groovy-2/gmavenplus-pom.xml b/core-groovy-2/gmavenplus-pom.xml
index 54c89b9834..4dbdfe7d42 100644
--- a/core-groovy-2/gmavenplus-pom.xml
+++ b/core-groovy-2/gmavenplus-pom.xml
@@ -33,7 +33,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -95,7 +95,7 @@
org.junit.platformjunit-platform-surefire-provider
- ${junit.platform.version}
+ ${junit-platform-surefire-provider.version}
@@ -165,7 +165,6 @@
UTF-8
- 1.0.02.4.01.1-groovy-2.43.9
diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml
index 89df666333..6b78e21080 100644
--- a/core-groovy-2/pom.xml
+++ b/core-groovy-2/pom.xml
@@ -34,7 +34,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -94,7 +94,7 @@
org.junit.platformjunit-platform-surefire-provider
- ${junit.platform.version}
+ ${junit-platform-surefire-provider.version}
@@ -162,7 +162,6 @@
- 1.0.02.4.01.1-groovy-2.41.1.3
diff --git a/core-groovy-collections/pom.xml b/core-groovy-collections/pom.xml
index c4e02cfed8..d589fc74e5 100644
--- a/core-groovy-collections/pom.xml
+++ b/core-groovy-collections/pom.xml
@@ -39,7 +39,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -80,7 +80,7 @@
org.junit.platformjunit-platform-surefire-provider
- ${junit.platform.version}
+ ${junit-platform-surefire-provider.version}
@@ -119,7 +119,6 @@
- 1.0.02.5.62.5.62.5.6
diff --git a/core-groovy-strings/pom.xml b/core-groovy-strings/pom.xml
index 76d1754b98..333b15cdbe 100644
--- a/core-groovy-strings/pom.xml
+++ b/core-groovy-strings/pom.xml
@@ -39,7 +39,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -80,7 +80,7 @@
org.junit.platformjunit-platform-surefire-provider
- ${junit.platform.version}
+ ${junit-platform-surefire-provider.version}
@@ -109,7 +109,6 @@
- 1.0.02.5.62.5.62.5.6
diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml
index 3e1913dd7b..c24982c6a2 100644
--- a/core-groovy/pom.xml
+++ b/core-groovy/pom.xml
@@ -39,7 +39,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -80,7 +80,7 @@
org.junit.platformjunit-platform-surefire-provider
- ${junit.platform.version}
+ ${junit-platform-surefire-provider.version}
@@ -109,7 +109,6 @@
- 1.0.02.5.62.5.62.5.6
diff --git a/core-java-modules/core-java-10/pom.xml b/core-java-modules/core-java-10/pom.xml
index b293110546..e2ac8db919 100644
--- a/core-java-modules/core-java-10/pom.xml
+++ b/core-java-modules/core-java-10/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -40,7 +39,6 @@
1010
- 4.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-11-2/README.md b/core-java-modules/core-java-11-2/README.md
index 93920864cc..2b0eda8d91 100644
--- a/core-java-modules/core-java-11-2/README.md
+++ b/core-java-modules/core-java-11-2/README.md
@@ -9,3 +9,5 @@ This module contains articles about Java 11 core features
- [New Features in Java 11](https://www.baeldung.com/java-11-new-features)
- [Getting the Java Version at Runtime](https://www.baeldung.com/get-java-version-runtime)
- [Invoking a SOAP Web Service in Java](https://www.baeldung.com/java-soap-web-service)
+- [Java HTTPS Client Certificate Authentication](https://www.baeldung.com/java-https-client-certificate-authentication)
+- [Call Methods at Runtime Using Java Reflection](https://www.baeldung.com/java-method-reflection)
diff --git a/core-java-modules/core-java-11-2/pom.xml b/core-java-modules/core-java-11-2/pom.xml
index e26e31da44..64a486b5c4 100644
--- a/core-java-modules/core-java-11-2/pom.xml
+++ b/core-java-modules/core-java-11-2/pom.xml
@@ -12,7 +12,7 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../..
+ ../../pom.xml
@@ -21,35 +21,11 @@
guava${guava.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.mock-servermockserver-junit-jupiter${mockserver.version}
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit.jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-params
- ${junit.jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit.jupiter.version}
- test
- org.apache.commonscommons-lang3
@@ -60,18 +36,6 @@
jakarta.xml.ws-api${jakarta.ws-api.version}
-
- com.sun.xml.ws
- jaxws-rt
- ${jaxws-rt.version}
- runtime
-
-
- com.sun.xml.ws
- jaxws-ri
- ${jaxws-ri.version}
- pom
-
@@ -105,15 +69,9 @@
1111
- 29.0-jre
- 5.7.0
- 3.17.25.11.1
- 3.12.0
- 3.0.0
- 3.0.0
- 2.3.1
- 2.3.2
+ 3.0.1
+ 3.0.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLScocketClient.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLScocketClient.java
new file mode 100644
index 0000000000..286ecfc9df
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLScocketClient.java
@@ -0,0 +1,41 @@
+package com.baeldung.httpsclientauthentication;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.net.SocketFactory;
+import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
+
+public class SSLScocketClient {
+
+ static void startClient(String host, int port) throws IOException {
+
+ SocketFactory factory = SSLSocketFactory.getDefault();
+
+ try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) {
+ socket.setEnabledCipherSuites(new String[] { "TLS_AES_128_GCM_SHA256" });
+ socket.setEnabledProtocols(new String[] { "TLSv1.3" });
+ InputStream is = new BufferedInputStream(socket.getInputStream());
+ String message = "Hello World Message";
+ System.out.println("sending message: " + message);
+ OutputStream os = new BufferedOutputStream(socket.getOutputStream());
+ os.write(message.getBytes());
+ os.flush();
+ byte[] data = new byte[2048];
+ int len = is.read(data);
+ if (len <= 0) {
+ throw new IOException("no data received");
+ }
+ System.out.printf("client received %d bytes: %s%n", len, new String(data, 0, len));
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+
+ startClient("localhost", 8443);
+ }
+}
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLSocketEchoServer.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLSocketEchoServer.java
new file mode 100644
index 0000000000..66efa18fe9
--- /dev/null
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/httpsclientauthentication/SSLSocketEchoServer.java
@@ -0,0 +1,46 @@
+package com.baeldung.httpsclientauthentication;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+
+import javax.net.ServerSocketFactory;
+import javax.net.ssl.SSLServerSocket;
+import javax.net.ssl.SSLServerSocketFactory;
+
+public class SSLSocketEchoServer {
+
+ static void startServer(int port) throws IOException {
+
+ ServerSocketFactory factory = SSLServerSocketFactory.getDefault();
+
+ try (SSLServerSocket listener = (SSLServerSocket) factory.createServerSocket(port)) {
+ listener.setNeedClientAuth(true);
+ listener.setEnabledCipherSuites(new String[] { "TLS_AES_128_GCM_SHA256" });
+ listener.setEnabledProtocols(new String[] { "TLSv1.3" });
+ System.out.println("listening for messages...");
+ try (Socket socket = listener.accept()) {
+ InputStream is = new BufferedInputStream(socket.getInputStream());
+ OutputStream os = new BufferedOutputStream(socket.getOutputStream());
+ byte[] data = new byte[2048];
+ int len = is.read(data);
+ if (len <= 0) {
+ throw new IOException("no data received");
+ }
+ String message = new String(data, 0, len);
+ System.out.printf("server received %d bytes: %s%n", len, message);
+ String response = message + " processed by server";
+ os.write(response.getBytes(), 0, response.getBytes().length);
+ os.flush();
+ }
+ System.out.println("message processed, exiting");
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ startServer(8443);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Country.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Country.java
index 950d588661..d39f333b41 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Country.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Country.java
@@ -1,10 +1,10 @@
package com.baeldung.soap.ws.client.generated;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlSchemaType;
-import javax.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlSchemaType;
+import jakarta.xml.bind.annotation.XmlType;
/**
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java
index 807d152cf1..f10dcade1b 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryService.java
@@ -1,19 +1,19 @@
package com.baeldung.soap.ws.client.generated;
-import javax.jws.WebMethod;
-import javax.jws.WebParam;
-import javax.jws.WebResult;
-import javax.jws.WebService;
-import javax.jws.soap.SOAPBinding;
-import javax.xml.bind.annotation.XmlSeeAlso;
-import javax.xml.ws.Action;
+import jakarta.jws.WebMethod;
+import jakarta.jws.WebParam;
+import jakarta.jws.WebResult;
+import jakarta.jws.WebService;
+import jakarta.jws.soap.SOAPBinding;
+import jakarta.xml.bind.annotation.XmlSeeAlso;
+import jakarta.xml.ws.Action;
/**
* This class was generated by the JAX-WS RI.
- * JAX-WS RI 2.3.2
- * Generated source version: 2.2
+ * JAX-WS RI 3.0.2
+ * Generated source version: 3.0
*
*/
@WebService(name = "CountryService", targetNamespace = "http://server.ws.soap.baeldung.com/")
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java
index 97d6c82145..ae7ff38f7d 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/CountryServiceImplService.java
@@ -4,17 +4,17 @@ package com.baeldung.soap.ws.client.generated;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
-import javax.xml.ws.Service;
-import javax.xml.ws.WebEndpoint;
-import javax.xml.ws.WebServiceClient;
-import javax.xml.ws.WebServiceException;
-import javax.xml.ws.WebServiceFeature;
+import jakarta.xml.ws.Service;
+import jakarta.xml.ws.WebEndpoint;
+import jakarta.xml.ws.WebServiceClient;
+import jakarta.xml.ws.WebServiceException;
+import jakarta.xml.ws.WebServiceFeature;
/**
* This class was generated by the JAX-WS RI.
- * JAX-WS RI 2.3.2
- * Generated source version: 2.2
+ * JAX-WS RI 3.0.2
+ * Generated source version: 3.0
*
*/
@WebServiceClient(name = "CountryServiceImplService", targetNamespace = "http://server.ws.soap.baeldung.com/", wsdlLocation = "http://localhost:8888/ws/country?wsdl")
@@ -75,7 +75,7 @@ public class CountryServiceImplService
/**
*
* @param features
- * A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values.
+ * A list of {@link jakarta.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the features parameter will have their default values.
* @return
* returns CountryService
*/
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java
index c010f5533c..ad42c65461 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/Currency.java
@@ -1,15 +1,14 @@
package com.baeldung.soap.ws.client.generated;
-import javax.xml.bind.annotation.XmlEnum;
-import javax.xml.bind.annotation.XmlType;
+import jakarta.xml.bind.annotation.XmlEnum;
+import jakarta.xml.bind.annotation.XmlType;
/**
*
Java class for currency.
*
*
The following schema fragment specifies the expected content contained within this class.
- *
*
* <simpleType name="currency">
* <restriction base="{http://www.w3.org/2001/XMLSchema}string">
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java
index 9ed85fe2b9..0489e49c2b 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/ObjectFactory.java
@@ -1,7 +1,7 @@
package com.baeldung.soap.ws.client.generated;
-import javax.xml.bind.annotation.XmlRegistry;
+import jakarta.xml.bind.annotation.XmlRegistry;
/**
diff --git a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java
index dfc556859f..6dcc08c268 100644
--- a/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java
+++ b/core-java-modules/core-java-11-2/src/main/java/com/baeldung/soap/ws/client/generated/package-info.java
@@ -1,2 +1,2 @@
-@javax.xml.bind.annotation.XmlSchema(namespace = "http://server.ws.soap.baeldung.com/")
+@jakarta.xml.bind.annotation.XmlSchema(namespace = "http://server.ws.soap.baeldung.com/")
package com.baeldung.soap.ws.client.generated;
diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/reflection/OperationsUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/reflection/OperationsUnitTest.java
index 7584d5da94..92f5b83f2b 100644
--- a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/reflection/OperationsUnitTest.java
+++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/reflection/OperationsUnitTest.java
@@ -2,6 +2,7 @@ package com.baeldung.reflection;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertThat;
import java.lang.reflect.InvocationTargetException;
@@ -34,6 +35,25 @@ public class OperationsUnitTest {
assertFalse(result);
}
+
+ @Test
+ public void givenObject_whenInvokePrivateMethod_thenCheckAccess() throws Exception {
+ Operations operationsInstance = new Operations();
+ Method andPrivatedMethod = Operations.class.getDeclaredMethod("privateAnd", boolean.class, boolean.class);
+ boolean isAccessEnabled = andPrivatedMethod.canAccess(operationsInstance);
+
+ assertFalse(isAccessEnabled);
+ }
+
+ @Test
+ public void givenObject_whenInvokePublicMethod_thenEnableAccess() throws Exception {
+ Operations operationsInstance = new Operations();
+ Method andPrivatedMethod = Operations.class.getDeclaredMethod("privateAnd", boolean.class, boolean.class);
+ andPrivatedMethod.trySetAccessible();
+ boolean isAccessEnabled = andPrivatedMethod.canAccess(operationsInstance);
+
+ assertTrue(isAccessEnabled);
+ }
@Test
public void givenObject_whenInvokePublicMethod_thenCorrect() throws Exception {
diff --git a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionManualTest.java
similarity index 92%
rename from core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java
rename to core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionManualTest.java
index 128c7f60f4..74035a3e2f 100644
--- a/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionUnitTest.java
+++ b/core-java-modules/core-java-11-2/src/test/java/com/baeldung/version/VersionManualTest.java
@@ -5,7 +5,8 @@ import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
-public class VersionUnitTest {
+// manual test as the runtime JDK version can be different depending on where the test is run
+public class VersionManualTest {
@Test
public void givenJava_whenUsingRuntime_thenGetVersion() {
diff --git a/core-java-modules/core-java-11/pom.xml b/core-java-modules/core-java-11/pom.xml
index def7ab43f7..28a218c400 100644
--- a/core-java-modules/core-java-11/pom.xml
+++ b/core-java-modules/core-java-11/pom.xml
@@ -13,7 +13,7 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../..
+ ../../pom.xml
@@ -22,12 +22,6 @@
guava${guava.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.openjdk.jmhjmh-core
@@ -103,8 +97,6 @@
1111
- 27.1-jre
- 3.11.1benchmarks10.0.03.2.4
diff --git a/core-java-modules/core-java-12/pom.xml b/core-java-modules/core-java-12/pom.xml
index 931fce820b..9f95b1bc3f 100644
--- a/core-java-modules/core-java-12/pom.xml
+++ b/core-java-modules/core-java-12/pom.xml
@@ -13,20 +13,13 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../../
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- commons-iocommons-io
- 2.11.0
+ ${commons-io.version}
@@ -54,7 +47,6 @@
1212
- 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml
index 6369976580..9e42838971 100644
--- a/core-java-modules/core-java-13/pom.xml
+++ b/core-java-modules/core-java-13/pom.xml
@@ -14,18 +14,8 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../../
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
@@ -53,7 +43,6 @@
1313
- 3.6.13.0.0-M3
diff --git a/core-java-modules/core-java-14/pom.xml b/core-java-modules/core-java-14/pom.xml
index a03332d8bc..35ea0bd2d0 100644
--- a/core-java-modules/core-java-14/pom.xml
+++ b/core-java-modules/core-java-14/pom.xml
@@ -12,30 +12,8 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../../
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
-
-
-
@@ -62,7 +40,6 @@
14
- 3.6.13.8.13.0.0-M3
diff --git a/core-java-modules/core-java-15/pom.xml b/core-java-modules/core-java-15/pom.xml
index 091f0568a7..a4923054ac 100644
--- a/core-java-modules/core-java-15/pom.xml
+++ b/core-java-modules/core-java-15/pom.xml
@@ -22,22 +22,9 @@
${commons-lang3.version}
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
+ commons-io
+ commons-io
+ ${commons-io.version}
@@ -67,7 +54,6 @@
15
- 3.17.23.8.13.0.0-M3
diff --git a/core-java-modules/core-java-15/src/main/java/com/baeldung/hidden/classes/HiddenClass.java b/core-java-modules/core-java-15/src/main/java/com/baeldung/hidden/classes/HiddenClass.java
new file mode 100644
index 0000000000..d90e512b39
--- /dev/null
+++ b/core-java-modules/core-java-15/src/main/java/com/baeldung/hidden/classes/HiddenClass.java
@@ -0,0 +1,7 @@
+package com.baeldung.hidden.classes;
+
+public class HiddenClass {
+ public String convertToUpperCase(String s) {
+ return s.toUpperCase();
+ }
+}
diff --git a/core-java-modules/core-java-15/src/test/java/com/baeldung/hidden/classes/HiddenClassUnitTest.java b/core-java-modules/core-java-15/src/test/java/com/baeldung/hidden/classes/HiddenClassUnitTest.java
new file mode 100644
index 0000000000..ac6670b208
--- /dev/null
+++ b/core-java-modules/core-java-15/src/test/java/com/baeldung/hidden/classes/HiddenClassUnitTest.java
@@ -0,0 +1,60 @@
+package com.baeldung.hidden.classes;
+
+
+import java.io.InputStream;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup.ClassOption;
+import java.lang.reflect.Method;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class HiddenClassUnitTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(HiddenClassUnitTest.class);
+
+ @Test
+ void whenInvokeMethodOnHiddenClass_thenSuccess() {
+ // Initiate lookup class
+ MethodHandles.Lookup lookup = MethodHandles.lookup();
+
+ // Create a byte code of a class
+
+ Class> clazz = HiddenClass.class;
+ String className = clazz.getName();
+ String classAsPath = className.replace('.', '/') + ".class";
+ InputStream stream = clazz.getClassLoader()
+ .getResourceAsStream(classAsPath);
+
+ try {
+ // Define hidden class with byte code
+ Class> hiddenClass = lookup.defineHiddenClass(IOUtils.toByteArray(stream), true, ClassOption.NESTMATE)
+ .lookupClass();
+ Object hiddenClassObject = hiddenClass.getConstructor()
+ .newInstance();
+
+ Method method = hiddenClassObject.getClass()
+ .getDeclaredMethod("convertToUpperCase", String.class);
+
+ Assertions.assertEquals(true, hiddenClass.isHidden());
+
+ Assertions.assertEquals("HELLO", method.invoke(hiddenClassObject, "Hello"));
+
+ Assertions.assertEquals(this.getClass()
+ .getClassLoader(), hiddenClass.getClassLoader());
+
+ Assertions.assertEquals(null, hiddenClass.getCanonicalName());
+
+ Assertions.assertThrows(ClassNotFoundException.class, () -> Class.forName(hiddenClass.getName()));
+
+ Assertions.assertThrows(ClassNotFoundException.class, () -> lookup.findClass(hiddenClass.getName()));
+
+ } catch (Exception e) {
+ LOG.error("Couldn't instantiate hidden class" + e);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-16/pom.xml b/core-java-modules/core-java-16/pom.xml
index 5d10325f03..4adc3ee6d1 100644
--- a/core-java-modules/core-java-16/pom.xml
+++ b/core-java-modules/core-java-16/pom.xml
@@ -17,29 +17,11 @@
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.apache.commonscommons-lang3
- 3.12.0
+ ${commons-lang3.version}
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit-jupiter.version}
- test
-
@@ -50,37 +32,35 @@
${maven-compiler-plugin.version}${maven.compiler.release}
- --enable-preview
+ --enable-preview${maven.compiler.source.version}${maven.compiler.target.version}
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${surefire.plugin.version}
-
- --enable-preview
- 1
-
-
-
- org.apache.maven.surefire
- surefire-api
- ${surefire.plugin.version}
-
-
-
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.plugin.version}
+
+ --enable-preview
+ 1
+
+
+
+ org.apache.maven.surefire
+ surefire-api
+ ${surefire.plugin.version}
+
+
+ 1616
- 16
- 3.8.1
- 3.0.0-M5
- 3.17.2
+ 16
+ 3.0.0-M5
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/README.md b/core-java-modules/core-java-17/README.md
new file mode 100644
index 0000000000..4d1d7a5c49
--- /dev/null
+++ b/core-java-modules/core-java-17/README.md
@@ -0,0 +1,6 @@
+### Relevant articles:
+
+- [Pattern Matching for Switch](https://www.baeldung.com/java-switch-pattern-matching)
+- [Introduction to HexFormat in Java 17](https://www.baeldung.com/java-hexformat)
+- [New Features in Java 17](https://www.baeldung.com/java-17-new-features)
+- [Random Number Generators in Java 17](https://www.baeldung.com/java-17-random-number-generators)
diff --git a/core-java-modules/core-java-17/pom.xml b/core-java-modules/core-java-17/pom.xml
new file mode 100644
index 0000000000..bc949d9050
--- /dev/null
+++ b/core-java-modules/core-java-17/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+ core-java-17
+ 0.1.0-SNAPSHOT
+ core-java-17
+ jar
+ http://maven.apache.org
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.release}
+ --enable-preview
+ ${maven.compiler.source.version}
+ ${maven.compiler.target.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${surefire.plugin.version}
+
+ --enable-preview
+ --enable-native-access=core.java
+ 1
+
+
+
+ org.apache.maven.surefire
+ surefire-api
+ ${surefire.plugin.version}
+
+
+
+
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+ test
+
+
+
+
+ 17
+ 17
+ 17
+ 3.0.0-M5
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP356.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP356.java
new file mode 100644
index 0000000000..0890b025be
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP356.java
@@ -0,0 +1,20 @@
+package com.baeldung.features;
+
+import java.util.random.RandomGeneratorFactory;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class JEP356 {
+
+ public Stream getAllAlgorithms() {
+ return RandomGeneratorFactory.all().map(RandomGeneratorFactory::name);
+ }
+
+ public IntStream getPseudoInts(String algorithm, int streamSize) {
+ // returns an IntStream with size @streamSize of random numbers generated using the @algorithm
+ // where the lower bound is 0 and the upper is 100 (exclusive)
+ return RandomGeneratorFactory.of(algorithm)
+ .create()
+ .ints(streamSize, 0,100);
+ }
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP406.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP406.java
new file mode 100644
index 0000000000..2bc3a664d1
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP406.java
@@ -0,0 +1,28 @@
+package com.baeldung.features;
+
+import com.baeldung.features.JEP409.Circle;
+import com.baeldung.features.JEP409.Shape;
+import com.baeldung.features.JEP409.Triangle;
+
+public class JEP406 {
+
+ static record Human (String name, int age, String profession) {}
+
+ public String checkObject(Object obj) {
+ return switch (obj) {
+ case Human h -> "Name: %s, age: %s and profession: %s".formatted(h.name(), h.age(), h.profession());
+ case Circle c -> "This is a circle";
+ case Shape s -> "It is just a shape";
+ case null -> "It is null";
+ default -> "It is an object";
+ };
+ }
+
+ public String checkShape(Shape shape) {
+ return switch (shape) {
+ case Triangle t && (t.getNumberOfSides() != 3) -> "This is a weird triangle";
+ case Circle c && (c.getNumberOfSides() != 0) -> "This is a weird circle";
+ default -> "Just a normal shape";
+ };
+ }
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP409.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP409.java
new file mode 100644
index 0000000000..0fc3d6f467
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP409.java
@@ -0,0 +1,38 @@
+package com.baeldung.features;
+
+public class JEP409 {
+
+ sealed interface Shape permits Rectangle, Circle, Square, Triangle {
+ int getNumberOfSides();
+ }
+
+ static final class Rectangle implements Shape {
+ @Override
+ public int getNumberOfSides() {
+ return 4;
+ }
+ }
+
+ static final class Circle implements Shape {
+ @Override
+ public int getNumberOfSides() {
+ return 0;
+ }
+ }
+
+ static final class Square implements Shape {
+ @Override
+ public int getNumberOfSides() {
+ return 4;
+ }
+ }
+
+ static non-sealed class Triangle implements Shape {
+
+ @Override
+ public int getNumberOfSides() {
+ return 3;
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP412.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP412.java
new file mode 100644
index 0000000000..8c998629c9
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP412.java
@@ -0,0 +1,56 @@
+package com.baeldung.features;
+
+import jdk.incubator.foreign.CLinker;
+import jdk.incubator.foreign.FunctionDescriptor;
+import jdk.incubator.foreign.MemoryAddress;
+import jdk.incubator.foreign.SymbolLookup;
+
+import java.io.IOException;
+import java.lang.invoke.MethodType;
+
+import static jdk.incubator.foreign.ResourceScope.newImplicitScope;
+
+public class JEP412 {
+
+ private static final SymbolLookup libLookup;
+
+ static {
+ var resource = JEP412.class.getResource("/compile_c.sh");
+ try {
+ var process = new ProcessBuilder("sh", resource.getPath()).start();
+ while (process.isAlive()) {}
+ } catch (IOException ex) {
+ throw new RuntimeException(ex);
+ }
+
+ var path = JEP412.class.getResource("/print_name.so").getPath();
+ System.load(path);
+ libLookup = SymbolLookup.loaderLookup();
+ }
+
+ public String getPrintNameFormat(String name){
+
+ var printMethod = libLookup.lookup("printName");
+
+ if (printMethod.isPresent()) {
+ var methodReference = CLinker.getInstance()
+ .downcallHandle(
+ printMethod.get(),
+ MethodType.methodType(MemoryAddress.class, MemoryAddress.class),
+ FunctionDescriptor.of(CLinker.C_POINTER, CLinker.C_POINTER)
+ );
+
+ try {
+ var nativeString = CLinker.toCString(name, newImplicitScope());
+ var invokeReturn = methodReference.invoke(nativeString.address());
+ var memoryAddress = (MemoryAddress) invokeReturn;
+ return CLinker.toJavaString(memoryAddress);
+ } catch (Throwable throwable) {
+ throw new RuntimeException(throwable);
+ }
+ }
+ throw new RuntimeException("printName function not found.");
+ }
+}
+
+
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP414.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP414.java
new file mode 100644
index 0000000000..aaccc4a665
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/features/JEP414.java
@@ -0,0 +1,27 @@
+package com.baeldung.features;
+
+import jdk.incubator.vector.FloatVector;
+import jdk.incubator.vector.VectorSpecies;
+
+public class JEP414 {
+
+ private static final VectorSpecies SPECIES = FloatVector.SPECIES_PREFERRED;
+
+
+ public void newVectorComputation(float[] a, float[] b, float[] c) {
+ for (var i = 0; i < a.length; i += SPECIES.length()) {
+ var m = SPECIES.indexInRange(i, a.length);
+ var va = FloatVector.fromArray(SPECIES, a, i, m);
+ var vb = FloatVector.fromArray(SPECIES, b, i, m);
+ var vc = va.mul(vb);
+ vc.intoArray(c, i, m);
+ }
+ }
+
+ public void commonVectorComputation(float[] a, float[] b, float[] c) {
+ for (var i = 0; i < a.length; i ++) {
+ c[i] = a[i] * b[i];
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantExample.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantExample.java
new file mode 100644
index 0000000000..0b7fd569f0
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantExample.java
@@ -0,0 +1,21 @@
+package com.baeldung.instantsource;
+
+import java.time.Instant;
+import java.time.InstantSource;
+
+public class InstantExample {
+ InstantWrapper instantWrapper;
+ InstantSource instantSource;
+
+ public InstantExample(InstantWrapper instantWrapper, InstantSource instantSource) {
+ this.instantWrapper = instantWrapper;
+ this.instantSource = instantSource;
+ }
+
+ public Instant getCurrentInstantFromWrapper() {
+ return instantWrapper.instant();
+ }
+ public Instant getCurrentInstantFromInstantSource() {
+ return instantSource.instant();
+ }
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantWrapper.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantWrapper.java
new file mode 100644
index 0000000000..d88a8b5a8a
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/instantsource/InstantWrapper.java
@@ -0,0 +1,39 @@
+package com.baeldung.instantsource;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+public class InstantWrapper {
+ Clock clock;
+
+ private InstantWrapper() {
+ this.clock = Clock.systemDefaultZone();
+ }
+
+ private InstantWrapper(ZonedDateTime zonedDateTime) {
+ this.clock = Clock.fixed(zonedDateTime.toInstant(), zonedDateTime.getZone());
+ }
+
+ private InstantWrapper(LocalDateTime localDateTime) {
+ this.clock = Clock.fixed(localDateTime.toInstant(ZoneOffset.UTC), ZoneOffset.UTC);
+ }
+
+ public static InstantWrapper of() {
+ return new InstantWrapper();
+ }
+
+ public static InstantWrapper of(ZonedDateTime zonedDateTime) {
+ return new InstantWrapper(zonedDateTime);
+ }
+
+ public static InstantWrapper of(LocalDateTime localDateTime) {
+ return new InstantWrapper(localDateTime);
+ }
+
+ public Instant instant() {
+ return clock.instant();
+ }
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/BenchmarkRunner.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/BenchmarkRunner.java
new file mode 100644
index 0000000000..9a40a2de4e
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/BenchmarkRunner.java
@@ -0,0 +1,115 @@
+package com.baeldung.randomgenerators;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.concurrent.TimeUnit;
+import java.util.random.RandomGenerator;
+
+public class BenchmarkRunner {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL128X1024MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L128X1024MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL128X128MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L128X128MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL128X256MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L128X256MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL32X64MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L32X64MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL64X1024MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L64X1024MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL64X128MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L64X128MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL64X128StarStarRandom() {
+ generateRandomNumbers(RandomGenerator.of("L64X128StarStarRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testL64X256MixRandom() {
+ generateRandomNumbers(RandomGenerator.of("L64X256MixRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testRandom() {
+ generateRandomNumbers(RandomGenerator.of("Random"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testSecureRandom() {
+ generateRandomNumbers(RandomGenerator.of("SecureRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testSplittableRandom() {
+ generateRandomNumbers(RandomGenerator.of("SplittableRandom"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testXoroshiro128PlusPlus() {
+ generateRandomNumbers(RandomGenerator.of("Xoroshiro128PlusPlus"));
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void testXoshiro256PlusPlus() {
+ generateRandomNumbers(RandomGenerator.of("Xoshiro256PlusPlus"));
+ }
+
+ private static void generateRandomNumbers(RandomGenerator generator) {
+ generator.nextLong();
+ generator.nextInt();
+ generator.nextFloat();
+ generator.nextDouble();
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/GeneratorFactory.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/GeneratorFactory.java
new file mode 100644
index 0000000000..64bc81a035
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/GeneratorFactory.java
@@ -0,0 +1,36 @@
+package com.baeldung.randomgenerators;
+
+import java.util.Comparator;
+import java.util.random.RandomGenerator;
+import java.util.random.RandomGeneratorFactory;
+
+public class GeneratorFactory {
+
+ public static void main(String[] args) {
+ System.out.println("Group\tName\tJumpable?\tSplittable?");
+ RandomGeneratorFactory.all()
+ .sorted(Comparator.comparing(RandomGeneratorFactory::name))
+ .forEach(factory -> System.out.println(String.format("%s\t%s\t%s\t%s",
+ factory.group(),
+ factory.name(),
+ factory.isJumpable(),
+ factory.isSplittable())));
+ }
+
+ public static int getRandomInt(RandomGenerator generator, int bound) {
+ return generator.nextInt(bound);
+ }
+
+ public static RandomGenerator getDefaultGenerator() {
+ return RandomGeneratorFactory.getDefault().create();
+ }
+
+ public static RandomGenerator getJumpableGenerator() {
+ return RandomGeneratorFactory.all()
+ .filter(RandomGeneratorFactory::isJumpable)
+ .findAny()
+ .map(RandomGeneratorFactory::create)
+ .orElseThrow(() -> new RuntimeException("Error creating a generator"));
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/OldRandom.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/OldRandom.java
new file mode 100644
index 0000000000..c84d5bc8d3
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/OldRandom.java
@@ -0,0 +1,12 @@
+package com.baeldung.randomgenerators;
+
+import java.util.Random;
+
+public class OldRandom {
+
+ public static int getRandomInt(int bound) {
+ Random random = new Random();
+ return random.nextInt(bound);
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThread.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThread.java
new file mode 100644
index 0000000000..298d840da9
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThread.java
@@ -0,0 +1,30 @@
+package com.baeldung.randomgenerators;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.random.RandomGenerator;
+import java.util.random.RandomGeneratorFactory;
+
+public class SplittableGeneratorMultiThread {
+
+ public static List generateNumbersInMultipleThreads() {
+ List numbers = Collections.synchronizedList(new ArrayList<>());
+ ExecutorService executorService = Executors.newCachedThreadPool();
+
+ RandomGenerator.SplittableGenerator sourceGenerator = RandomGeneratorFactory
+ .of("L128X256MixRandom")
+ .create();
+
+ sourceGenerator.splits(20).forEach((splitGenerator) -> {
+ executorService.submit(() -> {
+ numbers.add(splitGenerator.nextInt(10));
+ });
+ });
+
+ return numbers;
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java
new file mode 100644
index 0000000000..a76287f64a
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/GuardedPatterns.java
@@ -0,0 +1,25 @@
+package com.baeldung.switchpatterns;
+
+public class GuardedPatterns {
+
+ static double getDoubleValueUsingIf(Object o) {
+ return switch (o) {
+ case String s -> {
+ if (s.length() > 0) {
+ yield Double.parseDouble(s);
+ } else {
+ yield 0d;
+ }
+ }
+ default -> 0d;
+ };
+ }
+
+ static double getDoubleValueUsingGuardedPatterns(Object o) {
+ return switch (o) {
+ case String s && s.length() > 0 -> Double.parseDouble(s);
+ default -> 0d;
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java
new file mode 100644
index 0000000000..8e64480a41
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/HandlingNullValues.java
@@ -0,0 +1,20 @@
+package com.baeldung.switchpatterns;
+
+public class HandlingNullValues {
+
+ static double getDoubleUsingSwitchNullCase(Object o) {
+ return switch (o) {
+ case String s -> Double.parseDouble(s);
+ case null -> 0d;
+ default -> 0d;
+ };
+ }
+
+ static double getDoubleUsingSwitchTotalType(Object o) {
+ return switch (o) {
+ case String s -> Double.parseDouble(s);
+ case Object ob -> 0d;
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java
new file mode 100644
index 0000000000..49dd5edb31
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/ParenthesizedPatterns.java
@@ -0,0 +1,29 @@
+package com.baeldung.switchpatterns;
+
+public class ParenthesizedPatterns {
+
+ static double getDoubleValueUsingIf(Object o) {
+ return switch (o) {
+ case String s -> {
+ if (s.length() > 0) {
+ if (s.contains("#") || s.contains("@")) {
+ yield 0d;
+ } else {
+ yield Double.parseDouble(s);
+ }
+ } else {
+ yield 0d;
+ }
+ }
+ default -> 0d;
+ };
+ }
+
+ static double getDoubleValueUsingParenthesizedPatterns(Object o) {
+ return switch (o) {
+ case String s && s.length() > 0 && !(s.contains("#") || s.contains("@")) -> Double.parseDouble(s);
+ default -> 0d;
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/PatternMatching.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/PatternMatching.java
new file mode 100644
index 0000000000..f026caa3f1
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/PatternMatching.java
@@ -0,0 +1,14 @@
+package com.baeldung.switchpatterns;
+
+public class PatternMatching {
+
+ public static void main(String[] args) {
+ Object o = args[0];
+ if (o instanceof String s) {
+ System.out.printf("Object is a string %s", s);
+ } else if(o instanceof Number n) {
+ System.out.printf("Object is a number %n", n);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java
new file mode 100644
index 0000000000..17d2b1856d
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/SwitchStatement.java
@@ -0,0 +1,14 @@
+package com.baeldung.switchpatterns;
+
+public class SwitchStatement {
+
+ public static void main(String[] args) {
+ final String b = "B";
+ switch (args[0]) {
+ case "A" -> System.out.println("Parameter is A");
+ case b -> System.out.println("Parameter is b");
+ default -> System.out.println("Parameter is unknown");
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/TypePatterns.java b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/TypePatterns.java
new file mode 100644
index 0000000000..47af090ad0
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/com/baeldung/switchpatterns/TypePatterns.java
@@ -0,0 +1,30 @@
+package com.baeldung.switchpatterns;
+
+public class TypePatterns {
+
+ static double getDoubleUsingIf(Object o) {
+ double result;
+
+ if (o instanceof Integer) {
+ result = ((Integer) o).doubleValue();
+ } else if (o instanceof Float) {
+ result = ((Float) o).doubleValue();
+ } else if (o instanceof String) {
+ result = Double.parseDouble(((String) o));
+ } else {
+ result = 0d;
+ }
+
+ return result;
+ }
+
+ static double getDoubleUsingSwitch(Object o) {
+ return switch (o) {
+ case Integer i -> i.doubleValue();
+ case Float f -> f.doubleValue();
+ case String s -> Double.parseDouble(s);
+ default -> 0d;
+ };
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/main/java/module-info.java b/core-java-modules/core-java-17/src/main/java/module-info.java
new file mode 100644
index 0000000000..319678832e
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/java/module-info.java
@@ -0,0 +1,7 @@
+module core.java {
+ requires jdk.incubator.vector;
+ requires jdk.incubator.foreign;
+ requires jmh.core;
+ requires jdk.unsupported;
+ exports com.baeldung.randomgenerators.jmh_generated;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/main/resources/compile_c.sh b/core-java-modules/core-java-17/src/main/resources/compile_c.sh
new file mode 100755
index 0000000000..d2e0629cc5
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/resources/compile_c.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
+
+gcc -c -fPIC $SCRIPTPATH/print_name.c
+gcc -shared -rdynamic -o print_name.so print_name.o
+
+mv print_name.so $SCRIPTPATH/
+mv print_name.o $SCRIPTPATH/
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/main/resources/print_name.c b/core-java-modules/core-java-17/src/main/resources/print_name.c
new file mode 100644
index 0000000000..7bda12e352
--- /dev/null
+++ b/core-java-modules/core-java-17/src/main/resources/print_name.c
@@ -0,0 +1,8 @@
+#include
+#include
+
+char* printName(char *name) {
+ char* newString = (char*)malloc((15 + sizeof(name))*sizeof(char));
+ sprintf(newString, "Your name is %s", name);
+ return newString;
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP356UnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP356UnitTest.java
new file mode 100644
index 0000000000..b4f61a6f24
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP356UnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.features;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class JEP356UnitTest {
+
+ @Test
+ void getPseudoInts_whenUsingAlgorithmXoroshiro128PlusPlus_shouldReturnStreamOfRandomInteger() {
+ var algorithm = "Xoshiro256PlusPlus";
+ var streamSize = 100;
+
+ JEP356 jep356 = new JEP356();
+
+ jep356.getPseudoInts(algorithm, streamSize)
+ .forEach(value -> assertThat(value).isLessThanOrEqualTo(99));
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP406UnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP406UnitTest.java
new file mode 100644
index 0000000000..87e6f3bec6
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP406UnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.features;
+
+import com.baeldung.features.JEP406.Human;
+import com.baeldung.features.JEP409.Square;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class JEP406UnitTest {
+
+ @Test
+ void checkObject_shouldMatchWithHuman() {
+ var jep406 = new JEP406();
+
+ var human = new Human("John", 31, "Developer");
+
+ var checkResult = jep406.checkObject(human);
+
+ assertEquals("Name: John, age: 31 and profession: Developer", checkResult);
+ }
+
+ @Test
+ void checkShape_shouldMatchWithShape() {
+ var jep406 = new JEP406();
+
+ var square = new Square();
+
+ var checkResult = jep406.checkShape(square);
+
+ assertEquals("Just a normal shape", checkResult);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP409UnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP409UnitTest.java
new file mode 100644
index 0000000000..41380ec2bb
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP409UnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.features;
+
+import com.baeldung.features.JEP409.*;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+class JEP409UnitTest {
+
+ static class WeirdTriangle extends Triangle {
+ @Override public int getNumberOfSides() {
+ return 40;
+ }
+ }
+
+ @Test
+ void testSealedClass_shouldInvokeRightClass() {
+
+ Shape shape = spy(new WeirdTriangle());
+
+ int numberOfSides = getNumberOfSides(shape);
+
+ assertEquals(40, numberOfSides);
+ verify(shape).getNumberOfSides();
+ }
+
+ int getNumberOfSides(Shape shape) {
+ return switch (shape) {
+ case WeirdTriangle t -> t.getNumberOfSides();
+ case Circle c -> c.getNumberOfSides();
+ case Triangle t -> t.getNumberOfSides();
+ case Rectangle r -> r.getNumberOfSides();
+ case Square s -> s.getNumberOfSides();
+ };
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP412UnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP412UnitTest.java
new file mode 100644
index 0000000000..66e7d952c7
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP412UnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.features;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class JEP412UnitTest {
+
+ @Test
+ void getPrintNameFormat_whenPassingAName_shouldReceiveItFormatted() {
+ var jep412 = new JEP412();
+
+ var formattedName = jep412.getPrintNameFormat("John");
+
+ assertEquals("Your name is John", formattedName);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP414UnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP414UnitTest.java
new file mode 100644
index 0000000000..459344d907
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/features/JEP414UnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.features;
+
+import org.junit.jupiter.api.Test;
+
+import static java.util.stream.Collectors.toList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class JEP414UnitTest {
+
+ @Test
+ void vectorComputation_shouldMultiplyVectors() {
+ var jep414 = new JEP414();
+
+ float[] a = initArray(100);
+ float[] b = initArray(100);
+ float[] c = new float[100];
+ float[] d = new float[100];
+
+ jep414.newVectorComputation(a, b, c);
+ jep414.commonVectorComputation(a, b, d);
+
+ for (int i = 0; i < a.length; i++) {
+ assertEquals(c[i], d[i]);
+ }
+ }
+
+ private float[] initArray(int size) {
+ final var jep356 = new JEP356();
+ final var values = new float[size];
+ final var pseudoInts = jep356.getPseudoInts("Xoshiro256PlusPlus", size).mapToObj(Float::valueOf).collect(toList());
+
+ for (int i = 0; i < pseudoInts.size(); i++) {
+ values[i] = pseudoInts.get(i);
+ }
+
+ return values;
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java
new file mode 100644
index 0000000000..29b6eb1bee
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/ByteHexadecimalConversionUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class ByteHexadecimalConversionUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of();
+
+ @Test
+ void givenInitialisedHexFormat_whenHexStringIsPassed_thenByteArrayRepresentationIsReturned() {
+ byte[] hexBytes = hexFormat.parseHex("ABCDEF0123456789");
+ assertArrayEquals(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119 }, hexBytes);
+ }
+
+ @Test
+ void givenInitialisedHexFormat_whenByteArrayIsPassed_thenHexStringRepresentationIsReturned() {
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertEquals("abcdef0123456789", bytesAsString);
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java
new file mode 100644
index 0000000000..6f26a8351c
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/PrimitiveTypeHexadecimalConversionUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class PrimitiveTypeHexadecimalConversionUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of();
+
+ @Test
+ void givenInitialisedHexFormat_whenPrimitiveByteIsPassed_thenHexStringRepresentationIsReturned() {
+ String fromByte = hexFormat.toHexDigits((byte)64);
+ assertEquals("40", fromByte);
+ }
+
+ @Test
+ void givenInitialisedHexFormat_whenPrimitiveLongIsPassed_thenHexStringRepresentationIsReturned() {
+ String fromLong = hexFormat.toHexDigits(1234_5678_9012_3456L);
+ assertEquals("000462d53c8abac0", fromLong);
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java
new file mode 100644
index 0000000000..28189d0e8c
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/StringFormattingUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class StringFormattingUnitTest {
+
+ private HexFormat hexFormat = HexFormat.of().withPrefix("[").withSuffix("]").withDelimiter(", ");
+
+ @Test
+ public void givenInitialisedHexFormatWithFormattedStringOptions_whenByteArrayIsPassed_thenHexStringRepresentationFormattedCorrectlyIsReturned() {
+ assertEquals("[48], [0c], [11]", hexFormat.formatHex(new byte[] {72, 12, 17}));
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java
new file mode 100644
index 0000000000..c2a33fb4b5
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/hexformat/UppercaseLowercaseOutputUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.hexformat;
+
+import java.util.HexFormat;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class UppercaseLowercaseOutputUnitTest {
+
+ @Test
+ public void givenInitialisedHexFormat_whenByteArrayIsPassed_thenLowerCaseHexStringRepresentationIsReturned() {
+ HexFormat hexFormat = HexFormat.of();
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertTrue(isLowerCase(bytesAsString));
+ }
+
+ @Test
+ public void givenInitialisedHexFormatWithUpperCaseOption_whenByteArrayIsPassed_thenLowerCaseHexStringRepresentationIsReturned() {
+ HexFormat hexFormat = HexFormat.of().withUpperCase();
+ String bytesAsString = hexFormat.formatHex(new byte[] { -85, -51, -17, 1, 35, 69, 103, -119});
+ assertTrue(isUpperCase(bytesAsString));
+ }
+
+ private boolean isLowerCase(String str) {
+ char[] charArray = str.toCharArray();
+ for (int i=0; i < charArray.length; i++) {
+ if (Character.isUpperCase(charArray[i]))
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isUpperCase(String str) {
+ char[] charArray = str.toCharArray();
+ for (int i=0; i < charArray.length; i++) {
+ if (Character.isLowerCase(charArray[i]))
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/instantsource/InstantExampleUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/instantsource/InstantExampleUnitTest.java
new file mode 100644
index 0000000000..68bc084ba6
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/instantsource/InstantExampleUnitTest.java
@@ -0,0 +1,87 @@
+package com.baeldung.instantsource;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.InstantSource;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class InstantExampleUnitTest {
+
+ @Test
+ void getCurrentInstantFromWrapper_shouldReturnCurrentInstantBasedOnSystemClock() {
+ //given
+ InstantExample tested = new InstantExample(InstantWrapper.of(), null);
+ Instant currentInstant = Clock.systemDefaultZone().instant();
+ //when
+ Instant returnedInstant = tested.getCurrentInstantFromWrapper();
+
+ //then
+ assertTrue(returnedInstant.isAfter(currentInstant));
+ }
+
+ @Test
+ void getCurrentInstantFromWrapper_shouldReturnFixedInstant() {
+ //given
+ LocalDateTime now = LocalDateTime.now();
+ InstantExample tested = new InstantExample(InstantWrapper.of(now), null);
+ Instant currentInstant = now.toInstant(ZoneOffset.UTC);
+ //when
+ Instant returnedInstant = tested.getCurrentInstantFromWrapper();
+
+ //then
+ assertEquals(currentInstant, returnedInstant);
+ }
+
+ @Test
+ void getCurrentInstantFromInstantSource_shouldReturnCurrentInstantBasedOnSystemClock() {
+ //given
+ InstantSource instantSource = InstantSource.system();
+ InstantExample tested = new InstantExample(null, instantSource);
+ Instant currentInstant = instantSource.instant();
+
+ //when
+ Instant returnedInstant = tested.getCurrentInstantFromInstantSource();
+
+ //then
+ assertTrue(returnedInstant.isAfter(currentInstant));
+ }
+
+ @Test
+ void getCurrentInstantFromInstantSource_shouldReturnFixedInstant() {
+ //given
+ LocalDateTime now = LocalDateTime.now();
+ InstantSource instantSource = InstantSource.fixed(now.toInstant(ZoneOffset.UTC));
+ InstantExample tested = new InstantExample(null, instantSource);
+ Instant currentInstant = instantSource.instant();
+
+ LocalDateTime fixed = LocalDateTime.of(2022, 01, 01, 00, 00);
+ Instant i = InstantSource.fixed(fixed.toInstant(ZoneOffset.UTC)).instant();
+ System.out.println(i);
+
+ //when
+ Instant returnedInstant = tested.getCurrentInstantFromInstantSource();
+
+ //then
+ assertEquals(currentInstant, returnedInstant);
+ }
+
+ @Test
+ void getCurrentInstantFromInstantSource_shouldMatchGivenTimezone() {
+ //given
+ LocalDateTime now = LocalDateTime.now();
+ InstantSource instantSource = InstantSource.fixed(now.toInstant(ZoneOffset.of("-4")));
+ InstantExample tested = new InstantExample(null, instantSource);
+
+ //when
+ Instant returnedInstant = tested.getCurrentInstantFromInstantSource();
+
+ //then
+ assertEquals(now.atOffset(ZoneOffset.of("-4")).toInstant(), returnedInstant);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorFactoryUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorFactoryUnitTest.java
new file mode 100644
index 0000000000..b009b4eeb0
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorFactoryUnitTest.java
@@ -0,0 +1,21 @@
+package com.baeldung.randomgenerators;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class GeneratorFactoryUnitTest {
+
+ @Test
+ void givenDefaultGenerator_whenGeneratingAnInt_thenIntInRangeIsGenerated() {
+ int number = GeneratorFactory.getRandomInt(GeneratorFactory.getDefaultGenerator(), 10);
+ assertThat(number).isNotNegative().isLessThan(10);
+ }
+
+ @Test
+ void givenJumpableGenerator_whenGeneratingAnInt_thenIntInRangeIsGenerated() {
+ int number = GeneratorFactory.getRandomInt(GeneratorFactory.getJumpableGenerator(), 10);
+ assertThat(number).isNotNegative().isLessThan(10);
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorSelectionUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorSelectionUnitTest.java
new file mode 100644
index 0000000000..0732c3f54e
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/GeneratorSelectionUnitTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.randomgenerators;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.random.RandomGenerator;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class GeneratorSelectionUnitTest {
+
+ @Test
+ void givenDefaultGenerator_whenGeneratingAnInt_thenIntInRangeIsGenerated() {
+ RandomGenerator generator = RandomGenerator.getDefault();
+ int number = generator.nextInt(10);
+ assertThat(number).isNotNegative().isLessThan(10);
+ }
+
+ @Test
+ void givenSpecificGenerator_whenGeneratingAnInt_thenIntInRangeIsGenerated() {
+ RandomGenerator generator = RandomGenerator.of("L128X256MixRandom");
+ int number = generator.nextInt(10);
+ assertThat(number).isNotNegative().isLessThan(10);
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/OldRandomUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/OldRandomUnitTest.java
new file mode 100644
index 0000000000..4a18369686
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/OldRandomUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.randomgenerators;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class OldRandomUnitTest {
+
+ @Test
+ void givenOldRandomApi_whenGeneratingAnInt_thenIntInRangeIsGenerated() {
+ int number = OldRandom.getRandomInt(10);
+ assertThat(number).isNotNegative().isLessThan(10);
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThreadUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThreadUnitTest.java
new file mode 100644
index 0000000000..ba4cd8eb2b
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/randomgenerators/SplittableGeneratorMultiThreadUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.randomgenerators;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class SplittableGeneratorMultiThreadUnitTest {
+
+ @Test
+ void givenSplittableGenerator_whenUsingMultipleThreads_thenListOfIntsIsGenerated() {
+ List numbers = SplittableGeneratorMultiThread.generateNumbersInMultipleThreads();
+ assertThat(numbers).hasSize(20).allMatch(number -> number >= 0 && number <= 10);
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java
new file mode 100644
index 0000000000..cff8b1caca
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/GuardedPatternsUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.switchpatterns;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static com.baeldung.switchpatterns.GuardedPatterns.*;
+
+class GuardedPatternsUnitTest {
+
+ @Test
+ void givenIfImplementation_whenUsingEmptyString_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingIf(""));
+ }
+
+ @Test
+ void givenIfImplementation_whenUsingNonEmptyString_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleValueUsingIf("10"));
+ }
+
+ @Test
+ void givenPatternsImplementation_whenUsingEmptyString_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingGuardedPatterns(""));
+ }
+
+ @Test
+ void givenPatternsImplementation_whenUsingNonEmptyString_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleValueUsingGuardedPatterns("10"));
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java
new file mode 100644
index 0000000000..ffe045cc26
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/HandlingNullValuesUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.switchpatterns;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static com.baeldung.switchpatterns.HandlingNullValues.*;
+
+class HandlingNullValuesUnitTest {
+
+ @Test
+ void givenNullCaseInSwitch_whenUsingStringAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingSwitchNullCase("10"));
+ }
+
+ @Test
+ void givenTotalTypeInSwitch_whenUsingNullArgument_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleUsingSwitchNullCase(null));
+ }
+
+ @Test
+ void givenTotalTypeInSwitch_whenUsingStringAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingSwitchTotalType("10"));
+ }
+
+ @Test
+ void givenNullCaseInSwitch_whenUsingNullArgument_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleUsingSwitchTotalType(null));
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java
new file mode 100644
index 0000000000..9548c9f0b6
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/ParenthesizedPatternsUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.switchpatterns;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static com.baeldung.switchpatterns.ParenthesizedPatterns.*;
+
+class ParenthesizedPatternsUnitTest {
+
+ @Test
+ void givenIfImplementation_whenUsingEmptyString_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingIf(""));
+ }
+
+ @Test
+ void givenIfImplementation_whenUsingNonEmptyString_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleValueUsingIf("10"));
+ }
+
+ @Test
+ void givenIfImplementation_whenStringContainsSpecialChar_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingIf("@10"));
+ }
+
+ @Test
+ void givenPatternsImplementation_whenUsingEmptyString_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingParenthesizedPatterns(""));
+ }
+
+ @Test
+ void givenPatternsImplementation_whenUsingNonEmptyString_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleValueUsingParenthesizedPatterns("10"));
+ }
+
+ @Test
+ void givenPatternsImplementation_whenStringContainsSpecialChar_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleValueUsingParenthesizedPatterns("@10"));
+ }
+
+}
diff --git a/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java
new file mode 100644
index 0000000000..25988be53d
--- /dev/null
+++ b/core-java-modules/core-java-17/src/test/java/com/baeldung/switchpatterns/TypePatternsUnitTest.java
@@ -0,0 +1,49 @@
+package com.baeldung.switchpatterns;
+
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static com.baeldung.switchpatterns.TypePatterns.*;
+
+class TypePatternsUnitTest {
+
+ @Test
+ void givenIfImplementation_whenUsingIntegerAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingIf(10));
+ }
+
+ @Test
+ void givenIfImplementation_whenUsingDoubleAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingIf(10.0f));
+ }
+
+ @Test
+ void givenIfImplementation_whenUsingStringAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingIf("10"));
+ }
+
+ @Test
+ void givenIfImplementation_whenUsingCharAsArgument_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleUsingIf('c'));
+ }
+
+ @Test
+ void givenSwitchImplementation_whenUsingIntegerAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingSwitch(10));
+ }
+
+ @Test
+ void givenSwitchImplementation_whenUsingDoubleAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingSwitch(10.0f));
+ }
+
+ @Test
+ void givenSwitchImplementation_whenUsingStringAsArgument_thenDoubleIsReturned() {
+ assertEquals(10d, getDoubleUsingSwitch("10"));
+ }
+
+ @Test
+ void givenSwitchImplementation_whenUsingCharAsArgument_thenDoubleIsReturned() {
+ assertEquals(0d, getDoubleUsingSwitch('c'));
+ }
+
+}
diff --git a/core-java-modules/core-java-8-2/pom.xml b/core-java-modules/core-java-8-2/pom.xml
index af26289db8..7db1e1ed4e 100644
--- a/core-java-modules/core-java-8-2/pom.xml
+++ b/core-java-modules/core-java-8-2/pom.xml
@@ -20,17 +20,10 @@
icu4j${icu.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- 64.2
- 3.12.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-8-datetime-2/pom.xml b/core-java-modules/core-java-8-datetime-2/pom.xml
index e662ba400c..9e54b0ee12 100644
--- a/core-java-modules/core-java-8-datetime-2/pom.xml
+++ b/core-java-modules/core-java-8-datetime-2/pom.xml
@@ -25,12 +25,6 @@
joda-time${joda-time.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- log4jlog4j
@@ -63,8 +57,6 @@
1.81.82.10
-
- 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-8-datetime/README.md b/core-java-modules/core-java-8-datetime/README.md
index c35683a589..03d2a9609d 100644
--- a/core-java-modules/core-java-8-datetime/README.md
+++ b/core-java-modules/core-java-8-datetime/README.md
@@ -5,7 +5,7 @@ This module contains articles about the Date and Time API introduced with Java 8
### Relevant Articles:
- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
-- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
+- [Get the Current Date and Time in Java](https://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster)
- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset)
- [Differences Between ZonedDateTime and OffsetDateTime](https://www.baeldung.com/java-zoneddatetime-offsetdatetime)
diff --git a/core-java-modules/core-java-8-datetime/pom.xml b/core-java-modules/core-java-8-datetime/pom.xml
index f58557df7f..01ec6c0b76 100644
--- a/core-java-modules/core-java-8-datetime/pom.xml
+++ b/core-java-modules/core-java-8-datetime/pom.xml
@@ -25,12 +25,6 @@
joda-time${joda-time.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- log4jlog4j
@@ -64,8 +58,6 @@
1.81.82.10
-
- 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index 987ba2e568..89925bdbbb 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -31,13 +31,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -50,11 +43,4 @@
-
-
- 4.1
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-improvements/pom.xml b/core-java-modules/core-java-9-improvements/pom.xml
index b047e15969..56d4ccff9f 100644
--- a/core-java-modules/core-java-9-improvements/pom.xml
+++ b/core-java-modules/core-java-9-improvements/pom.xml
@@ -21,12 +21,6 @@
${awaitility.version}test
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.google.guavaguava
@@ -40,7 +34,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -68,13 +62,9 @@
-
- 3.10.0
- 1.2.01.7.01.91.9
- 25.1-jre
\ No newline at end of file
diff --git a/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java b/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java
index b909636b56..ed2dcaf695 100644
--- a/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java
+++ b/core-java-modules/core-java-9-jigsaw/src/test/java/com/baeldung/java9/modules/ModuleAPIUnitTest.java
@@ -2,12 +2,21 @@ package com.baeldung.java9.modules;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.Matchers.*;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasItem;
+import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.collection.IsEmptyCollection.empty;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import java.lang.module.ModuleDescriptor;
-import java.lang.module.ModuleDescriptor.*;
+
+import java.lang.module.ModuleDescriptor.Builder;
+import java.lang.module.ModuleDescriptor.Exports;
+import java.lang.module.ModuleDescriptor.Opens;
+import java.lang.module.ModuleDescriptor.Provides;
+import java.lang.module.ModuleDescriptor.Requires;
import java.sql.Date;
import java.sql.Driver;
import java.util.HashMap;
@@ -17,6 +26,7 @@ import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;
+
public class ModuleAPIUnitTest {
public static final String JAVA_BASE_MODULE_NAME = "java.base";
@@ -27,14 +37,9 @@ public class ModuleAPIUnitTest {
@Before
public void setUp() {
- Class hashMapClass = HashMap.class;
- javaBaseModule = hashMapClass.getModule();
-
- Class dateClass = Date.class;
- javaSqlModule = dateClass.getModule();
-
- Class personClass = Person.class;
- module = personClass.getModule();
+ javaBaseModule = HashMap.class.getModule();
+ javaSqlModule = Date.class.getModule();
+ module = Person.class.getModule();
}
@Test
@@ -118,7 +123,7 @@ public class ModuleAPIUnitTest {
.map(Provides::service)
.collect(Collectors.toSet());
- assertThat(javaBaseProvidesService, contains("java.nio.file.spi.FileSystemProvider"));
+ assertThat(javaBaseProvidesService, hasItem("java.nio.file.spi.FileSystemProvider"));
assertThat(javaSqlProvides, empty());
}
@@ -130,15 +135,14 @@ public class ModuleAPIUnitTest {
.map(Exports::source)
.collect(Collectors.toSet());
- assertThat(javaSqlExportsSource, hasItems("java.sql", "javax.sql"));
+ assertThat(javaSqlExportsSource, hasItems("java.sql", "javax.sql"));
}
@Test
public void givenModules_whenAccessingModuleDescriptorUses_thenUsesAreReturned() {
- Set javaBaseUses = javaBaseModule.getDescriptor().uses();
Set javaSqlUses = javaSqlModule.getDescriptor().uses();
- assertThat(javaSqlUses, contains("java.sql.Driver"));
+ assertThat(javaSqlUses, hasItem("java.sql.Driver"));
}
@Test
diff --git a/core-java-modules/core-java-9-new-features/pom.xml b/core-java-modules/core-java-9-new-features/pom.xml
index 00480a28e1..ce90a0f04a 100644
--- a/core-java-modules/core-java-9-new-features/pom.xml
+++ b/core-java-modules/core-java-9-new-features/pom.xml
@@ -20,16 +20,10 @@
rxjava${rxjava.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -156,9 +150,6 @@
3.0.0
-
- 3.10.0
- 1.2.04.0.21.91.9
diff --git a/core-java-modules/core-java-9-streams/pom.xml b/core-java-modules/core-java-9-streams/pom.xml
index aeaf2c7f57..d3f81780d1 100644
--- a/core-java-modules/core-java-9-streams/pom.xml
+++ b/core-java-modules/core-java-9-streams/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
diff --git a/core-java-modules/core-java-9/pom.xml b/core-java-modules/core-java-9/pom.xml
index 543c3891ee..272af327cb 100644
--- a/core-java-modules/core-java-9/pom.xml
+++ b/core-java-modules/core-java-9/pom.xml
@@ -21,12 +21,6 @@
${awaitility.version}test
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.google.guavaguava
@@ -35,7 +29,7 @@
org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test
@@ -78,15 +72,9 @@
-
- 3.10.0
- 1.2.01.7.01.91.9
- 25.1-jre
- 4.1
- 3.2.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-annotations/README.md b/core-java-modules/core-java-annotations/README.md
index 18f5589771..a8a9ac3b16 100644
--- a/core-java-modules/core-java-annotations/README.md
+++ b/core-java-modules/core-java-annotations/README.md
@@ -12,3 +12,4 @@
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
- [Why Missing Annotations Don’t Cause ClassNotFoundException](https://www.baeldung.com/classnotfoundexception-missing-annotation)
- [Valid @SuppressWarnings Warning Names](https://www.baeldung.com/java-suppresswarnings-valid-names)
+- [Get a Field’s Annotations Using Reflection](https://www.baeldung.com/java-get-field-annotations)
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
index a87baa6204..a1f84ab563 100644
--- a/core-java-modules/core-java-annotations/pom.xml
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -1,7 +1,7 @@
+ 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.0core-java-annotations0.1.0-SNAPSHOT
@@ -14,19 +14,6 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
- 3.10.0
-
-
core-java-annotations
@@ -37,4 +24,4 @@
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-convert/README.md b/core-java-modules/core-java-arrays-convert/README.md
index 4bd060a246..b28b97cb09 100644
--- a/core-java-modules/core-java-arrays-convert/README.md
+++ b/core-java-modules/core-java-arrays-convert/README.md
@@ -5,3 +5,4 @@ This module contains articles about arrays conversion in Java
## Relevant Articles
- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array)
+- [Convert a Byte Array to a Numeric Representation in Java](https://www.baeldung.com/java-byte-array-to-number)
diff --git a/core-java-modules/core-java-arrays-convert/pom.xml b/core-java-modules/core-java-arrays-convert/pom.xml
index 4cb2946ac9..c90b60e09a 100644
--- a/core-java-modules/core-java-arrays-convert/pom.xml
+++ b/core-java-modules/core-java-arrays-convert/pom.xml
@@ -15,14 +15,10 @@
- com.google.guava
- guava
- ${guava.version}
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
-
- 28.2-jre
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java
new file mode 100644
index 0000000000..82d60e1666
--- /dev/null
+++ b/core-java-modules/core-java-arrays-convert/src/main/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentation.java
@@ -0,0 +1,281 @@
+package com.baeldung.array.conversions;
+
+import com.google.common.primitives.Ints;
+import com.google.common.primitives.Longs;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.Conversion;
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+class ByteArrayToNumericRepresentation {
+
+ static int convertByteArrayToIntUsingShiftOperator(byte[] bytes) {
+ int value = 0;
+ for (byte b : bytes) {
+ value = (value << 8) + (b & 0xFF);
+ }
+ return value;
+ }
+
+ static byte[] convertIntToByteArrayUsingShiftOperator(int value) {
+ byte[] bytes = new byte[Integer.BYTES];
+ int length = bytes.length;
+ for (int i = 0; i < length; i++) {
+ bytes[length - i - 1] = (byte) (value & 0xFF);
+ value >>= 8;
+ }
+ return bytes;
+ }
+
+ static long convertByteArrayToLongUsingShiftOperator(byte[] bytes) {
+ long value = 0;
+ for (byte b : bytes) {
+ value <<= 8;
+ value |= (b & 0xFF);
+ }
+ return value;
+ }
+
+ static byte[] convertLongToByteArrayUsingShiftOperator(long value) {
+ byte[] bytes = new byte[Long.BYTES];
+ int length = bytes.length;
+ for (int i = 0; i < length; i++) {
+ bytes[length - i - 1] = (byte) (value & 0xFF);
+ value >>= 8;
+ }
+ return bytes;
+ }
+
+ static float convertByteArrayToFloatUsingShiftOperator(byte[] bytes) {
+ // convert bytes to int
+ int intValue = 0;
+ for (byte b : bytes) {
+ intValue = (intValue << 8) + (b & 0xFF);
+ }
+
+ // convert int to float
+ return Float.intBitsToFloat(intValue);
+ }
+
+ static byte[] convertFloatToByteArrayUsingShiftOperator(float value) {
+ // convert float to int
+ int intValue = Float.floatToIntBits(value);
+
+ // convert int to bytes
+ byte[] bytes = new byte[Float.BYTES];
+ int length = bytes.length;
+ for (int i = 0; i < length; i++) {
+ bytes[length - i - 1] = (byte) (intValue & 0xFF);
+ intValue >>= 8;
+ }
+ return bytes;
+ }
+
+ static double convertingByteArrayToDoubleUsingShiftOperator(byte[] bytes) {
+ long longValue = 0;
+ for (byte b : bytes) {
+ longValue = (longValue << 8) + (b & 0xFF);
+ }
+
+ return Double.longBitsToDouble(longValue);
+ }
+
+ static byte[] convertDoubleToByteArrayUsingShiftOperator(double value) {
+ long longValue = Double.doubleToLongBits(value);
+
+ byte[] bytes = new byte[Double.BYTES];
+ int length = bytes.length;
+ for (int i = 0; i < length; i++) {
+ bytes[length - i - 1] = (byte) (longValue & 0xFF);
+ longValue >>= 8;
+ }
+ return bytes;
+ }
+
+ static int convertByteArrayToIntUsingByteBuffer(byte[] bytes) {
+ ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
+ buffer.put(bytes);
+ buffer.rewind();
+ return buffer.getInt();
+ }
+
+ static byte[] convertIntToByteArrayUsingByteBuffer(int value) {
+ ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
+ buffer.putInt(value);
+ buffer.rewind();
+ return buffer.array();
+ }
+
+ static long convertByteArrayToLongUsingByteBuffer(byte[] bytes) {
+ ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+ buffer.put(bytes);
+ buffer.rewind();
+ return buffer.getLong();
+ }
+
+ static byte[] convertLongToByteArrayUsingByteBuffer(long value) {
+ ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+ buffer.putLong(value);
+ buffer.rewind();
+ return buffer.array();
+ }
+
+ static float convertByteArrayToFloatUsingByteBuffer(byte[] bytes) {
+ ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES);
+ buffer.put(bytes);
+ buffer.rewind();
+ return buffer.getFloat();
+ }
+
+ static byte[] convertFloatToByteArrayUsingByteBuffer(float value) {
+ ByteBuffer buffer = ByteBuffer.allocate(Float.BYTES);
+ buffer.putFloat(value);
+ buffer.rewind();
+ return buffer.array();
+ }
+
+ static double convertByteArrayToDoubleUsingByteBuffer(byte[] bytes) {
+ ByteBuffer buffer = ByteBuffer.allocate(Double.BYTES);
+ buffer.put(bytes);
+ buffer.rewind();
+ return buffer.getDouble();
+ }
+
+ static byte[] convertDoubleToByteArrayUsingByteBuffer(double value) {
+ ByteBuffer buffer = ByteBuffer.allocate(Double.BYTES);
+ buffer.putDouble(value);
+ buffer.rewind();
+ return buffer.array();
+ }
+
+ static int convertByteArrayToIntUsingBigInteger(byte[] bytes) {
+ return new BigInteger(bytes).intValue();
+ }
+
+ static byte[] convertIntToByteArrayUsingBigInteger(int value) {
+ return BigInteger.valueOf(value).toByteArray();
+ }
+
+ static long convertByteArrayToLongUsingBigInteger(byte[] bytes) {
+ return new BigInteger(bytes).longValue();
+ }
+
+ static byte[] convertLongToByteArrayUsingBigInteger(long value) {
+ return BigInteger.valueOf(value).toByteArray();
+ }
+
+ static float convertByteArrayToFloatUsingBigInteger(byte[] bytes) {
+ int intValue = new BigInteger(bytes).intValue();
+ return Float.intBitsToFloat(intValue);
+ }
+
+ static byte[] convertFloatToByteArrayUsingBigInteger(float value) {
+ int intValue = Float.floatToIntBits(value);
+ return BigInteger.valueOf(intValue).toByteArray();
+ }
+
+ static double convertByteArrayToDoubleUsingBigInteger(byte[] bytes) {
+ long longValue = new BigInteger(bytes).longValue();
+ return Double.longBitsToDouble(longValue);
+ }
+
+ static byte[] convertDoubleToByteArrayUsingBigInteger(double value) {
+ long longValue = Double.doubleToLongBits(value);
+ return BigInteger.valueOf(longValue).toByteArray();
+ }
+
+ static int convertingByteArrayToIntUsingGuava(byte[] bytes) {
+ return Ints.fromByteArray(bytes);
+ }
+
+ static byte[] convertIntToByteArrayUsingGuava(int value) {
+ return Ints.toByteArray(value);
+ }
+
+ static long convertByteArrayToLongUsingGuava(byte[] bytes) {
+ return Longs.fromByteArray(bytes);
+ }
+
+ static byte[] convertLongToByteArrayUsingGuava(long value) {
+ return Longs.toByteArray(value);
+ }
+
+ static float convertByteArrayToFloatUsingGuava(byte[] bytes) {
+ int intValue = Ints.fromByteArray(bytes);
+ return Float.intBitsToFloat(intValue);
+ }
+
+ static byte[] convertFloatToByteArrayUsingGuava(float value) {
+ int intValue = Float.floatToIntBits(value);
+ return Ints.toByteArray(intValue);
+ }
+
+ static double convertByteArrayToDoubleUsingGuava(byte[] bytes) {
+ long longValue = Longs.fromByteArray(bytes);
+ return Double.longBitsToDouble(longValue);
+ }
+
+ static byte[] convertDoubleToByteArrayUsingGuava(double value) {
+ long longValue = Double.doubleToLongBits(value);
+ return Longs.toByteArray(longValue);
+ }
+
+ static int convertByteArrayToIntUsingCommonsLang(byte[] bytes) {
+ byte[] copyBytes = Arrays.copyOf(bytes, bytes.length);
+ ArrayUtils.reverse(copyBytes);
+ return Conversion.byteArrayToInt(copyBytes, 0, 0, 0, copyBytes.length);
+ }
+
+ static byte[] convertIntToByteArrayUsingCommonsLang(int value) {
+ byte[] bytes = new byte[Integer.BYTES];
+ Conversion.intToByteArray(value, 0, bytes, 0, bytes.length);
+ ArrayUtils.reverse(bytes);
+ return bytes;
+ }
+
+ static long convertByteArrayToLongUsingCommonsLang(byte[] bytes) {
+ byte[] copyBytes = Arrays.copyOf(bytes, bytes.length);
+ ArrayUtils.reverse(copyBytes);
+ return Conversion.byteArrayToLong(copyBytes, 0, 0, 0, copyBytes.length);
+ }
+
+ static byte[] convertLongToByteArrayUsingCommonsLang(long value) {
+ byte[] bytes = new byte[Long.BYTES];
+ Conversion.longToByteArray(value, 0, bytes, 0, bytes.length);
+ ArrayUtils.reverse(bytes);
+ return bytes;
+ }
+
+ static float convertByteArrayToFloatUsingCommonsLang(byte[] bytes) {
+ byte[] copyBytes = Arrays.copyOf(bytes, bytes.length);
+ ArrayUtils.reverse(copyBytes);
+ int intValue = Conversion.byteArrayToInt(copyBytes, 0, 0, 0, copyBytes.length);
+ return Float.intBitsToFloat(intValue);
+ }
+
+ static byte[] convertFloatToByteArrayUsingCommonsLang(float value) {
+ int intValue = Float.floatToIntBits(value);
+ byte[] bytes = new byte[Float.BYTES];
+ Conversion.intToByteArray(intValue, 0, bytes, 0, bytes.length);
+ ArrayUtils.reverse(bytes);
+ return bytes;
+ }
+
+ static double convertByteArrayToDoubleUsingCommonsLang(byte[] bytes) {
+ byte[] copyBytes = Arrays.copyOf(bytes, bytes.length);
+ ArrayUtils.reverse(copyBytes);
+ long longValue = Conversion.byteArrayToLong(copyBytes, 0, 0, 0, copyBytes.length);
+ return Double.longBitsToDouble(longValue);
+ }
+
+ static byte[] convertDoubleToByteArrayUsingCommonsLang(double value) {
+ long longValue = Double.doubleToLongBits(value);
+ byte[] bytes = new byte[Long.BYTES];
+ Conversion.longToByteArray(longValue, 0, bytes, 0, bytes.length);
+ ArrayUtils.reverse(bytes);
+ return bytes;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java
new file mode 100644
index 0000000000..0fae765d9c
--- /dev/null
+++ b/core-java-modules/core-java-arrays-convert/src/test/java/com/baeldung/array/conversions/ByteArrayToNumericRepresentationUnitTest.java
@@ -0,0 +1,316 @@
+package com.baeldung.array.conversions;
+
+import org.junit.Test;
+
+import static com.baeldung.array.conversions.ByteArrayToNumericRepresentation.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+public class ByteArrayToNumericRepresentationUnitTest {
+ private static final byte[] INT_BYTE_ARRAY = new byte[]{
+ (byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE
+ };
+ private static final int INT_VALUE = 0xCAFEBABE;
+
+
+ private static final byte[] FLOAT_BYTE_ARRAY = new byte[]{
+ (byte) 0x40, (byte) 0x48, (byte) 0xF5, (byte) 0xC3
+ };
+ private static final float FLOAT_VALUE = 3.14F;
+
+
+ private static final byte[] LONG_BYTE_ARRAY = new byte[]{
+ (byte) 0x01, (byte) 0x23, (byte) 0x45, (byte) 0x67,
+ (byte) 0x89, (byte) 0xAB, (byte) 0xCD, (byte) 0xEF
+ };
+ private static final long LONG_VALUE = 0x0123456789ABCDEFL;
+
+
+ private static final byte[] DOUBLE_BYTE_ARRAY = new byte[]{
+ (byte) 0x3F, (byte) 0xE3, (byte) 0xC6, (byte) 0xA7,
+ (byte) 0xEF, (byte) 0x9D, (byte) 0xB2, (byte) 0x2D
+ };
+ private static final double DOUBLE_VALUE = 0.618D;
+
+
+ @Test
+ public void givenShiftOperator_whenConvertingByteArrayToInt_thenSuccess() {
+ int value = convertByteArrayToIntUsingShiftOperator(INT_BYTE_ARRAY);
+
+ assertEquals(INT_VALUE, value);
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingIntToByteArray_thenSuccess() {
+ byte[] bytes = convertIntToByteArrayUsingShiftOperator(INT_VALUE);
+
+ assertArrayEquals(INT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingByteArrayToLong_thenSuccess() {
+ long value = convertByteArrayToLongUsingShiftOperator(LONG_BYTE_ARRAY);
+
+ assertEquals(LONG_VALUE, value);
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingLongToByteArray_thenSuccess() {
+ byte[] bytes = convertLongToByteArrayUsingShiftOperator(LONG_VALUE);
+
+ assertArrayEquals(LONG_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingByteArrayToFloat_thenSuccess() {
+ float value = convertByteArrayToFloatUsingShiftOperator(FLOAT_BYTE_ARRAY);
+
+ assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingFloatToByteArray_thenSuccess() {
+ byte[] bytes = convertFloatToByteArrayUsingShiftOperator(FLOAT_VALUE);
+
+ assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingByteArrayToDouble_thenSuccess() {
+ double value = convertingByteArrayToDoubleUsingShiftOperator(DOUBLE_BYTE_ARRAY);
+
+ assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value));
+ }
+
+ @Test
+ public void givenShiftOperator_whenConvertingDoubleToByteArray_thenSuccess() {
+ byte[] bytes = convertDoubleToByteArrayUsingShiftOperator(DOUBLE_VALUE);
+
+ assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingByteArrayToInt_thenSuccess() {
+ int value = convertByteArrayToIntUsingByteBuffer(INT_BYTE_ARRAY);
+
+ assertEquals(INT_VALUE, value);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingIntToByteArray_thenSuccess() {
+ byte[] bytes = convertIntToByteArrayUsingByteBuffer(INT_VALUE);
+
+ assertArrayEquals(INT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingByteArrayToLong_thenSuccess() {
+ long value = convertByteArrayToLongUsingByteBuffer(LONG_BYTE_ARRAY);
+
+ assertEquals(LONG_VALUE, value);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingLongToByteArray_thenSuccess() {
+ byte[] bytes = convertLongToByteArrayUsingByteBuffer(LONG_VALUE);
+
+ assertArrayEquals(LONG_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingByteArrayToFloat_thenSuccess() {
+ float value = convertByteArrayToFloatUsingByteBuffer(FLOAT_BYTE_ARRAY);
+
+ assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingFloatToByteArray_thenSuccess() {
+ byte[] bytes = convertFloatToByteArrayUsingByteBuffer(FLOAT_VALUE);
+
+ assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingByteArrayToDouble_thenSuccess() {
+ double value = convertByteArrayToDoubleUsingByteBuffer(DOUBLE_BYTE_ARRAY);
+
+ assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value));
+ }
+
+ @Test
+ public void givenByteBuffer_whenConvertingDoubleToByteArray_thenSuccess() {
+ byte[] bytes = convertDoubleToByteArrayUsingByteBuffer(DOUBLE_VALUE);
+
+ assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingByteArrayToInt_thenSuccess() {
+ int value = convertByteArrayToIntUsingBigInteger(INT_BYTE_ARRAY);
+
+ assertEquals(INT_VALUE, value);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingIntToByteArray_thenSuccess() {
+ byte[] bytes = convertIntToByteArrayUsingBigInteger(INT_VALUE);
+
+ assertArrayEquals(INT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingByteArrayToLong_thenSuccess() {
+ long value = convertByteArrayToLongUsingBigInteger(LONG_BYTE_ARRAY);
+
+ assertEquals(LONG_VALUE, value);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingLongToByteArray_thenSuccess() {
+ byte[] bytes = convertLongToByteArrayUsingBigInteger(LONG_VALUE);
+
+ assertArrayEquals(LONG_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingByteArrayToFloat_thenSuccess() {
+ float value = convertByteArrayToFloatUsingBigInteger(FLOAT_BYTE_ARRAY);
+
+ assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingFloatToByteArray_thenSuccess() {
+ byte[] bytes = convertFloatToByteArrayUsingBigInteger(FLOAT_VALUE);
+
+ assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingByteArrayToDouble_thenSuccess() {
+ double value = convertByteArrayToDoubleUsingBigInteger(DOUBLE_BYTE_ARRAY);
+
+ assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value));
+ }
+
+ @Test
+ public void givenBigInteger_whenConvertingDoubleToByteArray_thenSuccess() {
+ byte[] bytes = convertDoubleToByteArrayUsingBigInteger(DOUBLE_VALUE);
+
+ assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingByteArrayToInt_thenSuccess() {
+ int value = convertingByteArrayToIntUsingGuava(INT_BYTE_ARRAY);
+
+ assertEquals(INT_VALUE, value);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingIntToByteArray_thenSuccess() {
+ byte[] bytes = convertIntToByteArrayUsingGuava(INT_VALUE);
+
+ assertArrayEquals(INT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingByteArrayToLong_thenSuccess() {
+ long value = convertByteArrayToLongUsingGuava(LONG_BYTE_ARRAY);
+
+ assertEquals(LONG_VALUE, value);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingLongToByteArray_thenSuccess() {
+ byte[] bytes = convertLongToByteArrayUsingGuava(LONG_VALUE);
+
+ assertArrayEquals(LONG_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingByteArrayToFloat_thenSuccess() {
+ float value = convertByteArrayToFloatUsingGuava(FLOAT_BYTE_ARRAY);
+
+ assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));
+ }
+
+ @Test
+ public void givenGuava_whenConvertingFloatToByteArray_thenSuccess() {
+ byte[] bytes = convertFloatToByteArrayUsingGuava(FLOAT_VALUE);
+
+ assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenGuava_whenConvertingByteArrayToDouble_thenSuccess() {
+ double value = convertByteArrayToDoubleUsingGuava(DOUBLE_BYTE_ARRAY);
+
+ assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value));
+ }
+
+ @Test
+ public void givenGuava_whenConvertingDoubleToByteArray_thenSuccess() {
+ byte[] bytes = convertDoubleToByteArrayUsingGuava(DOUBLE_VALUE);
+
+ assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingByteArrayToInt_thenSuccess() {
+ int value = convertByteArrayToIntUsingCommonsLang(INT_BYTE_ARRAY);
+
+ assertEquals(INT_VALUE, value);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingIntToByteArray_thenSuccess() {
+ byte[] bytes = convertIntToByteArrayUsingCommonsLang(INT_VALUE);
+
+ assertArrayEquals(INT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingByteArrayToLong_thenSuccess() {
+ long value = convertByteArrayToLongUsingCommonsLang(LONG_BYTE_ARRAY);
+
+ assertEquals(LONG_VALUE, value);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingLongToByteArray_thenSuccess() {
+ byte[] bytes = convertLongToByteArrayUsingCommonsLang(LONG_VALUE);
+
+ assertArrayEquals(LONG_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingByteArrayToFloat_thenSuccess() {
+ float value = convertByteArrayToFloatUsingCommonsLang(FLOAT_BYTE_ARRAY);
+
+ assertEquals(Float.floatToIntBits(FLOAT_VALUE), Float.floatToIntBits(value));
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingFloatToByteArray_thenSuccess() {
+ byte[] bytes = convertFloatToByteArrayUsingCommonsLang(FLOAT_VALUE);
+
+ assertArrayEquals(FLOAT_BYTE_ARRAY, bytes);
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingByteArrayToDouble_thenSuccess() {
+ double value = convertByteArrayToDoubleUsingCommonsLang(DOUBLE_BYTE_ARRAY);
+
+ assertEquals(Double.doubleToLongBits(DOUBLE_VALUE), Double.doubleToLongBits(value));
+ }
+
+ @Test
+ public void givenCommonsLang_whenConvertingDoubleToByteArray_thenSuccess() {
+ byte[] bytes = convertDoubleToByteArrayUsingCommonsLang(DOUBLE_VALUE);
+
+ assertArrayEquals(DOUBLE_BYTE_ARRAY, bytes);
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-guides/pom.xml b/core-java-modules/core-java-arrays-guides/pom.xml
index 3dba2dc05f..d22f6b4d7d 100644
--- a/core-java-modules/core-java-arrays-guides/pom.xml
+++ b/core-java-modules/core-java-arrays-guides/pom.xml
@@ -24,12 +24,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
- org.assertj
- assertj-core
- 3.19.0
- test
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-operations-advanced/pom.xml b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
index 065f1930e2..cbcd6ae440 100644
--- a/core-java-modules/core-java-arrays-operations-advanced/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-advanced/pom.xml
@@ -19,32 +19,18 @@
commons-lang3${commons-lang3.version}
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}
-
org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
-
- 3.10.0
- 1.33
-
-
diff --git a/core-java-modules/core-java-arrays-operations-basic/pom.xml b/core-java-modules/core-java-arrays-operations-basic/pom.xml
index 382cee102d..6517b2efb9 100644
--- a/core-java-modules/core-java-arrays-operations-basic/pom.xml
+++ b/core-java-modules/core-java-arrays-operations-basic/pom.xml
@@ -30,12 +30,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -67,7 +61,6 @@
3.2.0
- 3.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-sorting/pom.xml b/core-java-modules/core-java-arrays-sorting/pom.xml
index e9946d46ed..82e3f659fc 100644
--- a/core-java-modules/core-java-arrays-sorting/pom.xml
+++ b/core-java-modules/core-java-arrays-sorting/pom.xml
@@ -20,11 +20,6 @@
commons-lang3${commons-lang3.version}
-
- com.google.guava
- guava
- ${guava.version}
- org.openjdk.jmh
@@ -36,13 +31,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -74,8 +62,6 @@
3.2.0
- 28.2-jre
- 3.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-char/pom.xml b/core-java-modules/core-java-char/pom.xml
index 009197a1d0..7dc0923fb5 100644
--- a/core-java-modules/core-java-char/pom.xml
+++ b/core-java-modules/core-java-char/pom.xml
@@ -15,12 +15,6 @@
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.openjdk.jmhjmh-core
@@ -33,8 +27,4 @@
-
- 3.11.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml
index 4e171eed48..e78f7b5dda 100644
--- a/core-java-modules/core-java-collections-2/pom.xml
+++ b/core-java-modules/core-java-collections-2/pom.xml
@@ -34,25 +34,16 @@
commons-lang3${commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.junit.platformjunit-platform-runner
- ${junit.platform.version}
+ ${junit-platform.version}test7.1.0
- 4.1
- 3.11.1
- 1.2.01.3
diff --git a/core-java-modules/core-java-collections-3/README.md b/core-java-modules/core-java-collections-3/README.md
index 6bc9139856..4249d8ad30 100644
--- a/core-java-modules/core-java-collections-3/README.md
+++ b/core-java-modules/core-java-collections-3/README.md
@@ -11,7 +11,7 @@
- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
- [Fail-Safe Iterator vs Fail-Fast Iterator](https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
- [Quick Guide to the Java Stack](https://www.baeldung.com/java-stack)
-- [Convert an Array of Primitives to a List](https://www.baeldung.com/java-primitive-array-to-list)
- [A Guide to BitSet in Java](https://www.baeldung.com/java-bitset)
- [Get the First Key and Value From a HashMap](https://www.baeldung.com/java-hashmap-get-first-entry)
- [Performance of removeAll() in a HashSet](https://www.baeldung.com/java-hashset-removeall-performance)
+- More articles: [[<-- prev]](/core-java-modules/core-java-collections-2) [[next -->]](/core-java-modules/core-java-collections-4)
diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml
index 4ca4bda1ee..6ef8e3c81a 100644
--- a/core-java-modules/core-java-collections-3/pom.xml
+++ b/core-java-modules/core-java-collections-3/pom.xml
@@ -25,12 +25,6 @@
jmh-core${jmh-core.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.apache.commonscommons-lang3
@@ -39,7 +33,6 @@
- 3.11.10.10
diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/stack/StackUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/stack/StackUnitTest.java
index 6a2feff551..14eafe8924 100644
--- a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/stack/StackUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/stack/StackUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stack;
+package com.baeldung.collections.stack;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections-4/pom.xml b/core-java-modules/core-java-collections-4/pom.xml
index d86b04644c..2193b5118a 100644
--- a/core-java-modules/core-java-collections-4/pom.xml
+++ b/core-java-modules/core-java-collections-4/pom.xml
@@ -14,17 +14,4 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
-
- 3.19.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/DynamicTypeValue.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/DynamicTypeValue.java
new file mode 100644
index 0000000000..4c9ed89f63
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/DynamicTypeValue.java
@@ -0,0 +1,5 @@
+package com.baeldung.collections.mulipletypesinmap;
+
+public interface DynamicTypeValue {
+ String valueDescription();
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/InstantTypeValue.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/InstantTypeValue.java
new file mode 100644
index 0000000000..448e66d872
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/InstantTypeValue.java
@@ -0,0 +1,24 @@
+package com.baeldung.collections.mulipletypesinmap;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+
+public class InstantTypeValue implements DynamicTypeValue {
+ private static DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+ .withZone(ZoneId.systemDefault());
+ private Instant value;
+
+ public InstantTypeValue(Instant value) {
+ this.value = value;
+ }
+
+ @Override
+ public String valueDescription() {
+ if (value == null) {
+ return "The value is null.";
+ }
+ return String.format("The value is an instant: %s", FORMATTER.format(value));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntArrayTypeValue.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntArrayTypeValue.java
new file mode 100644
index 0000000000..290982183f
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntArrayTypeValue.java
@@ -0,0 +1,20 @@
+package com.baeldung.collections.mulipletypesinmap;
+
+import java.util.Arrays;
+
+public class IntArrayTypeValue implements DynamicTypeValue {
+ private int[] value;
+
+ public IntArrayTypeValue(int[] value) {
+ this.value = value;
+ }
+
+ @Override
+ public String valueDescription() {
+ if (value == null) {
+ return "The value is null.";
+ }
+ return String.format("The value is an array of %d integers: %s", value.length, Arrays.toString(value));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntegerTypeValue.java b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntegerTypeValue.java
new file mode 100644
index 0000000000..463b06f768
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/main/java/com/baeldung/collections/mulipletypesinmap/IntegerTypeValue.java
@@ -0,0 +1,17 @@
+package com.baeldung.collections.mulipletypesinmap;
+
+public class IntegerTypeValue implements DynamicTypeValue {
+ private Integer value;
+
+ public IntegerTypeValue(Integer value) {
+ this.value = value;
+ }
+
+ @Override
+ public String valueDescription() {
+ if(value == null){
+ return "The value is null.";
+ }
+ return String.format("The value is a %s integer: %d", value > 0 ? "positive" : "negative", value);
+ }
+}
diff --git a/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/multipletypesinmap/MultipleTypesInMapUnitTest.java b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/multipletypesinmap/MultipleTypesInMapUnitTest.java
new file mode 100644
index 0000000000..87ea310ab0
--- /dev/null
+++ b/core-java-modules/core-java-collections-4/src/test/java/com/baeldung/multipletypesinmap/MultipleTypesInMapUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.multipletypesinmap;
+
+import com.baeldung.collections.mulipletypesinmap.DynamicTypeValue;
+import com.baeldung.collections.mulipletypesinmap.InstantTypeValue;
+import com.baeldung.collections.mulipletypesinmap.IntArrayTypeValue;
+import com.baeldung.collections.mulipletypesinmap.IntegerTypeValue;
+import org.junit.jupiter.api.Test;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class MultipleTypesInMapUnitTest {
+ private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
+ .withZone(ZoneId.systemDefault());
+
+ private static final Integer intValue = 777;
+ private static final int[] intArray = new int[]{2, 3, 5, 7, 11, 13};
+ private static final Instant instant = Instant.now();
+
+ private static final String KEY_INT = "E1 (Integer)";
+ private static final String KEY_INT_ARRAY = "E2 (IntArray)";
+ private static final String KEY_INSTANT = "E3 (Instant)";
+
+ @Test
+ void givenThreeTypes_whenUsingRawMap_thenPrintDescription() {
+ Map rawMap = new HashMap<>();
+ rawMap.put(KEY_INT, intValue);
+ rawMap.put(KEY_INT_ARRAY, intArray);
+ rawMap.put(KEY_INSTANT, instant);
+
+ rawMap.forEach((k, v) -> {
+ if (v instanceof Integer) {
+ Integer theV = (Integer) v;
+ String desc = String.format("The value is a %s integer: %d", theV > 0 ? "positive" : "negative", theV);
+ System.out.println(k + " -> " + desc);
+ assertThat(k).isEqualTo(KEY_INT);
+ assertThat(desc).isEqualTo("The value is a positive integer: 777");
+ } else if (v instanceof int[]) {
+ int[] theV = (int[]) v;
+ String desc = String.format("The value is an array of %d integers: %s", theV.length, Arrays.toString(theV));
+ System.out.println(k + " -> " + desc);
+ assertThat(k).isEqualTo(KEY_INT_ARRAY);
+ assertThat(desc).isEqualTo("The value is an array of 6 integers: [2, 3, 5, 7, 11, 13]");
+ } else if (v instanceof Instant) {
+ Instant theV = (Instant) v;
+ String desc = String.format("The value is an instant: %s", FORMATTER.format(theV));
+ System.out.println(k + " -> " + desc);
+ assertThat(k).isEqualTo(KEY_INSTANT);
+ assertThat(desc).matches("^The value is an instant: \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
+ } else {
+ throw new IllegalStateException("Unknown Type found.");
+ }
+ });
+ }
+
+ @Test
+ void givenThreeTypes_whenUsingAnInterface_thenPrintDescription() {
+ Map theMap = new HashMap<>();
+ theMap.put(KEY_INT, new IntegerTypeValue(intValue));
+ theMap.put(KEY_INT_ARRAY, new IntArrayTypeValue(intArray));
+ theMap.put(KEY_INSTANT, new InstantTypeValue(instant));
+
+ theMap.forEach((k, v) -> System.out.println(k + " -> " + v.valueDescription()));
+
+ assertThat(theMap.get(KEY_INT).valueDescription()).isEqualTo("The value is a positive integer: 777");
+ assertThat(theMap.get(KEY_INT_ARRAY).valueDescription()).isEqualTo("The value is an array of 6 integers: [2, 3, 5, 7, 11, 13]");
+ assertThat(theMap.get(KEY_INSTANT).valueDescription()).matches("^The value is an instant: \\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}");
+ }
+}
diff --git a/core-java-modules/core-java-collections-array-list/pom.xml b/core-java-modules/core-java-collections-array-list/pom.xml
index c14e59bac0..6b040739e8 100644
--- a/core-java-modules/core-java-collections-array-list/pom.xml
+++ b/core-java-modules/core-java-collections-array-list/pom.xml
@@ -20,17 +20,6 @@
commons-collections4${commons-collections4.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 4.1
- 3.11.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-2/pom.xml b/core-java-modules/core-java-collections-list-2/pom.xml
index 51e66fc0c2..59ab8c5f27 100644
--- a/core-java-modules/core-java-collections-list-2/pom.xml
+++ b/core-java-modules/core-java-collections-list-2/pom.xml
@@ -20,12 +20,6 @@
commons-collections4${commons-collections4.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.projectlomboklombok
@@ -34,9 +28,4 @@
-
- 4.1
- 3.11.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
index efe79509c1..912204bcc6 100644
--- a/core-java-modules/core-java-collections-list-3/pom.xml
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -20,18 +20,6 @@
commons-collections4${commons-collections4.version}
-
- com.google.guava
- guava
- ${guava.version}
- compile
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- net.sf.trove4jtrove4j
@@ -60,8 +48,6 @@
- 4.1
- 3.11.13.0.28.1.01.2.0
diff --git a/core-java-modules/core-java-collections-list/pom.xml b/core-java-modules/core-java-collections-list/pom.xml
index ae1e1561c6..0cc8828a0d 100644
--- a/core-java-modules/core-java-collections-list/pom.xml
+++ b/core-java-modules/core-java-collections-list/pom.xml
@@ -25,17 +25,6 @@
commons-lang3${commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 4.1
- 3.11.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-2/pom.xml b/core-java-modules/core-java-collections-maps-2/pom.xml
index 772cf30416..36b15c24d5 100644
--- a/core-java-modules/core-java-collections-maps-2/pom.xml
+++ b/core-java-modules/core-java-collections-maps-2/pom.xml
@@ -51,22 +51,14 @@
${avaitility.version}test
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- 0.6.5
- 4.11.7.08.2.00.7.28.1.0
- 3.11.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
index b0c32e1487..2d8b17e5e7 100644
--- a/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
+++ b/core-java-modules/core-java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
@@ -17,22 +17,45 @@ public class MapIteration {
System.out.println("Iterating Keys of Map Using KeySet");
mapIteration.iterateKeys(map);
+ System.out.println("Iterating Values of Map Using values()");
+ mapIteration.iterateValues(map);
+
System.out.println("Iterating Map Using Entry Set");
mapIteration.iterateUsingEntrySet(map);
System.out.println("Iterating Using Iterator and Map Entry");
mapIteration.iterateUsingIteratorAndEntry(map);
+ System.out.println("Iterating Using Iterator and KeySet");
+ mapIteration.iterateUsingIteratorAndKeySet(map);
+
+ System.out.println("Iterating values Using Iterator and values()");
+ mapIteration.iterateUsingIteratorAndValues(map);
+
System.out.println("Iterating Using KeySet and For Each");
mapIteration.iterateUsingKeySetAndForeach(map);
System.out.println("Iterating Map Using Lambda Expression");
mapIteration.iterateUsingLambda(map);
+ System.out.println("Iterating Map By Keys Using Lambda Expression");
+ mapIteration.iterateByKeysUsingLambda(map);
+
+ System.out.println("Iterating values Using Lambda Expression");
+ mapIteration.iterateValuesUsingLambda(map);
+
System.out.println("Iterating Using Stream API");
mapIteration.iterateUsingStreamAPI(map);
}
+ public void iterateUsingIteratorAndValues(Map map) {
+ Iterator iterator = map.values().iterator();
+ while (iterator.hasNext()) {
+ Integer value = iterator.next();
+ System.out.println("value :" + value);
+ }
+ }
+
public void iterateUsingEntrySet(Map map) {
for (Map.Entry entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
@@ -43,6 +66,14 @@ public class MapIteration {
map.forEach((k, v) -> System.out.println((k + ":" + v)));
}
+ public void iterateByKeysUsingLambda(Map map) {
+ map.keySet().forEach(k -> System.out.println((k + ":" + map.get(k))));
+ }
+
+ public void iterateValuesUsingLambda(Map map) {
+ map.values().forEach(v -> System.out.println(("value: " + v)));
+ }
+
public void iterateUsingIteratorAndEntry(Map map) {
Iterator> iterator = map.entrySet()
.iterator();
@@ -52,6 +83,14 @@ public class MapIteration {
}
}
+ public void iterateUsingIteratorAndKeySet(Map map) {
+ Iterator iterator = map.keySet().iterator();
+ while (iterator.hasNext()) {
+ String key = iterator.next();
+ System.out.println(key + ":" + map.get(key));
+ }
+ }
+
public void iterateUsingKeySetAndForeach(Map map) {
for (String key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
@@ -68,7 +107,12 @@ public class MapIteration {
for (String key : map.keySet()) {
System.out.println(key);
}
+ }
+ public void iterateValues(Map map) {
+ for (Integer value : map.values()) {
+ System.out.println(value);
+ }
}
}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-3/pom.xml b/core-java-modules/core-java-collections-maps-3/pom.xml
index c534c1d5ca..a5bb6dc338 100644
--- a/core-java-modules/core-java-collections-maps-3/pom.xml
+++ b/core-java-modules/core-java-collections-maps-3/pom.xml
@@ -20,11 +20,6 @@
jmh-core${jmh-core.version}
-
- com.google.guava
- guava
- ${guava.version}
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-4/README.md b/core-java-modules/core-java-collections-maps-4/README.md
index 54ab60da7d..795f0df702 100644
--- a/core-java-modules/core-java-collections-maps-4/README.md
+++ b/core-java-modules/core-java-collections-maps-4/README.md
@@ -4,3 +4,5 @@ This module contains articles about Map data structures in Java.
### Relevant Articles:
- [Using a Custom Class as a Key in a Java HashMap](https://www.baeldung.com/java-custom-class-map-key)
+- [Nested HashMaps Examples in Java](https://www.baeldung.com/java-nested-hashmaps)
+- [Java HashMap With Different Value Types](https://www.baeldung.com/java-hashmap-different-value-types)
diff --git a/core-java-modules/core-java-collections-maps-4/pom.xml b/core-java-modules/core-java-collections-maps-4/pom.xml
index 1835e3ceac..be467dd57b 100644
--- a/core-java-modules/core-java-collections-maps-4/pom.xml
+++ b/core-java-modules/core-java-collections-maps-4/pom.xml
@@ -1,7 +1,7 @@
+ 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.0core-java-collections-maps-40.1.0-SNAPSHOT
@@ -12,9 +12,17 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../pom.xml
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
@@ -31,4 +39,10 @@
-
+
+ UTF-8
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Address.java b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Address.java
new file mode 100644
index 0000000000..410758405e
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Address.java
@@ -0,0 +1,32 @@
+package com.baeldung.nestedhashmaps;
+
+public class Address {
+
+ private Integer addressId;
+ private String addressLocation;
+
+ public Address() {
+ }
+
+ public Address(Integer addressId, String addressLocation) {
+ this.addressId = addressId;
+ this.addressLocation = addressLocation;
+ }
+
+ public Integer getAddressId() {
+ return addressId;
+ }
+
+ public void setAddressId(Integer addressId) {
+ this.addressId = addressId;
+ }
+
+ public String getAddressLocation() {
+ return addressLocation;
+ }
+
+ public void setAddressLocation(String addressLocation) {
+ this.addressLocation = addressLocation;
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Employee.java b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Employee.java
new file mode 100644
index 0000000000..2ab54ff17c
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/Employee.java
@@ -0,0 +1,43 @@
+package com.baeldung.nestedhashmaps;
+
+public class Employee {
+
+ private Integer employeeId;
+ private Address address;
+ private String employeeName;
+
+ public Employee() {
+ super();
+ }
+
+ public Employee(Integer employeeId, Address address, String employeeName) {
+ this.employeeId = employeeId;
+ this.address = address;
+ this.employeeName = employeeName;
+ }
+
+ public Integer getEmployeeId() {
+ return employeeId;
+ }
+
+ public void setEmployeeId(Integer employeeId) {
+ this.employeeId = employeeId;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public String getEmployeeName() {
+ return employeeName;
+ }
+
+ public void setEmployeeName(String employeeName) {
+ this.employeeName = employeeName;
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/MapsUtil.java b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/MapsUtil.java
new file mode 100644
index 0000000000..53781b0bc1
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/MapsUtil.java
@@ -0,0 +1,57 @@
+package com.baeldung.nestedhashmaps;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+public class MapsUtil {
+
+ MapsUtil() {
+ super();
+ }
+
+ public Map buildInnerMap(List batterList) {
+ Map innerBatterMap = new HashMap();
+
+ int index = 1;
+ for (String item : batterList) {
+ innerBatterMap.put(index, item);
+ index++;
+ }
+
+ return innerBatterMap;
+ }
+
+ public Map> createNestedMapfromStream(List listEmployee) {
+ Map> employeeAddressMap = listEmployee.stream()
+ .collect(Collectors.groupingBy(e -> e.getAddress().getAddressId(),
+ Collectors.toMap(f -> f.getAddress().getAddressLocation(), Employee::getEmployeeName)));
+ return employeeAddressMap;
+ }
+
+ public Map> createNestedObjectMap(List listEmployee) {
+ Map> employeeMap = new HashMap<>();
+
+ employeeMap = listEmployee.stream().collect(Collectors.groupingBy((Employee emp) -> emp.getEmployeeId(),
+ Collectors.toMap((Employee emp) -> emp.getAddress().getAddressId(), fEmpObj -> fEmpObj.getAddress())));
+
+ return employeeMap;
+ }
+
+ public Map flattenMap(Map, ?> source) {
+ Map converted = new HashMap<>();
+
+ for (Entry, ?> entry : source.entrySet()) {
+ if (entry.getValue() instanceof Map) {
+ flattenMap((Map) entry.getValue())
+ .forEach((key, value) -> converted.put(entry.getKey() + "." + key, value));
+ } else {
+ converted.put(entry.getKey().toString(), entry.getValue().toString());
+ }
+ }
+ return converted;
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClass.java b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClass.java
new file mode 100644
index 0000000000..ce63b72527
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-4/src/main/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClass.java
@@ -0,0 +1,118 @@
+package com.baeldung.nestedhashmaps;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+import java.util.List;
+
+public class NestedHashMapExamplesClass {
+ public static void main(String[] args) {
+
+ MapsUtil mUtil = new MapsUtil();
+
+ List batterList = new ArrayList<>();
+ Map> outerBakedGoodsMap = new HashMap<>();
+ Map> outerBakedGoodsMap2 = new HashMap<>();
+ Map> outerBakedGoodsMap3 = new HashMap<>();
+ Map> outerBakedGoodsMap4 = new HashMap<>();
+
+ batterList.add("Mulberry");
+ batterList.add("Cranberry");
+ batterList.add("Blackberry");
+ batterList.add("Mixed fruit");
+ batterList.add("Orange");
+
+ outerBakedGoodsMap.put("Cake", mUtil.buildInnerMap(batterList));
+
+ batterList.clear();
+ batterList.add("Candy");
+ batterList.add("Dark Chocolate");
+ batterList.add("Chocolate");
+ batterList.add("Jam filled");
+ batterList.add("Pineapple");
+
+ outerBakedGoodsMap.put("Donut", mUtil.buildInnerMap(batterList));
+
+ outerBakedGoodsMap2.put("Eclair", mUtil.buildInnerMap(batterList));
+ outerBakedGoodsMap2.put("Donut", mUtil.buildInnerMap(batterList));
+
+ outerBakedGoodsMap3.put("Cake", mUtil.buildInnerMap(batterList));
+ batterList.clear();
+ batterList.add("Banana");
+ batterList.add("Red Velvet");
+ batterList.add("Blackberry");
+ batterList.add("Passion fruit");
+ batterList.add("Kiwi");
+
+ outerBakedGoodsMap3.put("Donut", mUtil.buildInnerMap(batterList));
+
+ outerBakedGoodsMap4.putAll(outerBakedGoodsMap);
+
+ System.out.println(outerBakedGoodsMap.equals(outerBakedGoodsMap2));
+ System.out.println(outerBakedGoodsMap.equals(outerBakedGoodsMap3));
+ System.out.println(outerBakedGoodsMap.equals(outerBakedGoodsMap4));
+
+ outerBakedGoodsMap.get("Cake")
+ .put(6, "Cranberry");
+ System.out.println(outerBakedGoodsMap);
+
+ outerBakedGoodsMap.get("Cake")
+ .remove(5);
+ System.out.println(outerBakedGoodsMap);
+
+ outerBakedGoodsMap.put("Eclair", new HashMap() {
+ {
+ put(1, "Dark Chocolate");
+ }
+ });
+
+ System.out.println(outerBakedGoodsMap);
+ outerBakedGoodsMap.remove("Eclair");
+ System.out.println(outerBakedGoodsMap);
+ System.out.println("Baked Goods Map Flattened: " + mUtil.flattenMap(outerBakedGoodsMap));
+
+ // Employees Map
+ List listEmployee = new ArrayList();
+
+ listEmployee.add(new Employee(1, new Address(124, "Timbuktoo"), "Thorin Oakenshield"));
+ listEmployee.add(new Employee(2, new Address(100, "Misty Lanes"), "Balin"));
+ listEmployee.add(new Employee(3, new Address(156, "Bramles Lane"), "Bofur"));
+ listEmployee.add(new Employee(4, new Address(200, "Bag End"), "Bilbo Baggins"));
+ listEmployee.add(new Employee(5, new Address(23, "Rivendell"), "Elrond"));
+
+ Map> employeeAddressMap = mUtil.createNestedMapfromStream(listEmployee);
+
+ Map> employeeMap = mUtil.createNestedObjectMap(listEmployee);
+ Map> employeeMap2 = mUtil.createNestedObjectMap(listEmployee);
+
+ listEmployee.clear();
+ listEmployee.add(new Employee(1, new Address(500, "Timbuktoo"), "Thorin Oakenshield"));
+ listEmployee.add(new Employee(2, new Address(600, "Misty Lanes"), "Balin"));
+ listEmployee.add(new Employee(3, new Address(700, "Bramles Lane"), "Bofur"));
+ listEmployee.add(new Employee(4, new Address(800, "Bag End"), "Bilbo Baggins"));
+ listEmployee.add(new Employee(5, new Address(900, "Rivendell"), "Elrond"));
+
+ Map> employeeAddressMap1 = mUtil.createNestedMapfromStream(listEmployee);
+
+ Map> employeeMap1 = mUtil.createNestedObjectMap(listEmployee);
+
+ System.out.println(employeeMap.equals(employeeMap1));
+ System.out.println(employeeMap.equals(employeeMap2));
+
+ for (Map.Entry> outerBakedGoodsMapEntrySet : outerBakedGoodsMap.entrySet()) {
+ Map valueMap = outerBakedGoodsMapEntrySet.getValue();
+ System.out.println(valueMap.entrySet());
+ }
+
+ for (Map.Entry> employeeEntrySet : employeeAddressMap.entrySet()) {
+ Map valueMap = employeeEntrySet.getValue();
+ System.out.println(valueMap.entrySet());
+ }
+
+ System.out.println("Employee Address Map Flattened: " + mUtil.flattenMap(employeeAddressMap));
+
+ System.out.println(employeeAddressMap.equals(employeeAddressMap1));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClassUnitTest.java b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClassUnitTest.java
new file mode 100644
index 0000000000..a86e329bea
--- /dev/null
+++ b/core-java-modules/core-java-collections-maps-4/src/test/java/com/baeldung/nestedhashmaps/NestedHashMapExamplesClassUnitTest.java
@@ -0,0 +1,243 @@
+package com.baeldung.nestedhashmaps;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertThat;
+import org.hamcrest.collection.IsMapContaining;
+
+public class NestedHashMapExamplesClassUnitTest {
+ private MapsUtil mUtil = new MapsUtil();
+ private List batterList = new ArrayList<>();
+ private List listEmployee = new ArrayList();
+ private Map> actualBakedGoodsMap = new HashMap<>();
+ private Map> actualEmployeeAddressMap = new HashMap<>();
+ private Map> actualEmployeeMap = new HashMap<>();
+
+ @Test
+ public void whenCreateNestedHashMap_thenNestedMap() {
+ assertThat(mUtil.buildInnerMap(batterList), is(notNullValue()));
+ Assert.assertEquals(actualBakedGoodsMap.keySet().size(), 2);
+ Assert.assertThat(actualBakedGoodsMap, IsMapContaining.hasValue(equalTo(mUtil.buildInnerMap(batterList))));
+ }
+
+ private Map> setup() {
+ Map> expectedMap = new HashMap<>();
+ expectedMap.put(Integer.valueOf(100), new HashMap() {
+ {
+ put("Misty Lanes", "Balin");
+ }
+ });
+ expectedMap.put(Integer.valueOf(200), new HashMap() {
+ {
+ put("Bag End", "Bilbo Baggins");
+ }
+ });
+ expectedMap.put(Integer.valueOf(156), new HashMap() {
+ {
+ put("Brambles Lane", "Bofur");
+ }
+ });
+ expectedMap.put(Integer.valueOf(124), new HashMap() {
+ {
+ put("Timbuktoo", "Thorin Oakenshield");
+ }
+ });
+ expectedMap.put(Integer.valueOf(23), new HashMap() {
+ {
+ put("Rivendell", "Elrond");
+ }
+ });
+
+ return expectedMap;
+ }
+
+ @Test
+ public void whenCreateNestedHashMapwithStreams_thenNestedMap() {
+
+ Map> expectedMap = setup();
+
+ assertThat(actualEmployeeAddressMap, equalTo(expectedMap));
+ }
+
+ @Test
+ public void whenCompareTwoHashMapswithDifferenctValues_usingEquals_thenFail() {
+ Map> outerBakedGoodsMap2 = new HashMap<>();
+ outerBakedGoodsMap2.put("Eclair", mUtil.buildInnerMap(batterList));
+ outerBakedGoodsMap2.put("Donut", mUtil.buildInnerMap(batterList));
+ assertNotEquals(outerBakedGoodsMap2, actualBakedGoodsMap);
+
+ Map> outerBakedGoodsMap3 = new HashMap>();
+ outerBakedGoodsMap3.put("Cake", mUtil.buildInnerMap(batterList));
+ batterList = new ArrayList<>();
+ batterList = Arrays.asList("Banana", "Red Velvet", "Blackberry", "Passion fruit", "Kiwi");
+
+ outerBakedGoodsMap3.put("Donut", mUtil.buildInnerMap(batterList));
+
+ assertNotEquals(outerBakedGoodsMap2, actualBakedGoodsMap);
+
+ listEmployee.clear();
+ listEmployee.add(new Employee(1, new Address(500, "Timbuktoo"), "Thorin Oakenshield"));
+ listEmployee.add(new Employee(2, new Address(600, "Misty Lanes"), "Balin"));
+ listEmployee.add(new Employee(3, new Address(700, "Bramles Lane"), "Bofur"));
+ listEmployee.add(new Employee(4, new Address(800, "Bag End"), "Bilbo Baggins"));
+ listEmployee.add(new Employee(5, new Address(900, "Rivendell"), "Elrond"));
+
+ Map> employeeAddressMap1 = mUtil.createNestedMapfromStream(listEmployee);
+
+ Map> employeeMap1 = mUtil.createNestedObjectMap(listEmployee);
+
+ assertNotEquals(employeeAddressMap1, actualEmployeeAddressMap);
+
+ assertNotEquals(employeeMap1, actualEmployeeMap);
+ }
+
+ @Test
+ public void whencomparingDifferentObjectValuesUsingEquals_thenFail() {
+ listEmployee.clear();
+ listEmployee.add(new Employee(1, new Address(124, "Timbuktoo"), "Thorin Oakenshield"));
+ listEmployee.add(new Employee(2, new Address(100, "Misty Lanes"), "Balin"));
+ listEmployee.add(new Employee(3, new Address(156, "Brambles Lane"), "Bofur"));
+ listEmployee.add(new Employee(4, new Address(200, "Bag End"), "Bilbo Baggins"));
+ listEmployee.add(new Employee(5, new Address(23, "Rivendell"), "Elrond"));
+
+ Map> employeeMap1 = listEmployee.stream().collect(Collectors.groupingBy(
+ (Employee emp) -> emp.getEmployeeId(),
+ Collectors.toMap((Employee emp) -> emp.getAddress().getAddressId(), fEmpObj -> fEmpObj.getAddress())));
+
+ assertNotSame(employeeMap1, actualEmployeeMap);
+ assertNotEquals(employeeMap1, actualEmployeeMap);
+
+ Map> expectedMap = setupAddressObjectMap();
+ assertNotSame(expectedMap, actualEmployeeMap);
+ assertNotEquals(expectedMap, actualEmployeeMap);
+
+ }
+
+ @Test
+ public void whenCompareTwoHashMapsUsingEquals_thenSuccess() {
+ Map> outerBakedGoodsMap4 = new HashMap<>();
+ outerBakedGoodsMap4.putAll(actualBakedGoodsMap);
+
+ assertEquals(actualBakedGoodsMap, outerBakedGoodsMap4);
+
+ Map> employeeMap1 = new HashMap<>();
+ employeeMap1.putAll(actualEmployeeMap);
+ assertEquals(actualEmployeeMap, employeeMap1);
+ }
+
+ @Test
+ public void whenAddElementinHashMaps_thenSuccess() {
+ assertEquals(actualBakedGoodsMap.get("Cake").size(), 5);
+ actualBakedGoodsMap.get("Cake").put(6, "Cranberry");
+ assertEquals(actualBakedGoodsMap.get("Cake").size(), 6);
+ }
+
+ @Test
+ public void whenDeleteElementinHashMaps_thenSuccess() {
+ assertNotEquals(actualBakedGoodsMap.get("Cake").get(5), null);
+ actualBakedGoodsMap.get("Cake").remove(5);
+ assertEquals(actualBakedGoodsMap.get("Cake").get(5), null);
+
+ actualBakedGoodsMap.put("Eclair", new HashMap() {
+ {
+ put(1, "Dark Chocolate");
+ }
+ });
+
+ assertNotEquals(actualBakedGoodsMap.get("Eclair").get(1), null);
+ actualBakedGoodsMap.get("Eclair").remove(1);
+ assertEquals(actualBakedGoodsMap.get("Eclair").get(1), null);
+
+ actualBakedGoodsMap.put("Eclair", new HashMap() {
+ {
+ put(1, "Dark Chocolate");
+ }
+ });
+
+ assertNotEquals(actualBakedGoodsMap.get("Eclair"), null);
+ actualBakedGoodsMap.remove("Eclair");
+ assertEquals(actualBakedGoodsMap.get("Eclair"), null);
+ }
+
+ @Test
+ public void whenFlattenMap_thenRemovesNesting() {
+
+ Map flattenedBakedGoodsMap = mUtil.flattenMap(actualBakedGoodsMap);
+ assertThat(flattenedBakedGoodsMap, IsMapContaining.hasKey("Donut.2"));
+
+ Map flattenedEmployeeAddressMap = mUtil.flattenMap(actualEmployeeAddressMap);
+ assertThat(flattenedEmployeeAddressMap, IsMapContaining.hasKey("200.Bag End"));
+ }
+
+ @Before
+ public void buildMaps() {
+
+ batterList = Arrays.asList("Mulberry", "Cranberry", "Blackberry", "Mixed fruit", "Orange");
+
+ actualBakedGoodsMap.put("Cake", mUtil.buildInnerMap(batterList));
+
+ batterList = new ArrayList<>();
+ batterList = Arrays.asList("Candy", "Dark Chocolate", "Chocolate", "Jam filled", "Pineapple");
+
+ actualBakedGoodsMap.put("Donut", mUtil.buildInnerMap(batterList));
+
+ listEmployee.add(new Employee(1, new Address(124, "Timbuktoo"), "Thorin Oakenshield"));
+ listEmployee.add(new Employee(2, new Address(100, "Misty Lanes"), "Balin"));
+ listEmployee.add(new Employee(3, new Address(156, "Brambles Lane"), "Bofur"));
+ listEmployee.add(new Employee(4, new Address(200, "Bag End"), "Bilbo Baggins"));
+ listEmployee.add(new Employee(5, new Address(23, "Rivendell"), "Elrond"));
+
+ actualEmployeeAddressMap = mUtil.createNestedMapfromStream(listEmployee);
+
+ actualEmployeeMap = mUtil.createNestedObjectMap(listEmployee);
+
+ }
+
+ private Map> setupAddressObjectMap() {
+
+ Map> expectedMap = new HashMap<>();
+
+ expectedMap.put(1, new HashMap() {
+ {
+ put(124, new Address(124, "Timbuktoo"));
+ }
+ });
+ expectedMap.put(2, new HashMap() {
+ {
+ put(100, new Address(100, "Misty Lanes"));
+ }
+ });
+ expectedMap.put(3, new HashMap() {
+ {
+ put(156, new Address(156, "Brambles Lane"));
+ }
+ });
+ expectedMap.put(4, new HashMap() {
+ {
+ put(200, new Address(200, "Bag End"));
+ }
+ });
+ expectedMap.put(5, new HashMap() {
+ {
+ put(23, new Address(23, "Rivendell"));
+ }
+ });
+ return expectedMap;
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-maps/pom.xml b/core-java-modules/core-java-collections-maps/pom.xml
index 245c4b04bb..34b878df53 100644
--- a/core-java-modules/core-java-collections-maps/pom.xml
+++ b/core-java-modules/core-java-collections-maps/pom.xml
@@ -20,17 +20,6 @@
commons-collections4${commons-collections4.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 4.1
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-set/pom.xml b/core-java-modules/core-java-collections-set/pom.xml
index b8940f4a68..0b6e324c78 100644
--- a/core-java-modules/core-java-collections-set/pom.xml
+++ b/core-java-modules/core-java-collections-set/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -50,7 +49,6 @@
1111
- 4.32.8.5
diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md
index 12e3c5ac17..574f61ac6a 100644
--- a/core-java-modules/core-java-collections/README.md
+++ b/core-java-modules/core-java-collections/README.md
@@ -12,4 +12,5 @@ This module contains articles about Java collections
- [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack)
- [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue)
- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
-- [[More -->]](/core-java-modules/core-java-collections-2)
+- [Convert an Array of Primitives to a List](https://www.baeldung.com/java-primitive-array-to-list)
+- More articles: [[next -->]](/core-java-modules/core-java-collections-2)
diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml
index 8fbc6e8de7..eab7a35584 100644
--- a/core-java-modules/core-java-collections/pom.xml
+++ b/core-java-modules/core-java-collections/pom.xml
@@ -15,12 +15,6 @@
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.openjdk.jmhjmh-core
@@ -31,10 +25,11 @@
jmh-generator-annprocess${jmh-generator.version}
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
-
- 3.11.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java b/core-java-modules/core-java-collections/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java
similarity index 95%
rename from core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java
rename to core-java-modules/core-java-collections/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java
index f7be99abdc..1e6efb7840 100644
--- a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java
+++ b/core-java-modules/core-java-collections/src/main/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToList.java
@@ -1,13 +1,15 @@
-package com.baeldung.collections.iterators;
+package com.baeldung.collections.convertarrayprimitives;
-import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-import com.google.common.primitives.Ints;
+
import org.apache.commons.lang3.ArrayUtils;
+import com.google.common.primitives.Ints;
+
public class ConvertPrimitivesArrayToList {
public static void failConvert() {
diff --git a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java
similarity index 87%
rename from core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java
index b773baf7d8..f9f5f8ea91 100644
--- a/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/collections/convertarrayprimitives/ConvertPrimitivesArrayToListUnitTest.java
@@ -1,14 +1,11 @@
-package com.baeldung.collections.iterators;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.stream.Collectors;
-import com.google.common.primitives.Ints;
-import org.junit.Test;
+package com.baeldung.collections.convertarrayprimitives;
import static org.junit.Assert.assertEquals;
+import java.util.Arrays;
+
+import org.junit.Test;
+
public class ConvertPrimitivesArrayToListUnitTest {
@Test
diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml
index 5196872e21..c61f28a6b3 100644
--- a/core-java-modules/core-java-concurrency-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-2/pom.xml
@@ -15,12 +15,6 @@
-
- junit
- junit
- ${junit.version}
- test
- com.googlecode.thread-weaverthreadweaver
@@ -32,6 +26,12 @@
tempus-fugit${tempus-fugit.version}test
+
+
+ junit
+ junit
+
+ com.googlecode.multithreadedtc
@@ -96,7 +96,6 @@
- 4.130.21.11.01
diff --git a/core-java-modules/core-java-concurrency-advanced-2/pom.xml b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
index 93c23ccae7..1f19dc8cca 100644
--- a/core-java-modules/core-java-concurrency-advanced-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
@@ -30,12 +30,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -48,8 +42,4 @@
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-advanced-3/pom.xml b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
index 915aa8d912..49a72112b4 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
@@ -15,12 +15,6 @@
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.jcabijcabi-aspects
@@ -32,11 +26,6 @@
${aspectjrt.version}runtime
-
- com.google.guava
- guava
- ${guava.version}
- org.cactooscactoos
@@ -94,12 +83,10 @@
- 3.14.01.81.80.22.61.9.5
- 28.2-jre0.431.2.30.14.1
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/abaproblem/Account.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/abaproblem/Account.java
index ee1bdcd55b..2af3113549 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/abaproblem/Account.java
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/abaproblem/Account.java
@@ -3,17 +3,18 @@ package com.baeldung.abaproblem;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
+
public class Account {
- private AtomicInteger balance;
- private AtomicInteger transactionCount;
- private ThreadLocal currentThreadCASFailureCount;
+ private final AtomicInteger balance;
+ private final AtomicInteger transactionCount;
+ private final ThreadLocal currentThreadCASFailureCount;
public Account() {
this.balance = new AtomicInteger(0);
this.transactionCount = new AtomicInteger(0);
- this.currentThreadCASFailureCount = new ThreadLocal<>();
- this.currentThreadCASFailureCount.set(0);
+ this.currentThreadCASFailureCount = ThreadLocal.withInitial(() -> 0);
}
public int getBalance() {
@@ -43,11 +44,7 @@ public class Account {
private void maybeWait() {
if ("thread1".equals(Thread.currentThread().getName())) {
- try {
- TimeUnit.SECONDS.sleep(2);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
+ sleepUninterruptibly(2, TimeUnit.SECONDS);
}
}
diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java
index aa5f0f7997..3e188d682e 100644
--- a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/abaproblem/AccountUnitTest.java
@@ -1,8 +1,13 @@
package com.baeldung.abaproblem;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -30,45 +35,39 @@ public class AccountUnitTest {
assertTrue(account.deposit(moneyToDeposit));
assertEquals(moneyToDeposit, account.getBalance());
+ assertEquals(1, account.getTransactionCount());
}
@Test
- public void withdrawTest() throws InterruptedException {
+ public void withdrawTest() {
final int defaultBalance = 50;
final int moneyToWithdraw = 20;
account.deposit(defaultBalance);
assertTrue(account.withdraw(moneyToWithdraw));
-
assertEquals(defaultBalance - moneyToWithdraw, account.getBalance());
}
@Test
- public void abaProblemTest() throws InterruptedException {
+ public void abaProblemTest() throws Exception {
final int defaultBalance = 50;
final int amountToWithdrawByThread1 = 20;
final int amountToWithdrawByThread2 = 10;
final int amountToDepositByThread2 = 10;
- assertEquals(0, account.getTransactionCount());
- assertEquals(0, account.getCurrentThreadCASFailureCount());
account.deposit(defaultBalance);
- assertEquals(1, account.getTransactionCount());
-
- Thread thread1 = new Thread(() -> {
+ Runnable thread1 = () -> {
// this will take longer due to the name of the thread
assertTrue(account.withdraw(amountToWithdrawByThread1));
// thread 1 fails to capture ABA problem
assertNotEquals(1, account.getCurrentThreadCASFailureCount());
+ };
- }, "thread1");
-
- Thread thread2 = new Thread(() -> {
-
+ Runnable thread2 = () -> {
assertTrue(account.deposit(amountToDepositByThread2));
assertEquals(defaultBalance + amountToDepositByThread2, account.getBalance());
@@ -79,12 +78,13 @@ public class AccountUnitTest {
assertEquals(defaultBalance, account.getBalance());
assertEquals(0, account.getCurrentThreadCASFailureCount());
- }, "thread2");
+ };
- thread1.start();
- thread2.start();
- thread1.join();
- thread2.join();
+ Future> future1 = getSingleThreadExecutorService("thread1").submit(thread1);
+ Future> future2 = getSingleThreadExecutorService("thread2").submit(thread2);
+
+ future1.get();
+ future2.get();
// compareAndSet operation succeeds for thread 1
assertEquals(defaultBalance - amountToWithdrawByThread1, account.getBalance());
@@ -95,4 +95,10 @@ public class AccountUnitTest {
// thread 2 did two modifications as well
assertEquals(4, account.getTransactionCount());
}
+
+ private static ExecutorService getSingleThreadExecutorService(String threadName) {
+ return Executors.newSingleThreadExecutor(
+ new ThreadFactoryBuilder().setNameFormat(threadName).build()
+ );
+ }
}
diff --git a/core-java-modules/core-java-concurrency-advanced-4/README.md b/core-java-modules/core-java-concurrency-advanced-4/README.md
index db856a2cd6..446a553b88 100644
--- a/core-java-modules/core-java-concurrency-advanced-4/README.md
+++ b/core-java-modules/core-java-concurrency-advanced-4/README.md
@@ -3,3 +3,4 @@
- [Binary Semaphore vs Reentrant Lock](https://www.baeldung.com/java-binary-semaphore-vs-reentrant-lock)
- [Bad Practices With Synchronization](https://www.baeldung.com/java-synchronization-bad-practices)
- [Start Two Threads at the Exact Same Time in Java](https://www.baeldung.com/java-start-two-threads-at-same-time)
+- [Volatile Variables and Thread Safety](https://www.baeldung.com/java-volatile-variables-thread-safety)
diff --git a/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/volatilekeywordthreadsafety/VolatileVarNotThreadSafe.java b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/volatilekeywordthreadsafety/VolatileVarNotThreadSafe.java
new file mode 100644
index 0000000000..cf9b7fd20b
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-4/src/main/java/com/baeldung/volatilekeywordthreadsafety/VolatileVarNotThreadSafe.java
@@ -0,0 +1,47 @@
+package com.baeldung.volatilekeywordthreadsafety;
+
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+
+public class VolatileVarNotThreadSafe {
+
+ private static final Logger LOG = LoggerFactory.getLogger(VolatileVarNotThreadSafe.class);
+ private static volatile int count = 0;
+ private static final int MAX_LIMIT = 1000;
+
+ public static void increment() {
+ count++;
+ }
+
+ public static int getCount() {
+ return count;
+ }
+
+ public static void main(String[] args) throws InterruptedException {
+ Thread t1 = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ for(int index=0; index 0);
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced/pom.xml b/core-java-modules/core-java-concurrency-advanced/pom.xml
index 3c21b49ae5..3c726e1284 100644
--- a/core-java-modules/core-java-concurrency-advanced/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced/pom.xml
@@ -35,12 +35,6 @@
commons-math3${commons-math3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.jayway.awaitilityawaitility
@@ -60,13 +54,8 @@
-
- 21.03.6.1
- 4.14.01
-
- 3.6.11.7.0
diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md
index d2ff75ca95..1dad941e57 100644
--- a/core-java-modules/core-java-concurrency-basic-2/README.md
+++ b/core-java-modules/core-java-concurrency-basic-2/README.md
@@ -14,4 +14,5 @@ This module contains articles about basic Java concurrency
- [How to Stop Execution After a Certain Time in Java](https://www.baeldung.com/java-stop-execution-after-certain-time)
- [How to Handle InterruptedException in Java](https://www.baeldung.com/java-interrupted-exception)
- [How to Get the Number of Threads in a Java Process](https://www.baeldung.com/java-get-number-of-threads)
+- [Set the Name of a Thread in Java](https://www.baeldung.com/java-set-thread-name)
- [[<-- Prev]](/core-java-modules/core-java-concurrency-basic)
diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
index 9d76c1fcd1..533f4e111d 100644
--- a/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
+++ b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
@@ -17,9 +17,10 @@ public class Data {
}
}
transfer = true;
-
+
+ String returnPacket = packet;
notifyAll();
- return packet;
+ return returnPacket;
}
public synchronized void send(String packet) {
diff --git a/core-java-modules/core-java-concurrency-basic/pom.xml b/core-java-modules/core-java-concurrency-basic/pom.xml
index 7212a2dcb1..1e3157291a 100644
--- a/core-java-modules/core-java-concurrency-basic/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic/pom.xml
@@ -20,12 +20,6 @@
commons-lang3${commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.jayway.awaitilityawaitility
@@ -45,8 +39,6 @@
-
- 3.6.11.7.0
diff --git a/core-java-modules/core-java-concurrency-collections-2/pom.xml b/core-java-modules/core-java-concurrency-collections-2/pom.xml
index 8de0e1bef7..9a95662fae 100644
--- a/core-java-modules/core-java-concurrency-collections-2/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections-2/pom.xml
@@ -14,11 +14,6 @@
-
- com.google.guava
- guava
- ${guava.version}
- org.openjdk.jmhjmh-core
@@ -29,18 +24,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 28.2-jre
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashset/ConcurrentHashSetUnitTest.java b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashset/ConcurrentHashSetUnitTest.java
new file mode 100644
index 0000000000..f14a139a02
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-collections-2/src/test/java/com/baeldung/concurrenthashset/ConcurrentHashSetUnitTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.concurrenthashset;
+
+import static java.util.Arrays.asList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+import org.junit.jupiter.api.Test;
+
+public class ConcurrentHashSetUnitTest {
+
+ @Test
+ public void whenCreateConcurrentHashSetWithStaticMethod_thenSetIsCreated() {
+ // when
+ Set threadSafeUniqueNumbers = ConcurrentHashMap.newKeySet();
+ threadSafeUniqueNumbers.add(23);
+ threadSafeUniqueNumbers.add(45);
+
+ //then
+ assertTrue(threadSafeUniqueNumbers.stream()
+ .anyMatch(entry -> entry.equals(23)));
+ assertTrue(threadSafeUniqueNumbers.stream()
+ .anyMatch(entry -> entry.equals(45)));
+ }
+
+ @Test
+ public void whenCreateConcurrentHashSetWithKeySetMethod_thenSetIsSyncedWithMapped() {
+ // when
+ ConcurrentHashMap numbersMap = new ConcurrentHashMap<>();
+ Set numbersSet = numbersMap.keySet();
+
+ numbersMap.put(1, "One");
+ numbersMap.put(2, "Two");
+ numbersMap.put(3, "Three");
+
+ System.out.println("Map before remove: " + numbersMap);
+ System.out.println("Set before remove: " + numbersSet);
+
+ numbersSet.remove(2);
+
+ System.out.println("Set after remove: " + numbersSet);
+ System.out.println("Map after remove: " + numbersMap);
+
+ //then
+ assertNull(numbersMap.get(2));
+ }
+
+ @Test
+ public void whenCreateConcurrentHashSetWithKeySetMethodDefaultValue_thenSetIsSyncedWithMapped() {
+ // when
+ ConcurrentHashMap numbersMap = new ConcurrentHashMap<>();
+ Set numbersSet = numbersMap.keySet("SET-ENTRY");
+
+ numbersMap.put(1, "One");
+ numbersMap.put(2, "Two");
+ numbersMap.put(3, "Three");
+
+ System.out.println("Map before add: " + numbersMap);
+ System.out.println("Set before add: " + numbersSet);
+
+ numbersSet.addAll(asList(4, 5));
+
+ System.out.println("Map after add: " + numbersMap);
+ System.out.println("Set after add: " + numbersSet);
+
+ //then
+ assertEquals("One", numbersMap.get(1));
+ assertEquals("SET-ENTRY", numbersMap.get(4));
+ assertEquals("SET-ENTRY", numbersMap.get(5));
+ }
+
+ @Test
+ public void whenSynchronizedSetIsCreated_thenSetIsCreated() {
+ // when
+ Set syncNumbers = Collections.synchronizedSet(new HashSet<>());
+ syncNumbers.add(1);
+
+ //then
+ assertTrue(syncNumbers.stream()
+ .anyMatch(entry -> entry.equals(1)));
+ }
+
+ @Test
+ public void whenCopyOnWriteArraySetIsCreated_thenSetIsCreated() {
+ // when
+ Set copyOnArraySet = new CopyOnWriteArraySet<>();
+ copyOnArraySet.add(1);
+
+ //then
+ assertTrue(copyOnArraySet.stream()
+ .anyMatch(entry -> entry.equals(1)));
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-collections/pom.xml b/core-java-modules/core-java-concurrency-collections/pom.xml
index f22da1c848..8b8d2fe03b 100644
--- a/core-java-modules/core-java-concurrency-collections/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections/pom.xml
@@ -14,15 +14,6 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
core-java-concurrency-collections
@@ -33,9 +24,4 @@
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-date-operations-1/pom.xml b/core-java-modules/core-java-date-operations-1/pom.xml
index 7b7c68d1b6..ea9f94fa56 100644
--- a/core-java-modules/core-java-date-operations-1/pom.xml
+++ b/core-java-modules/core-java-date-operations-1/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -26,16 +25,11 @@
commons-lang3${commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
+
com.darwinsyshirondelle-date4j
- RELEASE
+ ${hirondelle-date4j.version}test
@@ -63,8 +57,7 @@
2.10
-
- 3.6.1
+ RELEASE1.91.9
diff --git a/core-java-modules/core-java-date-operations-2/pom.xml b/core-java-modules/core-java-date-operations-2/pom.xml
index 1d283851ca..f60c7b7fc0 100644
--- a/core-java-modules/core-java-date-operations-2/pom.xml
+++ b/core-java-modules/core-java-date-operations-2/pom.xml
@@ -30,18 +30,11 @@
hirondelle-date4j${hirondelle-date4j.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- 2.101.5.1
- 3.14.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml
index 8f082e2793..3ff26323df 100644
--- a/core-java-modules/core-java-datetime-conversion/pom.xml
+++ b/core-java-modules/core-java-datetime-conversion/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -31,13 +30,6 @@
log4j${log4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -63,8 +55,6 @@
2.10
-
- 3.6.11.91.9
diff --git a/core-java-modules/core-java-datetime-string/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml
index f50eb2ae5e..2b3c2edb02 100644
--- a/core-java-modules/core-java-datetime-string/pom.xml
+++ b/core-java-modules/core-java-datetime-string/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -32,13 +31,6 @@
log4j${log4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- joda-timejoda-time
@@ -47,7 +39,7 @@
com.darwinsyshirondelle-date4j
- RELEASE
+ ${hirondelle-date4j.version}test
@@ -76,8 +68,7 @@
1.62.10.10
-
- 3.6.1
+ RELEASE1.91.9
diff --git a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
index b1c88cb44c..172882af2c 100644
--- a/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
@@ -12,6 +12,7 @@ import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit;
+import java.time.temporal.UnsupportedTemporalTypeException;
import java.util.Locale;
import java.util.TimeZone;
@@ -159,4 +160,35 @@ public class DateTimeFormatterUnitTest {
DateTimeFormatter zonedFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm z");
ZonedDateTime.from(zonedFormatter.parse("31.07.2016 14:15"));
}
+
+ @Test
+ public void shouldPrintFormattedZonedDateTime() {
+ ZonedDateTime zonedDateTime = ZonedDateTime.of(2021, 02, 15, 0, 0, 0, 0, ZoneId.of("Europe/Paris"));
+ String formattedZonedDateTime = DateTimeFormatter.ISO_INSTANT.format(zonedDateTime);
+
+ Assert.assertEquals("2021-02-14T23:00:00Z", formattedZonedDateTime);
+ }
+
+ @Test(expected = UnsupportedTemporalTypeException.class)
+ public void shouldExpectAnExceptionIfInputIsLocalDateTime() {
+ DateTimeFormatter.ISO_INSTANT.format(LocalDate.now());
+ }
+
+ @Test
+ public void shouldParseZonedDateTime() {
+ DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT.withZone(ZoneId.systemDefault());
+ ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-10-01T05:06:20Z", formatter);
+
+ Assert.assertEquals("2021-10-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT.format(zonedDateTime));
+ }
+
+ @Test(expected = DateTimeParseException.class)
+ public void shouldExpectAnExceptionIfTimeZoneIsMissing() {
+ ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-11-01T05:06:20Z", DateTimeFormatter.ISO_INSTANT);
+ }
+
+ @Test(expected = DateTimeParseException.class)
+ public void shouldExpectAnExceptionIfSecondIsMissing() {
+ ZonedDateTime zonedDateTime = ZonedDateTime.parse("2021-12-02T08:06Z", DateTimeFormatter.ISO_INSTANT);
+ }
}
diff --git a/core-java-modules/core-java-exceptions-2/pom.xml b/core-java-modules/core-java-exceptions-2/pom.xml
index af7a778b23..9103672cd4 100644
--- a/core-java-modules/core-java-exceptions-2/pom.xml
+++ b/core-java-modules/core-java-exceptions-2/pom.xml
@@ -15,24 +15,11 @@
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- org.apache.commonscommons-lang3
- ${commons.lang3.version}
+ ${commons-lang3.version}
-
- 3.10
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/README.md b/core-java-modules/core-java-exceptions-3/README.md
index f79eb41a8b..d269444ccb 100644
--- a/core-java-modules/core-java-exceptions-3/README.md
+++ b/core-java-modules/core-java-exceptions-3/README.md
@@ -9,3 +9,4 @@
- [Explanation of ClassCastException in Java](https://www.baeldung.com/java-classcastexception)
- [NoSuchFieldError in Java](https://www.baeldung.com/java-nosuchfielderror)
- [IllegalAccessError in Java](https://www.baeldung.com/java-illegalaccesserror)
+- [Working with (Unknown Source) Stack Traces in Java](https://www.baeldung.com/java-unknown-source-stack-trace)
diff --git a/core-java-modules/core-java-exceptions-3/pom.xml b/core-java-modules/core-java-exceptions-3/pom.xml
index bdee998e8d..455f769757 100644
--- a/core-java-modules/core-java-exceptions-3/pom.xml
+++ b/core-java-modules/core-java-exceptions-3/pom.xml
@@ -19,21 +19,29 @@
com.h2databaseh2
- 1.4.191
- test
-
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
+ ${h2.version}test
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+
+
+
+
+
+
+
-
- 3.10.0
+ 1.4.191
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedReceiver.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedReceiver.java
index ff6b926cdc..8b0aa95153 100644
--- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedReceiver.java
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedReceiver.java
@@ -4,7 +4,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SynchronizedReceiver implements Runnable {
- private static Logger log = LoggerFactory.getLogger(SynchronizedReceiver.class);
+
+ private static final Logger LOG = LoggerFactory.getLogger(SynchronizedReceiver.class);
+
private final Data data;
private String message;
private boolean illegalMonitorStateExceptionOccurred;
@@ -20,10 +22,10 @@ public class SynchronizedReceiver implements Runnable {
data.wait();
this.message = data.receive();
} catch (InterruptedException e) {
- log.error("thread was interrupted", e);
+ LOG.error("thread was interrupted", e);
Thread.currentThread().interrupt();
} catch (IllegalMonitorStateException e) {
- log.error("illegal monitor state exception occurred", e);
+ LOG.error("illegal monitor state exception occurred", e);
illegalMonitorStateExceptionOccurred = true;
}
}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedSender.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedSender.java
index 1618bc8efa..8317b5ade7 100644
--- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedSender.java
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/SynchronizedSender.java
@@ -4,7 +4,9 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SynchronizedSender implements Runnable {
- private static Logger log = LoggerFactory.getLogger(SynchronizedSender.class);
+
+ private static final Logger LOG = LoggerFactory.getLogger(SynchronizedSender.class);
+
private final Data data;
private boolean illegalMonitorStateExceptionOccurred;
@@ -22,10 +24,10 @@ public class SynchronizedSender implements Runnable {
data.notifyAll();
} catch (InterruptedException e) {
- log.error("thread was interrupted", e);
+ LOG.error("thread was interrupted", e);
Thread.currentThread().interrupt();
} catch (IllegalMonitorStateException e) {
- log.error("illegal monitor state exception occurred", e);
+ LOG.error("illegal monitor state exception occurred", e);
illegalMonitorStateExceptionOccurred = true;
}
}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedReceiver.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedReceiver.java
index 3a0b72e6cd..69fb363731 100644
--- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedReceiver.java
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedReceiver.java
@@ -4,7 +4,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UnsynchronizedReceiver implements Runnable {
- private static Logger log = LoggerFactory.getLogger(UnsynchronizedReceiver.class);
+ private static final Logger LOG = LoggerFactory.getLogger(UnsynchronizedReceiver.class);
+
private final Data data;
private String message;
private boolean illegalMonitorStateExceptionOccurred;
@@ -19,10 +20,10 @@ public class UnsynchronizedReceiver implements Runnable {
data.wait();
this.message = data.receive();
} catch (InterruptedException e) {
- log.error("thread was interrupted", e);
+ LOG.error("thread was interrupted", e);
Thread.currentThread().interrupt();
} catch (IllegalMonitorStateException e) {
- log.error("illegal monitor state exception occurred", e);
+ LOG.error("illegal monitor state exception occurred", e);
illegalMonitorStateExceptionOccurred = true;
}
}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedSender.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedSender.java
index 7f15418bfa..b97453f655 100644
--- a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedSender.java
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/exceptions/illegalmonitorstate/UnsynchronizedSender.java
@@ -4,7 +4,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UnsynchronizedSender implements Runnable {
- private static Logger log = LoggerFactory.getLogger(UnsynchronizedSender.class);
+ private static final Logger LOG = LoggerFactory.getLogger(UnsynchronizedSender.class);
+
private final Data data;
private boolean illegalMonitorStateExceptionOccurred;
@@ -21,10 +22,10 @@ public class UnsynchronizedSender implements Runnable {
data.notifyAll();
} catch (InterruptedException e) {
- log.error("thread was interrupted", e);
+ LOG.error("thread was interrupted", e);
Thread.currentThread().interrupt();
} catch (IllegalMonitorStateException e) {
- log.error("illegal monitor state exception occurred", e);
+ LOG.error("illegal monitor state exception occurred", e);
illegalMonitorStateExceptionOccurred = true;
}
}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/Main.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/Main.java
new file mode 100644
index 0000000000..0806a4bf80
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/Main.java
@@ -0,0 +1,25 @@
+package com.baeldung.unknownsourcestacktrace;
+
+import com.baeldung.unknownsourcestacktrace.dto.User;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Main {
+ private static final Logger logger = LoggerFactory.getLogger(Main.class);
+ private static final int SHORT_NAME_LIMIT = 10;
+
+ public static void main(String[] args) {
+ User user = new User();
+ user.setName("Tom");
+
+ logger.info(getGreetingMessage(user.getName()));
+ }
+
+ private static String getGreetingMessage(String name) {
+ return "Welcome " + getShortenedName(name) + "!";
+ }
+
+ private static String getShortenedName(String name) {
+ return name.substring(0, SHORT_NAME_LIMIT);
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/dto/User.java b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/dto/User.java
new file mode 100644
index 0000000000..997631ea46
--- /dev/null
+++ b/core-java-modules/core-java-exceptions-3/src/main/java/com/baeldung/unknownsourcestacktrace/dto/User.java
@@ -0,0 +1,13 @@
+package com.baeldung.unknownsourcestacktrace.dto;
+
+public class User {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java
index 82c00bc72f..857ab02c13 100644
--- a/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java
+++ b/core-java-modules/core-java-exceptions-3/src/test/java/com/baeldung/exceptions/illegalmonitorstate/IllegalMonitorStateExceptionUnitTest.java
@@ -1,8 +1,11 @@
package com.baeldung.exceptions.illegalmonitorstate;
-import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Test;
public class IllegalMonitorStateExceptionUnitTest {
@@ -18,10 +21,9 @@ public class IllegalMonitorStateExceptionUnitTest {
Thread senderThread = new Thread(sender, "sender-thread");
senderThread.start();
- senderThread.join(1000);
- receiverThread.join(1000);
-
- Thread.sleep(2000);
+ // we need to wait for the sender and receiver threads to finish
+ senderThread.join(10_000);
+ receiverThread.join(10_000);
assertEquals("test", receiver.getMessage());
assertFalse(sender.hasIllegalMonitorStateExceptionOccurred());
diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml
index 1f15dabe36..f1f60120a5 100644
--- a/core-java-modules/core-java-exceptions/pom.xml
+++ b/core-java-modules/core-java-exceptions/pom.xml
@@ -30,22 +30,12 @@
org.apache.commonscommons-lang3
- ${commons.lang3.version}
-
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
+ ${commons-lang3.version}1.5.0-b01
- 3.10
-
- 3.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml
index cc44ba5a7c..a3add5a686 100644
--- a/core-java-modules/core-java-function/pom.xml
+++ b/core-java-modules/core-java-function/pom.xml
@@ -14,16 +14,6 @@
0.0.1-SNAPSHOT
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
core-java-function
@@ -34,9 +24,4 @@
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml
index 924248f4f9..b5f43d5a94 100644
--- a/core-java-modules/core-java-io-2/pom.xml
+++ b/core-java-modules/core-java-io-2/pom.xml
@@ -15,12 +15,6 @@
-
-
- com.google.guava
- guava
- ${guava.version}
- commons-io
@@ -38,13 +32,6 @@
log4j-over-slf4j${org.slf4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.github.tomakehurst
@@ -76,7 +63,6 @@
- 3.6.13.0.0-M12.26.3
diff --git a/core-java-modules/core-java-io-3/README.md b/core-java-modules/core-java-io-3/README.md
index d0ac5387a8..312797cb94 100644
--- a/core-java-modules/core-java-io-3/README.md
+++ b/core-java-modules/core-java-io-3/README.md
@@ -14,4 +14,4 @@ This module contains articles about core Java input and output (IO)
- [Find the Last Modified File in a Directory with Java](https://www.baeldung.com/java-last-modified-file)
- [Get a Filename Without the Extension in Java](https://www.baeldung.com/java-filename-without-extension)
- [Writing byte[] to a File in Java](https://www.baeldung.com/java-write-byte-array-file)
-- [[<-- Prev]](/core-java-modules/core-java-io-2)
+- [[<-- Prev]](/core-java-modules/core-java-io-2)[[More -->]](/core-java-modules/core-java-io-4)
diff --git a/core-java-modules/core-java-io-3/pom.xml b/core-java-modules/core-java-io-3/pom.xml
index 017b56f03f..4901133854 100644
--- a/core-java-modules/core-java-io-3/pom.xml
+++ b/core-java-modules/core-java-io-3/pom.xml
@@ -15,12 +15,6 @@
-
-
- com.google.guava
- guava
- ${guava.version}
- commons-io
@@ -38,17 +32,6 @@
log4j-over-slf4j${org.slf4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-4/README.md b/core-java-modules/core-java-io-4/README.md
index c837e2bffc..be58338fd8 100644
--- a/core-java-modules/core-java-io-4/README.md
+++ b/core-java-modules/core-java-io-4/README.md
@@ -5,4 +5,6 @@ This module contains articles about core Java input and output (IO)
### Relevant Articles:
- [Java File Separator vs File Path Separator](https://www.baeldung.com/java-file-vs-file-path-separator)
+- [Simulate touch Command in Java](https://www.baeldung.com/java-simulate-touch-command)
+- [SequenceInputStream Class in Java](https://www.baeldung.com/java-sequenceinputstream)
- [[<-- Prev]](/core-java-modules/core-java-io-3)
diff --git a/core-java-modules/core-java-io-4/pom.xml b/core-java-modules/core-java-io-4/pom.xml
index 0501bb4a66..9fc00ff586 100644
--- a/core-java-modules/core-java-io-4/pom.xml
+++ b/core-java-modules/core-java-io-4/pom.xml
@@ -32,17 +32,6 @@
log4j-over-slf4j${org.slf4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/InputSequenceHandler.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/InputSequenceHandler.java
new file mode 100644
index 0000000000..7b09c3cc72
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/iostreams/InputSequenceHandler.java
@@ -0,0 +1,45 @@
+package com.baeldung.iostreams;
+
+import java.io.*;
+import java.util.List;
+import java.util.Vector;
+
+public class InputSequenceHandler {
+
+ private SequenceInputStream sequenceInputStream;
+
+ public InputSequenceHandler(Vector inputStreams) {
+ sequenceInputStream = new SequenceInputStream(inputStreams.elements());
+ }
+
+ public InputSequenceHandler(String file1, String file2) throws FileNotFoundException {
+ sequenceInputStream = new SequenceInputStream(new FileInputStream(file1), new FileInputStream(file2));
+ }
+
+ public InputSequenceHandler(List fileNames) throws FileNotFoundException {
+ Vector inputStreams = new Vector<>();
+
+ for (String fileName: fileNames) {
+ inputStreams.add(new FileInputStream(fileName));
+ }
+ sequenceInputStream = new SequenceInputStream(inputStreams.elements());
+ }
+
+
+ public int read() throws IOException {
+ return sequenceInputStream.read();
+ }
+
+ public String readAsString() throws IOException {
+ StringBuilder stringBuilder = new StringBuilder();
+ int readByte;
+ while ((readByte = sequenceInputStream.read()) != -1) {
+ stringBuilder.append((char) readByte);
+ }
+ return stringBuilder.toString();
+ }
+
+ public void close() throws IOException {
+ sequenceInputStream.close();
+ }
+}
diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/simulation/touch/command/Simulator.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/simulation/touch/command/Simulator.java
new file mode 100644
index 0000000000..403981e078
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/simulation/touch/command/Simulator.java
@@ -0,0 +1,49 @@
+package com.baeldung.simulation.touch.command;
+
+import org.apache.commons.io.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.attribute.FileTime;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+public class Simulator {
+
+ public static void touch(String path, String... args) throws IOException, ParseException {
+ File file = new File(path);
+ if (!file.exists()) {
+ file.createNewFile();
+ if (args.length == 0) {
+ return;
+ }
+ }
+ long timeMillis = args.length < 2 ? System.currentTimeMillis() : new SimpleDateFormat("dd-MM-yyyy hh:mm:ss").parse(args[1]).getTime();
+ if (args.length > 0) {
+ // change access time only
+ if ("a".equals(args[0])) {
+ FileTime accessFileTime = FileTime.fromMillis(timeMillis);
+ Files.setAttribute(file.toPath(), "lastAccessTime", accessFileTime);
+ return;
+ }
+ // change modification time only
+ if ("m".equals(args[0])) {
+ file.setLastModified(timeMillis);
+ return;
+ }
+ }
+ // other cases will change both
+ FileTime accessFileTime = FileTime.fromMillis(timeMillis);
+ Files.setAttribute(file.toPath(), "lastAccessTime", accessFileTime);
+ file.setLastModified(timeMillis);
+ }
+
+ public static void touchWithApacheCommons(String path) throws IOException {
+ FileUtils.touch(new File(path));
+ }
+
+ public static void main(String[] args) throws IOException, ParseException {
+ touch("test.txt");
+ }
+}
diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/InputSequenceUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/InputSequenceUnitTest.java
new file mode 100644
index 0000000000..aa2bc24b41
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/iostreams/InputSequenceUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.iostreams;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class InputSequenceUnitTest {
+
+ private static final String FILE1 = "iostreams/File1.txt";
+ private static final String FILE2 = "iostreams/File2.txt";
+ private static final String FILE3 = "iostreams/File3.txt";
+
+ private static final String FILE1_AND_FILE2_CONTENT = "InputSequenceUnitTest";
+ private static final String ALL_FILES_CONTENT = "InputSequenceUnitTest is Success";
+
+ @Test
+ public void givenTwoFiles_readAsString() throws URISyntaxException, IOException {
+ String file1 = Paths.get(ClassLoader.getSystemResource(FILE1).toURI()).toString();
+ String file2 = Paths.get(ClassLoader.getSystemResource(FILE2).toURI()).toString();
+ InputSequenceHandler inputSequenceHandler = new InputSequenceHandler(file1, file2);
+ String stringValue = inputSequenceHandler.readAsString();
+ inputSequenceHandler.close();
+ assertEquals(FILE1_AND_FILE2_CONTENT, stringValue);
+ }
+
+ @Test
+ public void givenFileList_readAsString() throws URISyntaxException, IOException {
+ List filesList = new ArrayList<>();
+ filesList.add(Paths.get(ClassLoader.getSystemResource(FILE1).toURI()).toString());
+ filesList.add(Paths.get(ClassLoader.getSystemResource(FILE2).toURI()).toString());
+ filesList.add(Paths.get(ClassLoader.getSystemResource(FILE3).toURI()).toString());
+ InputSequenceHandler inputSequenceHandler = new InputSequenceHandler(filesList);
+ String stringValue = inputSequenceHandler.readAsString();
+ inputSequenceHandler.close();
+ assertEquals(ALL_FILES_CONTENT, stringValue);
+ }
+
+ @Test
+ public void givenVectorOfInputStreams_readAsString() throws IOException {
+ String[] strings = {"Testing", "Leads", "to", "failure",
+ "and", "failure", "leads", "to", "understanding"};
+ Vector inputStreamVector = new Vector<>();
+ StringBuilder stringBuilder = new StringBuilder();
+ for (String string: strings) {
+ inputStreamVector.add(new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8)));
+ stringBuilder.append(string);
+ }
+ InputSequenceHandler inputSequenceHandler = new InputSequenceHandler(inputStreamVector);
+ String combinedString = inputSequenceHandler.readAsString();
+ inputSequenceHandler.close();
+ assertEquals(stringBuilder.toString(), combinedString);
+ }
+
+ @Test
+ public void givenTwoStrings_readCombinedValue() throws IOException {
+ InputStream first = new ByteArrayInputStream("One".getBytes());
+ InputStream second = new ByteArrayInputStream("Magic".getBytes());
+ SequenceInputStream sequenceInputStream = new SequenceInputStream(first, second);
+ StringBuilder stringBuilder = new StringBuilder();
+ int byteValue;
+ while ((byteValue = sequenceInputStream.read()) != -1) {
+ stringBuilder.append((char) byteValue);
+ }
+ assertEquals("OneMagic", stringBuilder.toString());
+ }
+}
diff --git a/core-java-modules/core-java-io-4/src/test/resources/iostreams/File1.txt b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File1.txt
new file mode 100644
index 0000000000..fa17a296b5
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File1.txt
@@ -0,0 +1 @@
+InputSequence
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-4/src/test/resources/iostreams/File2.txt b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File2.txt
new file mode 100644
index 0000000000..0eb8734500
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File2.txt
@@ -0,0 +1 @@
+UnitTest
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-4/src/test/resources/iostreams/File3.txt b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File3.txt
new file mode 100644
index 0000000000..2f237d7c44
--- /dev/null
+++ b/core-java-modules/core-java-io-4/src/test/resources/iostreams/File3.txt
@@ -0,0 +1 @@
+ is Success
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-apis/pom.xml b/core-java-modules/core-java-io-apis/pom.xml
index f2a574ed89..fab2bff959 100644
--- a/core-java-modules/core-java-io-apis/pom.xml
+++ b/core-java-modules/core-java-io-apis/pom.xml
@@ -32,13 +32,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -51,8 +44,4 @@
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-conversions-2/README.md b/core-java-modules/core-java-io-conversions-2/README.md
index b2153b3669..9abb539066 100644
--- a/core-java-modules/core-java-io-conversions-2/README.md
+++ b/core-java-modules/core-java-io-conversions-2/README.md
@@ -4,6 +4,7 @@ This module contains articles about core Java input/output(IO) conversions.
### Relevant Articles:
- [Java InputStream to String](https://www.baeldung.com/convert-input-stream-to-string)
+- [Java String to InputStream](https://www.baeldung.com/convert-string-to-input-stream)
- [Java – Write an InputStream to a File](https://www.baeldung.com/convert-input-stream-to-a-file)
- [Converting a BufferedReader to a JSONObject](https://www.baeldung.com/java-bufferedreader-to-jsonobject)
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
diff --git a/core-java-modules/core-java-io-conversions-2/pom.xml b/core-java-modules/core-java-io-conversions-2/pom.xml
index dcb9d494dc..24708ad967 100644
--- a/core-java-modules/core-java-io-conversions-2/pom.xml
+++ b/core-java-modules/core-java-io-conversions-2/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
diff --git a/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/stringtoinputstream/JavaXToInputStreamUnitTest.java b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/stringtoinputstream/JavaXToInputStreamUnitTest.java
new file mode 100644
index 0000000000..7e7c79f764
--- /dev/null
+++ b/core-java-modules/core-java-io-conversions-2/src/test/java/com/baeldung/stringtoinputstream/JavaXToInputStreamUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.stringtoinputstream;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.io.IOUtils;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.io.CharSource;
+
+public class JavaXToInputStreamUnitTest {
+ protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+ // tests - String - InputStream
+
+ @Test
+ public final void givenUsingPlainJava_whenConvertingStringToInputStream_thenCorrect() throws IOException {
+ final String initialString = "text";
+ final InputStream targetStream = new ByteArrayInputStream(initialString.getBytes());
+
+ IOUtils.closeQuietly(targetStream);
+ }
+
+ @Test
+ public final void givenUsingGuava_whenConvertingStringToInputStream_thenCorrect() throws IOException {
+ final String initialString = "text";
+ final InputStream targetStream = CharSource.wrap(initialString).asByteSource(StandardCharsets.UTF_8).openStream();
+
+ IOUtils.closeQuietly(targetStream);
+ }
+
+ @Test
+ public final void givenUsingCommonsIO_whenConvertingStringToInputStream_thenCorrect() throws IOException {
+ final String initialString = "text";
+ final InputStream targetStream = IOUtils.toInputStream(initialString);
+
+ IOUtils.closeQuietly(targetStream);
+ }
+
+}
diff --git a/core-java-modules/core-java-io-conversions/README.md b/core-java-modules/core-java-io-conversions/README.md
index 52f5222040..1f12c87241 100644
--- a/core-java-modules/core-java-io-conversions/README.md
+++ b/core-java-modules/core-java-io-conversions/README.md
@@ -13,5 +13,4 @@ This module contains articles about core Java input/output(IO) conversions.
- [Java – Write a Reader to File](https://www.baeldung.com/java-write-reader-to-file)
- [Java – Reader to Byte Array](https://www.baeldung.com/java-convert-reader-to-byte-array)
- [Java – Reader to InputStream](https://www.baeldung.com/java-convert-reader-to-inputstream)
-- [Java String to InputStream](https://www.baeldung.com/convert-string-to-input-stream)
- More articles: [[next -->]](/core-java-modules/core-java-io-conversions-2)
diff --git a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/filetoinputstream/JavaXToInputStreamUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/filetoinputstream/JavaXToInputStreamUnitTest.java
index c20752639f..9d061307ce 100644
--- a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/filetoinputstream/JavaXToInputStreamUnitTest.java
+++ b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/filetoinputstream/JavaXToInputStreamUnitTest.java
@@ -1,46 +1,25 @@
package com.baeldung.filetoinputstream;
-import com.google.common.io.ByteSource;
-import com.google.common.io.CharSource;
-import com.google.common.io.Files;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.SequenceInputStream;
+
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
+import com.google.common.io.ByteSource;
+import com.google.common.io.Files;
public class JavaXToInputStreamUnitTest {
protected final Logger logger = LoggerFactory.getLogger(getClass());
- // tests - String - InputStream
-
- @Test
- public final void givenUsingPlainJava_whenConvertingStringToInputStream_thenCorrect() throws IOException {
- final String initialString = "text";
- final InputStream targetStream = new ByteArrayInputStream(initialString.getBytes());
-
- IOUtils.closeQuietly(targetStream);
- }
-
- @Test
- public final void givenUsingGuava_whenConvertingStringToInputStream_thenCorrect() throws IOException {
- final String initialString = "text";
- final InputStream targetStream = CharSource.wrap(initialString).asByteSource(StandardCharsets.UTF_8).openStream();
-
- IOUtils.closeQuietly(targetStream);
- }
-
- @Test
- public final void givenUsingCommonsIO_whenConvertingStringToInputStream_thenCorrect() throws IOException {
- final String initialString = "text";
- final InputStream targetStream = IOUtils.toInputStream(initialString);
-
- IOUtils.closeQuietly(targetStream);
- }
-
// byte array - InputStream
@Test
diff --git a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
index 72813df9b1..fa3c34d479 100644
--- a/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
+++ b/core-java-modules/core-java-io-conversions/src/test/java/com/baeldung/readertox/JavaReaderToXUnitTest.java
@@ -1,7 +1,7 @@
package com.baeldung.readertox;
import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
+import static org.hamcrest.MatcherAssert.assertThat;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -17,6 +17,7 @@ import java.nio.charset.StandardCharsets;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.CharSequenceReader;
+import org.apache.commons.io.input.ReaderInputStream;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -181,7 +182,7 @@ public class JavaReaderToXUnitTest {
}
@Test
- public void givenUsingCommonsIO_whenConvertingReaderIntoInputStream() throws IOException {
+ public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStream() throws IOException {
final Reader initialReader = new StringReader("With Commons IO");
final InputStream targetStream = IOUtils.toInputStream(IOUtils.toString(initialReader));
@@ -191,7 +192,7 @@ public class JavaReaderToXUnitTest {
}
@Test
- public void givenUsingCommonsIO_whenConvertingReaderIntoInputStream_thenCorrect() throws IOException {
+ public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStream_thenCorrect() throws IOException {
String initialString = "With Commons IO";
final Reader initialReader = new StringReader(initialString);
@@ -204,6 +205,30 @@ public class JavaReaderToXUnitTest {
targetStream.close();
}
+ @Test
+ public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStream() throws IOException {
+ final Reader initialReader = new StringReader("With Commons IO");
+
+ final InputStream targetStream = new ReaderInputStream(initialReader);
+
+ initialReader.close();
+ targetStream.close();
+ }
+
+ @Test
+ public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStream_thenCorrect() throws IOException {
+ String initialString = "With Commons IO";
+ final Reader initialReader = new StringReader(initialString);
+
+ final InputStream targetStream = new ReaderInputStream(initialReader);
+
+ final String finalString = IOUtils.toString(targetStream);
+ assertThat(finalString, equalTo(initialString));
+
+ initialReader.close();
+ targetStream.close();
+ }
+
// tests - Reader to InputStream with encoding
@Test
@@ -233,7 +258,7 @@ public class JavaReaderToXUnitTest {
}
@Test
- public void givenUsingCommonsIO_whenConvertingReaderIntoInputStreamWithEncoding() throws IOException {
+ public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStreamWithEncoding() throws IOException {
final Reader initialReader = new StringReader("With Commons IO");
final InputStream targetStream = IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);
@@ -243,7 +268,7 @@ public class JavaReaderToXUnitTest {
}
@Test
- public void givenUsingCommonsIO_whenConvertingReaderIntoInputStreamWithEncoding_thenCorrect() throws IOException {
+ public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStreamWithEncoding_thenCorrect() throws IOException {
String initialString = "With Commons IO";
final Reader initialReader = new StringReader(initialString);
final InputStream targetStream = IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);
@@ -255,4 +280,27 @@ public class JavaReaderToXUnitTest {
targetStream.close();
}
+ @Test
+ public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStreamWithEncoding() throws IOException {
+ final Reader initialReader = new StringReader("With Commons IO");
+
+ final InputStream targetStream = new ReaderInputStream(initialReader, Charsets.UTF_8);
+
+ initialReader.close();
+ targetStream.close();
+ }
+
+ @Test
+ public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStreamWithEncoding_thenCorrect() throws IOException {
+ String initialString = "With Commons IO";
+ final Reader initialReader = new StringReader(initialString);
+
+ final InputStream targetStream = new ReaderInputStream(initialReader, Charsets.UTF_8);
+
+ String finalString = IOUtils.toString(targetStream, Charsets.UTF_8);
+ assertThat(finalString, equalTo(initialString));
+
+ initialReader.close();
+ targetStream.close();
+ }
}
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
index 0cf6d6767e..7de29ac23c 100644
--- a/core-java-modules/core-java-io/pom.xml
+++ b/core-java-modules/core-java-io/pom.xml
@@ -12,17 +12,9 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.hsqldbhsqldb
@@ -133,8 +125,6 @@
-
- 3.6.13.0.0-M12.4.0
diff --git a/core-java-modules/core-java-jar/README.md b/core-java-modules/core-java-jar/README.md
index f83ea496ab..fe57ede08a 100644
--- a/core-java-modules/core-java-jar/README.md
+++ b/core-java-modules/core-java-jar/README.md
@@ -8,3 +8,4 @@ This module contains articles about JAR files
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [Guide to Creating and Running a Jar File in Java](https://www.baeldung.com/java-create-jar)
- [Get Names of Classes Inside a JAR File](https://www.baeldung.com/jar-file-get-class-names)
+ [Find All Jars Containing Given Class](https://baeldung.com/find-all-jars-containing-given-class/)
\ No newline at end of file
diff --git a/core-java-modules/core-java-jar/pom.xml b/core-java-modules/core-java-jar/pom.xml
index 3c5a1b35bf..da107c745f 100644
--- a/core-java-modules/core-java-jar/pom.xml
+++ b/core-java-modules/core-java-jar/pom.xml
@@ -49,13 +49,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- org.javamoneymoneta
@@ -376,8 +369,6 @@
0.41.8.7
-
- 3.10.01.13.0.0-M1
diff --git a/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/JarApp.java b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/JarApp.java
new file mode 100644
index 0000000000..0cdcd3c89e
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/main/java/com/baeldung/jar/JarApp.java
@@ -0,0 +1,18 @@
+package com.baeldung.jar;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.net.URL;
+
+public class JarApp {
+
+ public static String findObjectMapperClass() {
+ Class klass = ObjectMapper.class;
+ URL path = klass.getProtectionDomain().getCodeSource().getLocation();
+ return path.toString();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(findObjectMapperClass());
+ }
+}
diff --git a/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/JarAppUnitTest.java b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/JarAppUnitTest.java
new file mode 100644
index 0000000000..dc8c54eb31
--- /dev/null
+++ b/core-java-modules/core-java-jar/src/test/java/com/baeldung/jar/JarAppUnitTest.java
@@ -0,0 +1,12 @@
+package com.baeldung.jar;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class JarAppUnitTest {
+
+ @Test
+ public void findClassTest(){
+ Assert.assertTrue(JarApp.findObjectMapperClass().endsWith("jackson-databind-2.13.0.jar"));
+ }
+}
diff --git a/core-java-modules/core-java-jndi/README.md b/core-java-modules/core-java-jndi/README.md
index d9fb324c9a..b0b23fc0d0 100644
--- a/core-java-modules/core-java-jndi/README.md
+++ b/core-java-modules/core-java-jndi/README.md
@@ -2,3 +2,4 @@
### Relevant Articles:
- [Java Naming and Directory Interface Overview](https://www.baeldung.com/jndi)
+- [LDAP Authentication Using Pure Java](https://www.baeldung.com/java-ldap-auth)
diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml
index dae0e9bb35..68b7f9361f 100644
--- a/core-java-modules/core-java-jndi/pom.xml
+++ b/core-java-modules/core-java-jndi/pom.xml
@@ -15,23 +15,6 @@
-
- org.junit.jupiter
- junit-jupiter
- ${jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${jupiter.version}
- org.springframeworkspring-core
@@ -58,6 +41,12 @@
h2${h2.version}
+
+ org.apache.directory.server
+ apacheds-test-framework
+ ${apacheds.version}
+ test
+
@@ -76,7 +65,7 @@
5.0.9.RELEASE1.4.199
- 5.5.1
+ 2.0.0.AM261.81.8
diff --git a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/ldap/auth/JndiLdapAuthManualTest.java b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/ldap/auth/JndiLdapAuthManualTest.java
new file mode 100644
index 0000000000..5a675c62c9
--- /dev/null
+++ b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/ldap/auth/JndiLdapAuthManualTest.java
@@ -0,0 +1,165 @@
+package com.baeldung.jndi.ldap.auth;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+
+import java.util.Hashtable;
+
+import javax.naming.AuthenticationException;
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.apache.directory.server.annotations.CreateLdapServer;
+import org.apache.directory.server.annotations.CreateTransport;
+import org.apache.directory.server.core.annotations.ApplyLdifFiles;
+import org.apache.directory.server.core.annotations.CreateDS;
+import org.apache.directory.server.core.annotations.CreatePartition;
+import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
+import org.apache.directory.server.core.integ.FrameworkRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(FrameworkRunner.class)
+@CreateLdapServer(transports = { @CreateTransport(protocol = "LDAP", address = "localhost", port = 10390)})
+@CreateDS(
+ allowAnonAccess = false, partitions = {@CreatePartition(name = "TestPartition", suffix = "dc=baeldung,dc=com")})
+@ApplyLdifFiles({"users.ldif"})
+// class marked as manual test, as it has to run independently from the other unit tests in the module
+public class JndiLdapAuthManualTest extends AbstractLdapTestUnit {
+
+ private static void authenticateUser(Hashtable environment) throws Exception {
+ DirContext context = new InitialDirContext(environment);
+ context.close();
+ }
+
+ @Test
+ public void givenPreloadedLDAPUserJoe_whenAuthUserWithCorrectPW_thenAuthSucceeds() throws Exception {
+
+ Hashtable environment = new Hashtable();
+ environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ environment.put(Context.PROVIDER_URL, "ldap://localhost:10390");
+ environment.put(Context.SECURITY_AUTHENTICATION, "simple");
+
+ environment.put(Context.SECURITY_PRINCIPAL, "cn=Joe Simms,ou=Users,dc=baeldung,dc=com");
+ environment.put(Context.SECURITY_CREDENTIALS, "12345");
+
+ assertThatCode(() -> authenticateUser(environment)).doesNotThrowAnyException();
+ }
+
+ @Test
+ public void givenPreloadedLDAPUserJoe_whenAuthUserWithWrongPW_thenAuthFails() throws Exception {
+
+ Hashtable environment = new Hashtable();
+ environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ environment.put(Context.PROVIDER_URL, "ldap://localhost:10390");
+ environment.put(Context.SECURITY_AUTHENTICATION, "simple");
+
+ environment.put(Context.SECURITY_PRINCIPAL, "cn=Joe Simms,ou=Users,dc=baeldung,dc=com");
+ environment.put(Context.SECURITY_CREDENTIALS, "wronguserpw");
+
+ assertThatExceptionOfType(AuthenticationException.class).isThrownBy(() -> authenticateUser(environment));
+ }
+
+ @Test
+ public void givenPreloadedLDAPUserJoe_whenSearchAndAuthUserWithCorrectPW_thenAuthSucceeds() throws Exception {
+
+ // first authenticate against LDAP as admin to search up DN of user : Joe Simms
+
+ Hashtable environment = new Hashtable();
+ environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ environment.put(Context.PROVIDER_URL, "ldap://localhost:10390");
+ environment.put(Context.SECURITY_AUTHENTICATION, "simple");
+ environment.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
+ environment.put(Context.SECURITY_CREDENTIALS, "secret");
+
+ DirContext adminContext = new InitialDirContext(environment);
+
+ // define the search filter to find the person with CN : Joe Simms
+ String filter = "(&(objectClass=person)(cn=Joe Simms))";
+
+ // declare the attributes we want returned for the object being searched
+ String[] attrIDs = { "cn" };
+
+ // define the search controls
+ SearchControls searchControls = new SearchControls();
+ searchControls.setReturningAttributes(attrIDs);
+ searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+ // search for User with filter cn=Joe Simms
+ NamingEnumeration searchResults = adminContext.search("dc=baeldung,dc=com", filter, searchControls);
+ if (searchResults.hasMore()) {
+
+ SearchResult result = (SearchResult) searchResults.next();
+ Attributes attrs = result.getAttributes();
+
+ String distinguishedName = result.getNameInNamespace();
+ assertThat(distinguishedName).isEqualTo("cn=Joe Simms,ou=Users,dc=baeldung,dc=com");
+
+ String commonName = attrs.get("cn").toString();
+ assertThat(commonName).isEqualTo("cn: Joe Simms");
+
+ // authenticate new context with DN for user Joe Simms, using correct password
+
+ environment.put(Context.SECURITY_PRINCIPAL, distinguishedName);
+ environment.put(Context.SECURITY_CREDENTIALS, "12345");
+
+ assertThatCode(() -> authenticateUser(environment)).doesNotThrowAnyException();
+ }
+
+ adminContext.close();
+ }
+
+ @Test
+ public void givenPreloadedLDAPUserJoe_whenSearchAndAuthUserWithWrongPW_thenAuthFails() throws Exception {
+
+ // first authenticate against LDAP as admin to search up DN of user : Joe Simms
+
+ Hashtable environment = new Hashtable();
+ environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
+ environment.put(Context.PROVIDER_URL, "ldap://localhost:10390");
+ environment.put(Context.SECURITY_AUTHENTICATION, "simple");
+ environment.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system");
+ environment.put(Context.SECURITY_CREDENTIALS, "secret");
+ DirContext adminContext = new InitialDirContext(environment);
+
+ // define the search filter to find the person with CN : Joe Simms
+ String filter = "(&(objectClass=person)(cn=Joe Simms))";
+
+ // declare the attributes we want returned for the object being searched
+ String[] attrIDs = { "cn" };
+
+ // define the search controls
+ SearchControls searchControls = new SearchControls();
+ searchControls.setReturningAttributes(attrIDs);
+ searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
+
+ // search for User with filter cn=Joe Simms
+ NamingEnumeration searchResults = adminContext.search("dc=baeldung,dc=com", filter, searchControls);
+ if (searchResults.hasMore()) {
+
+ SearchResult result = (SearchResult) searchResults.next();
+ Attributes attrs = result.getAttributes();
+
+ String distinguishedName = result.getNameInNamespace();
+ assertThat(distinguishedName).isEqualTo("cn=Joe Simms,ou=Users,dc=baeldung,dc=com");
+
+ String commonName = attrs.get("cn").toString();
+ assertThat(commonName).isEqualTo("cn: Joe Simms");
+
+ // authenticate new context with DN for user Joe Simms, using wrong password
+
+ environment.put(Context.SECURITY_PRINCIPAL, distinguishedName);
+ environment.put(Context.SECURITY_CREDENTIALS, "wronguserpassword");
+
+ assertThatExceptionOfType(AuthenticationException.class).isThrownBy(() -> authenticateUser(environment));
+ }
+
+ adminContext.close();
+ }
+}
diff --git a/core-java-modules/core-java-jndi/src/test/resources/logback.xml b/core-java-modules/core-java-jndi/src/test/resources/logback.xml
new file mode 100644
index 0000000000..eaad569e43
--- /dev/null
+++ b/core-java-modules/core-java-jndi/src/test/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-jndi/src/test/resources/users.ldif b/core-java-modules/core-java-jndi/src/test/resources/users.ldif
new file mode 100644
index 0000000000..c1996586d5
--- /dev/null
+++ b/core-java-modules/core-java-jndi/src/test/resources/users.ldif
@@ -0,0 +1,20 @@
+version: 1
+dn: dc=baeldung,dc=com
+objectClass: domain
+objectClass: top
+dc: baeldung
+
+dn: ou=Users,dc=baeldung,dc=com
+objectClass: organizationalUnit
+objectClass: top
+ou: Users
+
+dn: cn=Joe Simms,ou=Users,dc=baeldung,dc=com
+objectClass: inetOrgPerson
+objectClass: organizationalPerson
+objectClass: person
+objectClass: top
+cn: Joe Simms
+sn: Simms
+uid: user1
+userPassword: 12345
diff --git a/core-java-modules/core-java-jpms/pom.xml b/core-java-modules/core-java-jpms/pom.xml
index 65f5afad47..62aa49f299 100644
--- a/core-java-modules/core-java-jpms/pom.xml
+++ b/core-java-modules/core-java-jpms/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- ${compiler.plugin.version}
+ ${maven-compiler-plugin.version}${source.version}${target.version}
@@ -36,7 +36,6 @@
- 3.8.01111
diff --git a/core-java-modules/core-java-jvm-2/README.md b/core-java-modules/core-java-jvm-2/README.md
index ccca3a11ac..94ebe262c8 100644
--- a/core-java-modules/core-java-jvm-2/README.md
+++ b/core-java-modules/core-java-jvm-2/README.md
@@ -12,4 +12,5 @@ This module contains articles about working with the Java Virtual Machine (JVM).
- [Memory Address of Objects in Java](https://www.baeldung.com/java-object-memory-address)
- [List All Classes Loaded in a Specific Class Loader](https://www.baeldung.com/java-list-classes-class-loader)
- [An Introduction to the Constant Pool in the JVM](https://www.baeldung.com/jvm-constant-pool)
+- [List All the Classes Loaded in the JVM](https://www.baeldung.com/jvm-list-all-classes-loaded)
- More articles: [[<-- prev]](/core-java-modules/core-java-jvm)
diff --git a/core-java-modules/core-java-jvm-2/pom.xml b/core-java-modules/core-java-jvm-2/pom.xml
index 5bc5b5e3a5..01628b0908 100644
--- a/core-java-modules/core-java-jvm-2/pom.xml
+++ b/core-java-modules/core-java-jvm-2/pom.xml
@@ -15,28 +15,21 @@
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.openjdk.joljol-core${jol-core.version}
+
+ org.reflections
+ reflections
+ ${reflections.version}
+
- 3.6.10.10
+ 0.10.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClass.java b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClass.java
new file mode 100644
index 0000000000..b4a290e70d
--- /dev/null
+++ b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClass.java
@@ -0,0 +1,35 @@
+package com.baeldung.loadedclasslisting;
+
+import java.io.IOException;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.reflect.ClassPath;
+import com.google.common.reflect.ClassPath.ClassInfo;
+
+public class ListLoadedClass {
+
+ public ImmutableSet listClassLoaded() throws IOException {
+ return ClassPath.from(ListLoadedClass.class.getClassLoader())
+ .getAllClasses();
+ }
+
+ public Set listClassLoaded(String packageName) throws IOException {
+ return ClassPath.from(ClassLoader.getSystemClassLoader()).getAllClasses().stream()
+ .filter(clazz -> clazz.getPackageName().equals(packageName))
+ .map(ClassInfo::load)
+ .collect(Collectors.toSet());
+ }
+
+ public Set findAllClassesUsingReflectionsLibrary(String packageName) {
+ Reflections reflections = new Reflections(packageName, new SubTypesScanner(false));
+ return reflections.getSubTypesOf(Object.class)
+ .stream()
+ .collect(Collectors.toSet());
+ }
+
+}
diff --git a/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/loadedclasslisting/ListLoadedClassUnitTest.java b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/loadedclasslisting/ListLoadedClassUnitTest.java
new file mode 100644
index 0000000000..c3e29b27b6
--- /dev/null
+++ b/core-java-modules/core-java-jvm-2/src/test/java/com/baeldung/loadedclasslisting/ListLoadedClassUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.loadedclasslisting;
+
+import java.io.IOException;
+import java.util.Set;
+
+import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+
+import com.baeldung.loadedclasslisting.ListLoadedClass;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.reflect.ClassPath;
+import com.google.common.reflect.ClassPath.ClassInfo;
+
+public class ListLoadedClassUnitTest {
+
+ private static final String PACKAGE_NAME = "com.baeldung.loadedclasslisting";
+
+ @Test
+ public void when_findAllClassesUsingReflectionsLibrary_thenSuccess() {
+ ListLoadedClass instance = new ListLoadedClass();
+ Set classes = instance.findAllClassesUsingReflectionsLibrary(PACKAGE_NAME);
+
+ Assertions.assertEquals(4, classes.size());
+ }
+
+ @Test
+ public void when_findAllClassesUsingGuavaLibrary_InPackage_thenSuccess() throws IOException {
+ ListLoadedClass instance = new ListLoadedClass();
+ Set classes = instance.listClassLoaded(PACKAGE_NAME);
+
+ Assertions.assertEquals(4, classes.size());
+ }
+
+ @Test
+ public void when_findAllClassesUsingGuavaLibrary_thenSuccess() throws IOException {
+ ListLoadedClass instance = new ListLoadedClass();
+ Set classes = instance.listClassLoaded();
+
+ Assertions.assertTrue(4com.baeldung.core-java-modules
core-java-modules0.0.1-SNAPSHOT
- ../
-
- junit
- junit
- ${junit.version}
- test
- org.apache.commonscommons-lang3${commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.javassistjavassist
@@ -73,8 +60,6 @@
- 3.6.1
-
3.27.0-GA1.8.00.10
diff --git a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
index 64532c8b6f..db710589e7 100644
--- a/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
+++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
@@ -1,15 +1,20 @@
package com.baeldung.java8.lambda.exceptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.function.Consumer;
public class LambdaExceptionWrappers {
+ private static final Logger LOGGER = LoggerFactory.getLogger(LambdaExceptionWrappers.class);
+
public static Consumer lambdaWrapper(Consumer consumer) {
return i -> {
try {
consumer.accept(i);
} catch (ArithmeticException e) {
- System.err.println("Arithmetic Exception occured : " + e.getMessage());
+ LOGGER.error("Arithmetic Exception occurred.", e);
}
};
}
@@ -21,7 +26,7 @@ public class LambdaExceptionWrappers {
} catch (Exception ex) {
try {
E exCast = clazz.cast(ex);
- System.err.println("Exception occured : " + exCast.getMessage());
+ LOGGER.error("Exception occurred.", exCast);
} catch (ClassCastException ccEx) {
throw ex;
}
@@ -46,7 +51,7 @@ public class LambdaExceptionWrappers {
} catch (Exception ex) {
try {
E exCast = exceptionClass.cast(ex);
- System.err.println("Exception occured : " + exCast.getMessage());
+ LOGGER.error("Exception occurred.", exCast);
} catch (ClassCastException ccEx) {
throw new RuntimeException(ex);
}
diff --git a/guest/spring-boot-app/src/main/resources/logback.xml b/core-java-modules/core-java-lambdas/src/main/resources/logback.xml
similarity index 100%
rename from guest/spring-boot-app/src/main/resources/logback.xml
rename to core-java-modules/core-java-lambdas/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
index 957294153b..87c01c3ded 100644
--- a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
+++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
@@ -7,14 +7,16 @@ import java.util.function.BiFunction;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class MethodReferenceUnitTest {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MethodReferenceUnitTest.class);
+
private static void doNothingAtAll(Object... o) {
}
- ;
-
@Test
public void referenceToStaticMethod() {
List messages = Arrays.asList("Hello", "Baeldung", "readers!");
@@ -61,7 +63,7 @@ public class MethodReferenceUnitTest {
@Test
public void limitationsAndAdditionalExamples() {
- createBicyclesList().forEach(b -> System.out.printf("Bike brand is '%s' and frame size is '%d'%n", b.getBrand(), b.getFrameSize()));
+ createBicyclesList().forEach(b -> LOGGER.debug("Bike brand is '{}' and frame size is '{}'", b.getBrand(), b.getFrameSize()));
createBicyclesList().forEach((o) -> MethodReferenceUnitTest.doNothingAtAll(o));
}
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
index d1a8d68075..4a89a22577 100644
--- a/core-java-modules/core-java-lang-2/pom.xml
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -20,11 +20,6 @@
commons-lang3${commons-lang3.version}
-
- com.google.guava
- guava
- ${guava.version}
- commons-beanutilscommons-beanutils
@@ -45,12 +40,6 @@
jmh-core${jmh-core.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -64,9 +53,7 @@
- 3.12.21.9.4
- 29.0-jre
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-3/pom.xml b/core-java-modules/core-java-lang-3/pom.xml
index 0eda5dd16b..331d91dff6 100644
--- a/core-java-modules/core-java-lang-3/pom.xml
+++ b/core-java-modules/core-java-lang-3/pom.xml
@@ -15,22 +15,10 @@
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- com.google.guava
- guava
- ${guava.version}
- test
- org.apache.commonscommons-math3
- 3.6.1
+ ${commons-math3.version}test
@@ -46,7 +34,7 @@
- 3.12.2
+ 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/README.md b/core-java-modules/core-java-lang-4/README.md
index 4546a00fe6..e2a74b36af 100644
--- a/core-java-modules/core-java-lang-4/README.md
+++ b/core-java-modules/core-java-lang-4/README.md
@@ -9,3 +9,4 @@ This module contains articles about core features in the Java language
- [Referencing a Method in Javadoc Comments](https://www.baeldung.com/java-method-in-javadoc)
- [Tiered Compilation in JVM](https://www.baeldung.com/jvm-tiered-compilation)
- [Fixing the “Declared package does not match the expected package” Error](https://www.baeldung.com/java-declared-expected-package-error)
+- [Chaining Constructors in Java](https://www.baeldung.com/java-chain-constructors)
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Customer.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Customer.java
new file mode 100644
index 0000000000..62dbdef297
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Customer.java
@@ -0,0 +1,34 @@
+package com.baeldung.constructorchaining;
+
+import java.util.Objects;
+
+public class Customer extends Person {
+ private final String loyaltyCardId;
+
+ public Customer(String firstName, String lastName, int age, String loyaltyCardId) {
+ this(firstName, null, lastName, age, loyaltyCardId);
+ }
+
+ public Customer(String firstName, String middleName, String lastName, int age, String loyaltyCardId) {
+ super(firstName, middleName, lastName, age);
+ this.loyaltyCardId = loyaltyCardId;
+ }
+
+ public String getLoyaltyCardId() {
+ return loyaltyCardId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ if (!super.equals(o)) return false;
+ Customer customer = (Customer) o;
+ return Objects.equals(loyaltyCardId, customer.loyaltyCardId);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(super.hashCode(), loyaltyCardId);
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Person.java b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Person.java
new file mode 100644
index 0000000000..02ce2220ba
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/main/java/com/baeldung/constructorchaining/Person.java
@@ -0,0 +1,51 @@
+package com.baeldung.constructorchaining;
+
+import java.util.Objects;
+
+public class Person {
+ private final String firstName;
+ private final String middleName;
+ private final String lastName;
+ private final int age;
+
+ public Person(String firstName, String lastName, int age) {
+ this(firstName, null, lastName, age);
+ }
+
+
+ public Person(String firstName, String middleName, String lastName, int age) {
+ this.firstName = firstName;
+ this.middleName = middleName;
+ this.lastName = lastName;
+ this.age = age;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public String getMiddleName() {
+ return middleName;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ Person person = (Person) o;
+ return age == person.age && Objects.equals(firstName, person.firstName) && Objects.equals(middleName, person.middleName) && Objects.equals(lastName, person.lastName);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(firstName, middleName, lastName, age);
+ }
+}
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/CustomerUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/CustomerUnitTest.java
new file mode 100644
index 0000000000..ad00ea65b8
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/CustomerUnitTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.constructorchaining;
+
+import org.junit.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class CustomerUnitTest {
+
+ @Test
+ public void givenNameLastNameAndAge_whenUsingDedicatedConstructor_shouldInitializeFieldsAndNullifyMiddleName() {
+ Customer mark = new Customer("Mark", "Johnson", 23, "abcd1234");
+
+ assertEquals(23, mark.getAge());
+ assertEquals("Mark", mark.getFirstName());
+ assertEquals("Johnson", mark.getLastName());
+ assertEquals("abcd1234", mark.getLoyaltyCardId());
+ assertNull(mark.getMiddleName());
+ }
+
+ @Test
+ public void givenAllFieldsRequired_whenUsingDedicatedConstructor_shouldInitializeAllFields() {
+ Customer mark = new Customer("Mark", "Andrew", "Johnson", 23, "abcd1234");
+
+ assertEquals(23, mark.getAge());
+ assertEquals("Mark", mark.getFirstName());
+ assertEquals("Andrew", mark.getMiddleName());
+ assertEquals("Johnson", mark.getLastName());
+ assertEquals("abcd1234", mark.getLoyaltyCardId());
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/PersonUnitTest.java b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/PersonUnitTest.java
new file mode 100644
index 0000000000..8322917951
--- /dev/null
+++ b/core-java-modules/core-java-lang-4/src/test/java/com/baeldung/constructorchaining/PersonUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.constructorchaining;
+
+import org.junit.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class PersonUnitTest {
+
+ @Test
+ public void givenNameLastNameAndAge_whenUsingDedicatedConstructor_shouldInitializeFieldsAndNullifyMiddleName() {
+ Person mark = new Person("Mark", "Johnson", 23);
+
+ assertEquals(23, mark.getAge());
+ assertEquals("Mark", mark.getFirstName());
+ assertEquals("Johnson", mark.getLastName());
+ assertNull(mark.getMiddleName());
+ }
+
+ @Test
+ public void givenAllFieldsRequired_whenUsingDedicatedConstructor_shouldInitializeAllFields() {
+ Person mark = new Person("Mark", "Andrew", "Johnson", 23);
+
+ assertEquals(23, mark.getAge());
+ assertEquals("Mark", mark.getFirstName());
+ assertEquals("Andrew", mark.getMiddleName());
+ assertEquals("Johnson", mark.getLastName());
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-math-2/pom.xml b/core-java-modules/core-java-lang-math-2/pom.xml
index 4411d313db..e6ead53350 100644
--- a/core-java-modules/core-java-lang-math-2/pom.xml
+++ b/core-java-modules/core-java-lang-math-2/pom.xml
@@ -39,17 +39,6 @@
colt${colt.version}
-
- com.google.guava
- guava
- ${guava.version}
-
-
- org.assertj
- assertj-core
- ${org.assertj.core.version}
- test
- com.github.dpaukovcombinatoricslib3
@@ -65,8 +54,6 @@
3.6.1
- 3.9.0
- 27.0.1-jre3.3.00.381.0.0-beta4
diff --git a/core-java-modules/core-java-lang-math-3/pom.xml b/core-java-modules/core-java-lang-math-3/pom.xml
index b9d09dba8c..38cb6dfa17 100644
--- a/core-java-modules/core-java-lang-math-3/pom.xml
+++ b/core-java-modules/core-java-lang-math-3/pom.xml
@@ -17,13 +17,18 @@
net.objecthunterexp4j
- 0.4.8
+ ${exp4j.version}com.fathzerjavaluator
- 3.0.3
+ ${javaluator.version}
+
+ 0.4.8
+ 3.0.3
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index 2cc9b90fa4..37550b67d8 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -14,16 +14,6 @@
0.0.1-SNAPSHOT
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
core-java-lang-math
@@ -34,9 +24,4 @@
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-constructors/README.md b/core-java-modules/core-java-lang-oop-constructors/README.md
index 69ade3e25a..6083f1d0df 100644
--- a/core-java-modules/core-java-lang-oop-constructors/README.md
+++ b/core-java-modules/core-java-lang-oop-constructors/README.md
@@ -8,3 +8,5 @@ This module contains article about constructors in Java
- [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error)
- [Private Constructors in Java](https://www.baeldung.com/java-private-constructors)
- [Throwing Exceptions in Constructors](https://www.baeldung.com/java-constructors-exceptions)
+- [Constructors in Java Abstract Classes](https://www.baeldung.com/java-abstract-classes-constructors)
+- [Java Implicit Super Constructor is Undefined Error](https://www.baeldung.com/java-implicit-super-constructor-is-undefined-error)
diff --git a/core-java-modules/core-java-lang-oop-constructors/pom.xml b/core-java-modules/core-java-lang-oop-constructors/pom.xml
index 5635059fa9..061b3c08de 100644
--- a/core-java-modules/core-java-lang-oop-constructors/pom.xml
+++ b/core-java-modules/core-java-lang-oop-constructors/pom.xml
@@ -13,17 +13,4 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/AbstractClass.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/AbstractClass.java
new file mode 100644
index 0000000000..7599529014
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/AbstractClass.java
@@ -0,0 +1,5 @@
+package com.baeldung.abstractconstructors.defaultconstructor;
+
+public abstract class AbstractClass {
+ // compiler creates a default constructor
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/ConcreteClass.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/ConcreteClass.java
new file mode 100644
index 0000000000..71c418735d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/defaultconstructor/ConcreteClass.java
@@ -0,0 +1,8 @@
+package com.baeldung.abstractconstructors.defaultconstructor;
+
+public class ConcreteClass extends AbstractClass {
+
+ public ConcreteClass() {
+ super();
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/AbstractClass.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/AbstractClass.java
new file mode 100644
index 0000000000..bdd554b2d9
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/AbstractClass.java
@@ -0,0 +1,8 @@
+package com.baeldung.abstractconstructors.noargs;
+
+public abstract class AbstractClass {
+
+ public AbstractClass() {
+ System.out.println("Initializing AbstractClass");
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassA.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassA.java
new file mode 100644
index 0000000000..8339098127
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassA.java
@@ -0,0 +1,4 @@
+package com.baeldung.abstractconstructors.noargs;
+
+public class ConcreteClassA extends AbstractClass {
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassB.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassB.java
new file mode 100644
index 0000000000..cad20d2ec0
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/ConcreteClassB.java
@@ -0,0 +1,8 @@
+package com.baeldung.abstractconstructors.noargs;
+
+public class ConcreteClassB extends AbstractClass {
+
+ public ConcreteClassB() {
+ System.out.println("Initializing ConcreteClassB");
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/Counter.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/Counter.java
new file mode 100644
index 0000000000..a0471ad777
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/Counter.java
@@ -0,0 +1,18 @@
+package com.baeldung.abstractconstructors.noargs;
+
+public abstract class Counter {
+
+ int value;
+
+ private Counter() {
+ this.value = 0;
+ System.out.println("Counter No-Arguments constructor");
+ }
+
+ public Counter(int value) {
+ this.value = value;
+ System.out.println("Parametrized Counter constructor");
+ }
+
+ abstract int increment();
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/SimpleCounter.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/SimpleCounter.java
new file mode 100644
index 0000000000..93add905df
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/noargs/SimpleCounter.java
@@ -0,0 +1,13 @@
+package com.baeldung.abstractconstructors.noargs;
+
+public class SimpleCounter extends Counter {
+
+ public SimpleCounter(int value) {
+ super(value);
+ }
+
+ @Override
+ int increment() {
+ return ++value;
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/Car.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/Car.java
new file mode 100644
index 0000000000..8919636b7e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/Car.java
@@ -0,0 +1,28 @@
+package com.baeldung.abstractconstructors.parametrized;
+
+public abstract class Car {
+
+ private int distance;
+
+ private Car(int distance) {
+ this.distance = distance;
+ }
+
+ public Car() {
+ this(0);
+ System.out.println("Car default constructor");
+ }
+
+ abstract String getInformation();
+
+ protected void display() {
+ String info = new StringBuilder(getInformation())
+ .append("\nDistance: " + getDistance())
+ .toString();
+ System.out.println(info);
+ }
+
+ public int getDistance() {
+ return distance;
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/ElectricCar.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/ElectricCar.java
new file mode 100644
index 0000000000..e17ea6d9c5
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/ElectricCar.java
@@ -0,0 +1,17 @@
+package com.baeldung.abstractconstructors.parametrized;
+
+public class ElectricCar extends Car {
+
+ int chargingTime;
+
+ public ElectricCar(int chargingTime) {
+ this.chargingTime = chargingTime;
+ }
+
+ @Override
+ String getInformation() {
+ return new StringBuilder("Electric Car")
+ .append("\nCharging Time: " + chargingTime)
+ .toString();
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/FuelCar.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/FuelCar.java
new file mode 100644
index 0000000000..c18c3a26ef
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/abstractconstructors/parametrized/FuelCar.java
@@ -0,0 +1,17 @@
+package com.baeldung.abstractconstructors.parametrized;
+
+public class FuelCar extends Car {
+
+ String fuel;
+
+ public FuelCar(String fuel) {
+ this.fuel = fuel;
+ }
+
+ @Override
+ String getInformation() {
+ return new StringBuilder("Fuel Car")
+ .append("\nFuel type: " + fuel)
+ .toString();
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java
new file mode 100644
index 0000000000..708e2f33f8
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Employee.java
@@ -0,0 +1,26 @@
+package com.baeldung.implicitsuperconstructorundefined;
+
+public class Employee extends Person {
+
+ private Double salary;
+
+ public Employee(String name, Integer age, Double salary) {
+ // comment this super call to see the error.
+ super(name, age);
+ this.salary = salary;
+ }
+
+ public Employee(Double salary) {
+ super();
+ this.salary = salary;
+ }
+
+ public Double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(Double salary) {
+ this.salary = salary;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java
new file mode 100644
index 0000000000..ff4cde5db7
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/main/java/com/baeldung/implicitsuperconstructorundefined/Person.java
@@ -0,0 +1,35 @@
+package com.baeldung.implicitsuperconstructorundefined;
+
+public class Person {
+
+ private String name;
+
+ private Integer age;
+
+ public Person(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ // comment this constructor to see the error.
+ public Person() {
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/AbstractClassUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/AbstractClassUnitTest.java
new file mode 100644
index 0000000000..c72d3b0f3f
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/AbstractClassUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.abstractconstructors.noargs;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class AbstractClassUnitTest {
+
+ @Test
+ void givenNoArgsAbstractConstructor_whenNewSubclassA_thenCalled() {
+ assertNotNull(new ConcreteClassA());
+ }
+
+ @Test
+ void givenNoArgsAbstractConstructor_whenNewSubclassB_thenCalled() {
+ assertNotNull(new ConcreteClassB());
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/CounterUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/CounterUnitTest.java
new file mode 100644
index 0000000000..774136c5b6
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/noargs/CounterUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.abstractconstructors.noargs;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class CounterUnitTest {
+
+ @Test
+ void givenNoArgAbstractConstructor_whenSubclassCreation_thenCalled() {
+ Counter counter = new SimpleCounter(1);
+ assertNotNull(counter);
+ assertEquals(1, counter.value);
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/parametrized/CarUnitTest.java b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/parametrized/CarUnitTest.java
new file mode 100644
index 0000000000..6d17861355
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-constructors/src/test/java/com/baeldung/abstractconstructors/parametrized/CarUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.abstractconstructors.parametrized;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class CarUnitTest {
+ @Test
+ void givenParametrizedConstructor_whenConcreteCreation_thenCall() {
+ ElectricCar electricCar = new ElectricCar(8);
+ assertNotNull(electricCar);
+ electricCar.display();
+
+ System.out.println();
+
+ FuelCar fuelCar = new FuelCar("Gasoline");
+ assertNotNull(fuelCar);
+ fuelCar.display();
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-inheritance/pom.xml b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
index e0272fb94e..4fc7e14d84 100644
--- a/core-java-modules/core-java-lang-oop-inheritance/pom.xml
+++ b/core-java-modules/core-java-lang-oop-inheritance/pom.xml
@@ -13,17 +13,4 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-methods/README.md b/core-java-modules/core-java-lang-oop-methods/README.md
index 43eab24003..f34606f26a 100644
--- a/core-java-modules/core-java-lang-oop-methods/README.md
+++ b/core-java-modules/core-java-lang-oop-methods/README.md
@@ -10,3 +10,4 @@ This module contains articles about methods in Java
- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
- [The Covariant Return Type in Java](https://www.baeldung.com/java-covariant-return-type)
- [Does a Method’s Signature Include the Return Type in Java?](https://www.baeldung.com/java-method-signature-return-type)
+- [Solving the Hide Utility Class Public Constructor Sonar Warning](https://www.baeldung.com/java-sonar-hide-implicit-constructor)
diff --git a/core-java-modules/core-java-lang-oop-methods/pom.xml b/core-java-modules/core-java-lang-oop-methods/pom.xml
index e493f716ec..bba1365719 100644
--- a/core-java-modules/core-java-lang-oop-methods/pom.xml
+++ b/core-java-modules/core-java-lang-oop-methods/pom.xml
@@ -24,12 +24,6 @@
commons-lang${commons-lang.version}
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- nl.jqno.equalsverifierequalsverifier
@@ -39,7 +33,7 @@
- 1.18.12
+ 1.18.222.63.10.03.0.3
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/StringUtils.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/StringUtils.java
new file mode 100644
index 0000000000..1e94281d21
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/StringUtils.java
@@ -0,0 +1,17 @@
+package com.baeldung.utilities;
+
+public final class StringUtils {
+
+ private StringUtils() {
+ throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
+ }
+
+ public static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ public static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsEnum.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsEnum.java
new file mode 100644
index 0000000000..2fa96874c0
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsEnum.java
@@ -0,0 +1,13 @@
+package com.baeldung.utilities.alternatives;
+
+public enum StringUtilsEnum {;
+
+ public static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ public static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsInterface.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsInterface.java
new file mode 100644
index 0000000000..b6afdfff5d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/alternatives/StringUtilsInterface.java
@@ -0,0 +1,13 @@
+package com.baeldung.utilities.alternatives;
+
+public interface StringUtilsInterface {
+
+ static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructor.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructor.java
new file mode 100644
index 0000000000..38e60e0216
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructor.java
@@ -0,0 +1,17 @@
+package com.baeldung.utilities.lombok;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor(access= AccessLevel.PRIVATE)
+public final class StringUtilsWithNoArgsConstructor {
+
+ public static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ public static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClass.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClass.java
new file mode 100644
index 0000000000..56718f8ce4
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClass.java
@@ -0,0 +1,16 @@
+package com.baeldung.utilities.lombok;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class StringUtilsWithUtilityClass {
+
+ public static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ public static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/warning/StringUtilsSuppressWarning.java b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/warning/StringUtilsSuppressWarning.java
new file mode 100644
index 0000000000..d8354f993d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/main/java/com/baeldung/utilities/warning/StringUtilsSuppressWarning.java
@@ -0,0 +1,14 @@
+package com.baeldung.utilities.warning;
+
+@SuppressWarnings("java:S1118")
+public final class StringUtilsSuppressWarning {
+
+ public static boolean isEmpty(String source) {
+ return source == null || source.length() == 0;
+ }
+
+ public static String wrap(String source, String wrapWith) {
+ return isEmpty(source) ? source : wrapWith + source + wrapWith;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/StringUtilsUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/StringUtilsUnitTest.java
new file mode 100644
index 0000000000..ca8b270d8d
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/StringUtilsUnitTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.utilities;
+
+import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.*;
+
+class StringUtilsUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtils.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtils.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtils.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtils.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsEnumUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsEnumUnitTest.java
new file mode 100644
index 0000000000..4d948c44ae
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsEnumUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.utilities.alternatives;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsEnumUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtilsEnum.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtilsEnum.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtilsEnum.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtilsEnum.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsInterfaceUnitTest.java
new file mode 100644
index 0000000000..600f6c2156
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/alternatives/StringUtilsInterfaceUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.utilities.alternatives;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsInterfaceUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtilsInterface.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtilsInterface.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtilsInterface.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtilsInterface.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructorUnitTest.java
new file mode 100644
index 0000000000..b110c31080
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithNoArgsConstructorUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.utilities.lombok;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsWithNoArgsConstructorUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtilsWithNoArgsConstructor.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtilsWithNoArgsConstructor.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtilsWithNoArgsConstructor.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtilsWithNoArgsConstructor.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClassUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClassUnitTest.java
new file mode 100644
index 0000000000..c2f5003ada
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/lombok/StringUtilsWithUtilityClassUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.utilities.lombok;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsWithUtilityClassUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtilsWithUtilityClass.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtilsWithUtilityClass.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtilsWithUtilityClass.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtilsWithUtilityClass.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/warning/StringUtilsStringUtilsSuppressWarningUnitTest.java b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/warning/StringUtilsStringUtilsSuppressWarningUnitTest.java
new file mode 100644
index 0000000000..646da08cc4
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-methods/src/test/java/com/baeldung/utilities/warning/StringUtilsStringUtilsSuppressWarningUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.utilities.warning;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class StringUtilsStringUtilsSuppressWarningUnitTest {
+
+ @Test
+ void givenAnEmptyString_whenCallingIsEmpty_thenResultIsTrue() {
+ assertThat(StringUtilsSuppressWarning.isEmpty("")).isTrue();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingIsEmpty_thenResultIsFalse() {
+ assertThat(StringUtilsSuppressWarning.isEmpty("asd")).isFalse();
+ }
+
+ @Test
+ void givenAnEmptyString_whenCallingWrap_thenResultIsAnEmptyString() {
+ assertThat(StringUtilsSuppressWarning.wrap("", "wrapper")).isEmpty();
+ }
+
+ @Test
+ void givenNonEmptyString_whenCallingWrap_thenResultIsWrappedString() {
+ assertThat(StringUtilsSuppressWarning.wrap("asd", "wrapper")).isEqualTo("wrapperasdwrapper");
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-modifiers/pom.xml b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
index 70c70608eb..c193073a0e 100644
--- a/core-java-modules/core-java-lang-oop-modifiers/pom.xml
+++ b/core-java-modules/core-java-lang-oop-modifiers/pom.xml
@@ -14,12 +14,6 @@
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- com.h2databaseh2
@@ -29,7 +23,7 @@
- 3.10.0
+ 1.4.197
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-patterns/pom.xml b/core-java-modules/core-java-lang-oop-patterns/pom.xml
index 8b8b4a7b46..4b89584def 100644
--- a/core-java-modules/core-java-lang-oop-patterns/pom.xml
+++ b/core-java-modules/core-java-lang-oop-patterns/pom.xml
@@ -29,17 +29,10 @@
gson${gson.version}
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- 2.8.2
- 3.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-types-2/README.md b/core-java-modules/core-java-lang-oop-types-2/README.md
index a4e7b101c3..c5e2a75f25 100644
--- a/core-java-modules/core-java-lang-oop-types-2/README.md
+++ b/core-java-modules/core-java-lang-oop-types-2/README.md
@@ -5,3 +5,4 @@ This module contains articles about types in Java
### Relevant Articles:
- [Convert an Array of Primitives to an Array of Objects](https://www.baeldung.com/java-primitive-array-to-object-array)
+- [Check if an Enum Value Exists in Java](https://www.baeldung.com/java-search-enum-values)
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java
new file mode 100644
index 0000000000..935aca4d65
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Direction.java
@@ -0,0 +1,26 @@
+package com.baeldung.enums;
+
+/**
+ * Represents directions.
+ */
+public enum Direction {
+ EAST, WEST, SOUTH, NORTH;
+
+ /**
+ * Finds direction by name.
+ *
+ * @param name the name
+ * @return the direction if found else null
+ */
+ public static Direction findByName(String name) {
+ Direction result = null;
+ for (Direction direction : values()) {
+ if (direction.name().equalsIgnoreCase(name)) {
+ result = direction;
+ break;
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/EnumSearcher.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/EnumSearcher.java
new file mode 100644
index 0000000000..fa85cff38b
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/EnumSearcher.java
@@ -0,0 +1,19 @@
+package com.baeldung.enums;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class EnumSearcher {
+ private static final Logger LOG = LoggerFactory.getLogger(EnumSearcher.class);
+
+ public static void main(String[] args) {
+ EnumSearcher enumSearcher = new EnumSearcher();
+ enumSearcher.printWeekdays();
+ }
+
+ private void printWeekdays() {
+ for (Weekday day: Weekday.values()) {
+ LOG.info("Name {}, Value {}, Stringified {}", day.name(), day.getValue(), day);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Month.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Month.java
new file mode 100644
index 0000000000..f674a4be0a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Month.java
@@ -0,0 +1,116 @@
+package com.baeldung.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Represents months in a year.
+ */
+public enum Month {
+ /**
+ * January.
+ */
+ JANUARY("January", 1),
+ /**
+ * February.
+ */
+ FEBRUARY("February", 2),
+ /**
+ * March.
+ */
+ MARCH("March", 3),
+ /**
+ * April.
+ */
+ APRIL("April", 4),
+ /**
+ * May.
+ */
+ MAY("May", 5),
+ /**
+ * June.
+ */
+ JUNE("June", 6),
+ /**
+ * July.
+ */
+ JULY("July", 7),
+ /**
+ * August.
+ */
+ AUGUST("August", 8),
+ /**
+ * September.
+ */
+ SEPTEMBER("September", 9),
+ /**
+ * October.
+ */
+ OCTOBER("October", 10),
+ /**
+ * November.
+ */
+ NOVEMBER("November", 11),
+ /**
+ * December.
+ */
+ DECEMBER("December", 12),
+ ;
+
+ private final String value;
+ private final int code;
+
+ Month(String value, int code) {
+ this.value = value;
+ this.code = code;
+ }
+
+ /**
+ * Gets value.
+ *
+ * @return the value
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * Gets code.
+ *
+ * @return the code
+ */
+ public int getCode() {
+ return code;
+ }
+
+ /**
+ * Find by name.
+ *
+ * @param name the name
+ * @return the month if found else Optional.empty()
+ */
+ public static Optional findByName(String name) {
+ return Arrays.stream(values()).filter(month -> month.name().equalsIgnoreCase(name)).findFirst();
+ }
+
+ /**
+ * Find by code.
+ *
+ * @param code the code
+ * @return the month if found else Optional.empty()
+ */
+ public static Optional findByCode(int code) {
+ return Arrays.stream(values()).filter(month -> month.getCode() == code).findFirst();
+ }
+
+ /**
+ * Finds month by value.
+ *
+ * @param value value
+ * @return month if value is valid
+ * @throws IllegalArgumentException if month not found for given value
+ */
+ public static Month findByValue(String value) {
+ return Arrays.stream(values()).filter(month -> month.getValue().equalsIgnoreCase(value)).findFirst().orElseThrow(IllegalArgumentException::new);
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Weekday.java b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Weekday.java
new file mode 100644
index 0000000000..3c1031cde7
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/main/java/com/baeldung/enums/Weekday.java
@@ -0,0 +1,85 @@
+package com.baeldung.enums;
+
+/**
+ * Represents day in a week.
+ */
+public enum Weekday {
+ /**
+ * Monday.
+ */
+ MONDAY("Monday"),
+ /**
+ * Tuesday.
+ */
+ TUESDAY("Tuesday"),
+ /**
+ * Wednesday.
+ */
+ WEDNESDAY("Wednesday"),
+ /**
+ * Thursday.
+ */
+ THURSDAY("Thursday"),
+ /**
+ * Friday.
+ */
+ FRIDAY("Friday"),
+ /**
+ * Saturday.
+ */
+ SATURDAY("Saturday"),
+ /**
+ * Sunday.
+ */
+ SUNDAY("Sunday"),
+ ;
+
+ private final String value;
+
+ Weekday(String value) {
+ this.value = value;
+ }
+
+ /**
+ * Gets value.
+ *
+ * @return the value
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * Find by name.
+ *
+ * @param name the name
+ * @return the weekday if found else null
+ */
+ public static Weekday findByName(String name) {
+ Weekday result = null;
+ for (Weekday day : values()) {
+ if (day.name().equalsIgnoreCase(name)) {
+ result = day;
+ break;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Find by value.
+ *
+ * @param value the value
+ * @return the weekday if found else null
+ */
+ public static Weekday findByValue(String value) {
+ Weekday result = null;
+ for (Weekday day : values()) {
+ if (day.getValue().equalsIgnoreCase(value)) {
+ result = day;
+ break;
+ }
+ }
+ return result;
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/EnumSearcherUnitTest.java b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/EnumSearcherUnitTest.java
new file mode 100644
index 0000000000..2c96837809
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-types-2/src/test/java/com/baeldung/enums/EnumSearcherUnitTest.java
@@ -0,0 +1,89 @@
+package com.baeldung.enums;
+
+import org.assertj.core.api.Assertions;
+import org.junit.Test;
+
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+
+public class EnumSearcherUnitTest {
+
+ @Test
+ public void givenWeekdays_whenValidDirectionNameProvided_directionIsFound() {
+ Direction result = Direction.findByName("EAST");
+ Assertions.assertThat(result).isEqualTo(Direction.EAST);
+ }
+
+ @Test
+ public void givenWeekdays_whenValidDirectionNameLowerCaseProvided_directionIsFound() {
+ Direction result = Direction.findByName("east");
+ Assertions.assertThat(result).isEqualTo(Direction.EAST);
+ }
+
+ @Test
+ public void givenWeekdays_whenInvalidDirectionNameProvided_nullIsReturned() {
+ Direction result = Direction.findByName("E");
+ Assertions.assertThat(result).isNull();
+ }
+
+ @Test
+ public void givenWeekdays_whenValidWeekdayNameProvided_weekdayIsFound() {
+ Weekday result = Weekday.findByName("MONDAY");
+ Assertions.assertThat(result).isEqualTo(Weekday.MONDAY);
+ }
+
+ @Test
+ public void givenWeekdays_whenInvalidWeekdayNameProvided_nullIsReturned() {
+ Weekday result = Weekday.findByName("MON");
+ Assertions.assertThat(result).isNull();
+ }
+
+ @Test
+ public void givenWeekdays_whenValidWeekdayValueProvided_weekdayIsFound() {
+ Weekday result = Weekday.findByValue("Monday");
+ Assertions.assertThat(result).isEqualTo(Weekday.MONDAY);
+ }
+
+ @Test
+ public void givenWeekdays_whenInvalidWeekdayValueProvided_nullIsReturned() {
+ Weekday result = Weekday.findByValue("mon");
+ Assertions.assertThat(result).isNull();
+ }
+
+ @Test
+ public void givenMonths_whenValidMonthNameProvided_optionalMonthIsReturned() {
+ Optional result = Month.findByName("JANUARY");
+ Assertions.assertThat(result).isEqualTo(Optional.of(Month.JANUARY));
+ }
+
+ @Test
+ public void givenMonths_whenInvalidMonthNameProvided_optionalEmptyIsReturned() {
+ Optional result = Month.findByName("JAN");
+ Assertions.assertThat(result).isEmpty();
+ }
+
+ @Test
+ public void givenMonths_whenValidMonthCodeProvided_optionalMonthIsReturned() {
+ Optional result = Month.findByCode(1);
+ Assertions.assertThat(result).isEqualTo(Optional.of(Month.JANUARY));
+ }
+
+ @Test
+ public void givenMonths_whenInvalidMonthCodeProvided_optionalEmptyIsReturned() {
+ Optional result = Month.findByCode(0);
+ Assertions.assertThat(result).isEmpty();
+ }
+
+ @Test
+ public void givenMonths_whenValidMonthValueProvided_monthIsReturned() {
+ Month result = Month.findByValue("January");
+ Assertions.assertThat(result).isEqualTo(Month.JANUARY);
+ }
+
+ @Test
+ public void givenMonths_whenInvalidMonthValueProvided_illegalArgExIsThrown() {
+ assertThatIllegalArgumentException().isThrownBy(() -> Month.findByValue("Jan"));
+ }
+}
diff --git a/core-java-modules/core-java-lang-operators-2/README.md b/core-java-modules/core-java-lang-operators-2/README.md
index bc1809a4a7..480021108d 100644
--- a/core-java-modules/core-java-lang-operators-2/README.md
+++ b/core-java-modules/core-java-lang-operators-2/README.md
@@ -6,3 +6,4 @@ This module contains articles about Java operators
- [Logical vs Bitwise OR Operator](https://www.baeldung.com/java-logical-vs-bitwise-or-operator)
- [Bitmasking in Java with Bitwise Operators](https://www.baeldung.com/java-bitmasking)
+- [Getting a Bit at a Certain Position from Integral Values](https://www.baeldung.com/java-get-bit-at-position)
diff --git a/core-java-modules/core-java-lang-operators-2/pom.xml b/core-java-modules/core-java-lang-operators-2/pom.xml
index 1779b7384c..c36250f1ae 100644
--- a/core-java-modules/core-java-lang-operators-2/pom.xml
+++ b/core-java-modules/core-java-lang-operators-2/pom.xml
@@ -15,19 +15,17 @@
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+ org.projectlomboklombok${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -40,9 +38,4 @@
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java
new file mode 100644
index 0000000000..61f9885a91
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators-2/src/test/java/com/baeldung/getbit/GetABitFromIntegralValueUnitTest.java
@@ -0,0 +1,78 @@
+package com.baeldung.getbit;
+
+import org.junit.Test;
+
+import java.math.BigInteger;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class GetABitFromIntegralValueUnitTest {
+ @Test
+ public void givenAByte_whenUsingAHardCodedMask_thenGetBitValue() {
+ byte val1 = 0b0110_0100;
+ byte val2 = 0b0110_0010;
+ byte mask = 0b0000_0100;
+ boolean isSet1 = (val1 & mask) > 0;
+ boolean isSet2 = (val2 & mask) > 0;
+
+ assertTrue(isSet1);
+ assertFalse(isSet2);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingACalculatedMask_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ int mask = 1 << pos;
+ boolean isSet = (val & mask) > 0;
+
+ assertTrue(isSet);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingALeftShiftedValue1_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ boolean isSet = ((val << (31 - pos)) < 0);
+
+ assertTrue(isSet);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingALeftShiftedValue2_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ boolean isSet = ((val << (~pos & 31)) < 0);
+
+ assertTrue(isSet);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingALeftShiftedValue3_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ boolean isSet = ((val << ~pos) < 0);
+
+ assertTrue(isSet);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingARightShiftedValue_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ boolean isSet = ((val >> pos) & 1) == 1;
+
+ assertTrue(isSet);
+ }
+
+ @Test
+ public void givenAnIntValue_whenUsingBigInteger_thenGetBitValue() {
+ int val = 0b0110_0100;
+ int pos = 2;
+ boolean isSet = BigInteger.valueOf(val).testBit(pos);
+
+ assertTrue(isSet);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
index 63f42917b8..c61fb81354 100644
--- a/core-java-modules/core-java-lang-operators/pom.xml
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -21,13 +21,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -40,9 +33,4 @@
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-syntax/pom.xml b/core-java-modules/core-java-lang-syntax/pom.xml
index da7d56de7b..7cdbc40fbc 100644
--- a/core-java-modules/core-java-lang-syntax/pom.xml
+++ b/core-java-modules/core-java-lang-syntax/pom.xml
@@ -26,13 +26,6 @@
log4j-over-slf4j${org.slf4j.version}
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -45,9 +38,4 @@
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java
index a34dcd3c7e..875b1d0f6d 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java
@@ -7,6 +7,6 @@ public class Building {
private static final Logger LOGGER = LoggerFactory.getLogger(Building.class);
public void paint() {
- LOGGER.info("Painting Building");
+ LOGGER.debug("Painting Building");
}
}
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java
index 88e7d2710a..c1bc6483c4 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java
@@ -7,6 +7,6 @@ public class House extends Building {
private static final Logger LOGGER = LoggerFactory.getLogger(House.class);
public void paint() {
- LOGGER.info("Painting House");
+ LOGGER.debug("Painting House");
}
}
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java
index 1d9a872d69..1604f27368 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java
@@ -1,8 +1,13 @@
package com.baeldung.initializationguide;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.io.Serializable;
public class User implements Serializable, Cloneable {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(User.class);
private static final long serialVersionUID = 1L;
static String forum;
private String name;
@@ -10,12 +15,12 @@ public class User implements Serializable, Cloneable {
{
id = 0;
- System.out.println("Instance Initializer");
+ LOGGER.debug("Instance Initializer");
}
static {
- forum = "Java";
- System.out.println("Static Initializer");
+ forum = "Java";
+ LOGGER.debug("Static Initializer");
}
public User(String name, int id) {
@@ -25,7 +30,7 @@ public class User implements Serializable, Cloneable {
}
public User() {
- System.out.println("Constructor");
+ LOGGER.debug("Constructor");
}
public String getName() {
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java
index 1b2e621b52..cdbcd9e341 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java
@@ -1,12 +1,17 @@
package com.baeldung.loops;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class LoopsInJava {
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoopsInJava.class);
+
public int[] simple_for_loop() {
int[] arr = new int[5];
for (int i = 0; i < 5; i++) {
arr[i] = i;
- System.out.println("Simple for loop: i - " + i);
+ LOGGER.debug("Simple for loop: i - " + i);
}
return arr;
}
@@ -16,7 +21,7 @@ public class LoopsInJava {
int[] arr = new int[5];
for (int num : intArr) {
arr[num] = num;
- System.out.println("Enhanced for-each loop: i - " + num);
+ LOGGER.debug("Enhanced for-each loop: i - " + num);
}
return arr;
}
@@ -26,7 +31,7 @@ public class LoopsInJava {
int[] arr = new int[5];
while (i < 5) {
arr[i] = i;
- System.out.println("While loop: i - " + i++);
+ LOGGER.debug("While loop: i - " + i++);
}
return arr;
}
@@ -36,7 +41,7 @@ public class LoopsInJava {
int[] arr = new int[5];
do {
arr[i] = i;
- System.out.println("Do-While loop: i - " + i++);
+ LOGGER.debug("Do-While loop: i - " + i++);
} while (i < 5);
return arr;
}
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
index 69e151bfcb..55b3cbfaaf 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
@@ -1,7 +1,13 @@
package com.baeldung.switchstatement;
+import com.baeldung.loops.LoopsInJava;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
public class SwitchStatement {
+ private static final Logger LOGGER = LoggerFactory.getLogger(SwitchStatement.class);
+
public String exampleOfIF(String animal) {
String result;
@@ -42,11 +48,11 @@ public class SwitchStatement {
switch (animal) {
case "DOG":
- System.out.println("domestic animal");
+ LOGGER.debug("domestic animal");
result = "domestic animal";
default:
- System.out.println("unknown animal");
+ LOGGER.debug("unknown animal");
result = "unknown animal";
}
diff --git a/guest/spring-mvc/src/main/resources/logback.xml b/core-java-modules/core-java-lang-syntax/src/main/resources/logback.xml
similarity index 100%
rename from guest/spring-mvc/src/main/resources/logback.xml
rename to core-java-modules/core-java-lang-syntax/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
index 5a8b116a2c..354a408af6 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
+++ b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
@@ -8,12 +8,16 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import com.baeldung.initializationguide.User;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class LoopsUnitTest {
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoopsUnitTest.class);
private LoopsInJava loops = new LoopsInJava();
private static List list = new ArrayList<>();
private static Set set = new HashSet<>();
@@ -65,41 +69,44 @@ public class LoopsUnitTest {
@Test
public void whenUsingSimpleFor_shouldIterateList() {
for (int i = 0; i < list.size(); i++) {
- System.out.println(list.get(i));
+ LOGGER.debug(list.get(i));
}
}
@Test
public void whenUsingEnhancedFor_shouldIterateList() {
for (String item : list) {
- System.out.println(item);
+ LOGGER.debug(item);
}
}
@Test
public void whenUsingEnhancedFor_shouldIterateSet() {
for (String item : set) {
- System.out.println(item);
+ LOGGER.debug(item);
}
}
@Test
public void whenUsingEnhancedFor_shouldIterateMap() {
for (Entry entry : map.entrySet()) {
- System.out.println("Key: " + entry.getKey() + " - " + "Value: " + entry.getValue());
+ LOGGER.debug("Key: " + entry.getKey() + " - " + "Value: " + entry.getValue());
}
}
@Test
public void whenUsingSimpleFor_shouldRunLabelledLoop() {
- aa: for (int i = 1; i <= 3; i++) {
- if (i == 1)
+ aa:
+ for (int i = 1; i <= 3; i++) {
+ if (i == 1) {
continue;
- bb: for (int j = 1; j <= 3; j++) {
+ }
+ bb:
+ for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
break aa;
}
- System.out.println(i + " " + j);
+ LOGGER.debug(i + " " + j);
}
}
}
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
index 0035b9c0b7..77f23be97c 100644
--- a/core-java-modules/core-java-networking-2/pom.xml
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -37,7 +37,7 @@
com.icegreengreenmail
- 1.5.8
+ ${greenmail.version}test
@@ -50,6 +50,7 @@
4.5.91.5.0-b012.4.5
+ 1.5.8
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
index bd2024fdfa..3d1e25e7a4 100644
--- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
@@ -1,40 +1,55 @@
package com.baeldung.mail;
-import javax.mail.*;
+import javax.mail.Authenticator;
+import javax.mail.Message;
+import javax.mail.Multipart;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
+import java.net.URI;
import java.util.Properties;
public class EmailService {
- private String host = "";
- private int port = 0;
- private String username = "";
- private String password = "";
+ private String username;
+ private String password;
+ private final Properties prop;
public EmailService(String host, int port, String username, String password) {
-
- this.host = host;
- this.port = port;
- this.username = username;
- this.password = password;
-
- sendMail();
- }
-
- private void sendMail() {
-
- Properties prop = new Properties();
+ prop = new Properties();
prop.put("mail.smtp.auth", true);
prop.put("mail.smtp.starttls.enable", "true");
prop.put("mail.smtp.host", host);
prop.put("mail.smtp.port", port);
prop.put("mail.smtp.ssl.trust", host);
+ this.username = username;
+ this.password = password;
+ }
+
+ public EmailService(String host, int port) {
+ prop = new Properties();
+ prop.put("mail.smtp.host", host);
+ prop.put("mail.smtp.port", port);
+ }
+
+ public static void main(String... args) {
+ try {
+ new EmailService("smtp.mailtrap.io", 25, "87ba3d9555fae8", "91cb4379af43ed")
+ .sendMail();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void sendMail() throws Exception {
+
Session session = Session.getInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
@@ -42,36 +57,35 @@ public class EmailService {
}
});
- try {
+ Message message = new MimeMessage(session);
+ message.setFrom(new InternetAddress("from@gmail.com"));
+ message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@gmail.com"));
+ message.setSubject("Mail Subject");
- Message message = new MimeMessage(session);
- message.setFrom(new InternetAddress("from@gmail.com"));
- message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to@gmail.com"));
- message.setSubject("Mail Subject");
+ String msg = "This is my first email using JavaMailer";
- String msg = "This is my first email using JavaMailer";
+ MimeBodyPart mimeBodyPart = new MimeBodyPart();
+ mimeBodyPart.setContent(msg, "text/html; charset=utf-8");
- MimeBodyPart mimeBodyPart = new MimeBodyPart();
- mimeBodyPart.setContent(msg, "text/html");
+ MimeBodyPart attachmentBodyPart = new MimeBodyPart();
- MimeBodyPart attachmentBodyPart = new MimeBodyPart();
- attachmentBodyPart.attachFile(new File("pom.xml"));
+ attachmentBodyPart.attachFile(getFile());
- Multipart multipart = new MimeMultipart();
- multipart.addBodyPart(mimeBodyPart);
- multipart.addBodyPart(attachmentBodyPart);
+ Multipart multipart = new MimeMultipart();
+ multipart.addBodyPart(mimeBodyPart);
+ multipart.addBodyPart(attachmentBodyPart);
- message.setContent(multipart);
+ message.setContent(multipart);
- Transport.send(message);
-
- } catch (Exception e) {
- e.printStackTrace();
- }
+ Transport.send(message);
}
- public static void main(String ... args) {
- new EmailService("smtp.mailtrap.io", 25, "87ba3d9555fae8", "91cb4379af43ed");
+ private File getFile() throws Exception {
+ URI uri = this.getClass()
+ .getClassLoader()
+ .getResource("attachment.txt")
+ .toURI();
+ return new File(uri);
}
}
diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java
index 7d4dc57f10..fbe8a54bbe 100644
--- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentService.java
@@ -1,8 +1,5 @@
package com.baeldung.mail.mailwithattachment;
-import java.io.File;
-import java.io.IOException;
-import java.util.Properties;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
@@ -10,23 +7,23 @@ import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
-import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Properties;
public class MailWithAttachmentService {
- private String username = "";
- private String password = "";
- private String host = "";
- private String port = "";
+ private final String username;
+ private final String password;
+ private final String host;
+ private final int port;
- MailWithAttachmentService() {
- }
-
- MailWithAttachmentService(String username, String password, String host, String port) {
+ MailWithAttachmentService(String username, String password, String host, int port) {
this.username = username;
this.password = password;
this.host = host;
@@ -40,15 +37,14 @@ public class MailWithAttachmentService {
props.put("mail.smtp.host", this.host);
props.put("mail.smtp.port", this.port);
- Session session = Session.getInstance(props, new javax.mail.Authenticator() {
+ return Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
- return session;
}
- public Message createMail(Session session) throws AddressException, MessagingException, IOException {
+ public void sendMail(Session session) throws MessagingException, IOException {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("mail@gmail.com"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("mail@gmail.com"));
@@ -61,23 +57,27 @@ public class MailWithAttachmentService {
multipart.addBodyPart(messageBodyPart);
MimeBodyPart attachmentPart = new MimeBodyPart();
- MimeBodyPart attachmentPart2 = new MimeBodyPart();
-
- attachmentPart.attachFile(new File("C:\\Document1.txt"));
- attachmentPart2.attachFile(new File("C:\\Document2.txt"));
-
+ attachmentPart.attachFile(getFile("attachment.txt"));
multipart.addBodyPart(attachmentPart);
+
+ MimeBodyPart attachmentPart2 = new MimeBodyPart();
+ attachmentPart2.attachFile(getFile("attachment2.txt"));
multipart.addBodyPart(attachmentPart2);
message.setContent(multipart);
-
- return message;
- }
-
- public void sendMail(Session session) throws MessagingException, IOException {
-
- Message message = createMail(session);
Transport.send(message);
}
-}
\ No newline at end of file
+ private File getFile(String filename) {
+ try {
+ URI uri = this.getClass()
+ .getClassLoader()
+ .getResource(filename)
+ .toURI();
+ return new File(uri);
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Unable to find file from resources: " + filename);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt b/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt
new file mode 100644
index 0000000000..a726ded018
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/main/resources/attachment.txt
@@ -0,0 +1 @@
+sample attachment content
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-2/src/main/resources/attachment2.txt b/core-java-modules/core-java-networking-2/src/main/resources/attachment2.txt
new file mode 100644
index 0000000000..14c8ea9ff9
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/main/resources/attachment2.txt
@@ -0,0 +1 @@
+sample attachment content 2
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java
new file mode 100644
index 0000000000..7f543bc612
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/EmailServiceLiveTest.java
@@ -0,0 +1,60 @@
+package com.baeldung.mail;
+
+import com.icegreen.greenmail.junit.GreenMailRule;
+import com.icegreen.greenmail.util.ServerSetupTest;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+public class EmailServiceLiveTest {
+
+ @Rule
+ public final GreenMailRule greenMail = new GreenMailRule(ServerSetupTest.SMTP);
+
+ private EmailService emailService;
+
+ @Before
+ public void setup() {
+ emailService = new EmailService("localhost", greenMail.getSmtp().getPort());
+ }
+
+ @Test
+ public void givenEmailMessageWithAttachment_whenEmailIsSent_MessageIsReceived() throws Exception {
+
+ emailService.sendMail();
+
+ MimeMessage[] receivedMessages = greenMail.getReceivedMessages();
+ assertEquals(1, receivedMessages.length);
+
+ MimeMessage receivedMessage = receivedMessages[0];
+ assertEquals("Mail Subject", subjectFromMessage(receivedMessage));
+ assertEquals("This is my first email using JavaMailer", emailTextFrom(receivedMessage));
+ assertEquals("sample attachment content", attachmentContentsFrom(receivedMessage));
+ }
+
+ private static String subjectFromMessage(MimeMessage receivedMessage) throws MessagingException {
+ return receivedMessage.getSubject();
+ }
+
+ private static String emailTextFrom(MimeMessage receivedMessage) throws IOException, MessagingException {
+ return ((MimeMultipart) receivedMessage.getContent())
+ .getBodyPart(0)
+ .getContent()
+ .toString();
+ }
+
+ private static String attachmentContentsFrom(MimeMessage receivedMessage) throws Exception {
+ return ((MimeMultipart) receivedMessage.getContent())
+ .getBodyPart(1)
+ .getContent()
+ .toString();
+ }
+
+}
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java
index ef82657ab5..04ad47875f 100644
--- a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/mail/mailwithattachment/MailWithAttachmentServiceLiveTest.java
@@ -1,48 +1,77 @@
package com.baeldung.mail.mailwithattachment;
-import static org.junit.Assert.*;
-import javax.annotation.Resource;
-import javax.mail.Session;
-
-import org.junit.After;
+import com.icegreen.greenmail.configuration.GreenMailConfiguration;
+import com.icegreen.greenmail.junit.GreenMailRule;
+import com.icegreen.greenmail.util.GreenMailUtil;
+import com.icegreen.greenmail.util.ServerSetupTest;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
-import com.baeldung.mail.mailwithattachment.MailWithAttachmentService;
-import com.icegreen.greenmail.util.GreenMail;
-import com.icegreen.greenmail.util.ServerSetupTest;
+import javax.annotation.Resource;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import static org.junit.Assert.assertEquals;
public class MailWithAttachmentServiceLiveTest {
+ private static final String USERNAME = "testUser";
+ private static final String PASSWORD = "password";
+ private static final String HOSTNAME = "localhost";
+
+ @Rule
+ public final GreenMailRule greenMail = new GreenMailRule(ServerSetupTest.SMTP)
+ .withConfiguration(
+ GreenMailConfiguration.aConfig()
+ .withUser(USERNAME, PASSWORD)
+ );
+
@Resource
private MailWithAttachmentService emailService;
- private GreenMail greenMail;
@Before
- public void startMailServer() {
- emailService = new MailWithAttachmentService();
- greenMail = new GreenMail(ServerSetupTest.SMTP);
- greenMail.start();
- }
-
- @After
- public void stopMailServer() {
- greenMail.stop();
- emailService = null;
+ public void setup() {
+ emailService = new MailWithAttachmentService(
+ USERNAME, PASSWORD, HOSTNAME, greenMail.getSmtp().getPort()
+ );
}
@Test
- public void canSendMail() {
- try {
- Session testSession = greenMail.getSmtp()
- .createSession();
- emailService.sendMail(testSession);
- assertEquals(1, greenMail.getReceivedMessages().length);
-
- } catch (Exception e) {
- e.printStackTrace();
- }
+ public void givenEmailService_whenMessageSentWithAttachments_thenMessageIsReceived() throws Exception {
+ Session tlsSession = emailService.getSession();
+ emailService.sendMail(tlsSession);
+
+ MimeMessage[] receivedMessages = greenMail.getReceivedMessages();
+ assertEquals(1, receivedMessages.length);
+
+ MimeMessage receivedMessage = receivedMessages[0];
+ assertEquals("Testing Subject", subjectFrom(receivedMessage));
+ assertEquals("This is message body", emailTextFrom(receivedMessage));
+ assertEquals("sample attachment content", attachment1ContentsFrom(receivedMessage));
+ assertEquals("sample attachment content 2", attachment2ContentsFrom(receivedMessage));
+ }
+
+ private static String subjectFrom(MimeMessage receivedMessage) throws MessagingException {
+ return receivedMessage.getSubject();
+ }
+
+ private static String emailTextFrom(MimeMessage receivedMessage) throws Exception {
+ return GreenMailUtil.getBody(((MimeMultipart) receivedMessage.getContent())
+ .getBodyPart(0));
+ }
+
+ private static String attachment1ContentsFrom(MimeMessage receivedMessage) throws Exception {
+ return GreenMailUtil.getBody(((MimeMultipart) receivedMessage.getContent())
+ .getBodyPart(1));
+ }
+
+ private static String attachment2ContentsFrom(MimeMessage receivedMessage) throws Exception {
+ return GreenMailUtil.getBody(((MimeMultipart) receivedMessage.getContent())
+ .getBodyPart(2));
}
}
diff --git a/core-java-modules/core-java-networking-3/README.md b/core-java-modules/core-java-networking-3/README.md
index 0dc9ad9f70..82e75820ba 100644
--- a/core-java-modules/core-java-networking-3/README.md
+++ b/core-java-modules/core-java-networking-3/README.md
@@ -9,4 +9,5 @@ This module contains articles about networking in Java
- [Connection Timeout vs. Read Timeout for Java Sockets](https://www.baeldung.com/java-socket-connection-read-timeout)
- [Find Whether an IP Address Is in the Specified Range or Not in Java](https://www.baeldung.com/java-check-ip-address-range)
- [Find the IP Address of a Client Connected to a Server](https://www.baeldung.com/java-client-get-ip-address)
+- [Unix Domain Socket in Java 16](https://www.baeldung.com/java-unix-domain-socket)
- [[<-- Prev]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking-3/pom.xml b/core-java-modules/core-java-networking-3/pom.xml
index de2408ec0d..297d665544 100644
--- a/core-java-modules/core-java-networking-3/pom.xml
+++ b/core-java-modules/core-java-networking-3/pom.xml
@@ -29,22 +29,10 @@
tomcat-embed-core${tomcat.embeded.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- junit
- junit
- 4.11
- test
- com.sun.mailjavax.mail
- 1.6.2
+ ${javax.mail.version}
@@ -76,16 +64,26 @@
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 16
+ 16
+
+
+ 5.2.8.RELEASE9.4.31.v2020072310.0.0-M7
- 3.11.15.3.31.320.17
+ 1.6.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketClient.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketClient.java
new file mode 100644
index 0000000000..2a8ae05628
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketClient.java
@@ -0,0 +1,49 @@
+package com.baeldung.socket;
+
+import java.io.IOException;
+import java.net.StandardProtocolFamily;
+import java.net.UnixDomainSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.nio.file.Path;
+
+class UnixDomainSocketClient {
+
+ public static void main(String[] args) throws Exception {
+ new UnixDomainSocketClient().runClient();
+ }
+
+ void runClient() throws IOException {
+ Path socketPath = Path.of(System.getProperty("user.home"))
+ .resolve("baeldung.socket");
+ UnixDomainSocketAddress socketAddress = getAddress(socketPath);
+
+ SocketChannel channel = openSocketChannel(socketAddress);
+
+ String message = "Hello from Baeldung Unix domain socket article";
+ writeMessage(channel, message);
+ }
+
+ UnixDomainSocketAddress getAddress(Path socketPath) {
+ return UnixDomainSocketAddress.of(socketPath);
+ }
+
+ SocketChannel openSocketChannel(UnixDomainSocketAddress socketAddress) throws IOException {
+ SocketChannel channel = SocketChannel
+ .open(StandardProtocolFamily.UNIX);
+ channel.connect(socketAddress);
+ return channel;
+ }
+
+ void writeMessage(SocketChannel socketChannel, String message) throws IOException {
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ buffer.clear();
+ buffer.put(message.getBytes());
+ buffer.flip();
+
+ while (buffer.hasRemaining()) {
+ socketChannel.write(buffer);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketServer.java b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketServer.java
new file mode 100644
index 0000000000..c3093ae00c
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/main/java/com/baeldung/socket/UnixDomainSocketServer.java
@@ -0,0 +1,57 @@
+package com.baeldung.socket;
+
+import java.io.IOException;
+import java.net.StandardProtocolFamily;
+import java.net.UnixDomainSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Optional;
+
+class UnixDomainSocketServer {
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ new UnixDomainSocketServer().runServer();
+ }
+
+ void runServer() throws IOException, InterruptedException {
+ Path socketPath = Path.of(System.getProperty("user.home"))
+ .resolve("baeldung.socket");
+ Files.deleteIfExists(socketPath);
+ UnixDomainSocketAddress socketAddress = getAddress(socketPath);
+
+ ServerSocketChannel serverChannel = createServerSocketChannel(socketAddress);
+
+ SocketChannel channel = serverChannel.accept();
+
+ while (true) {
+ readSocketMessage(channel)
+ .ifPresent(message -> System.out.printf("[Client message] %s%n", message));
+ Thread.sleep(100);
+ }
+ }
+
+ UnixDomainSocketAddress getAddress(Path socketPath) {
+ return UnixDomainSocketAddress.of(socketPath);
+ }
+
+ ServerSocketChannel createServerSocketChannel(UnixDomainSocketAddress socketAddress) throws IOException {
+ ServerSocketChannel serverChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX);
+ serverChannel.bind(socketAddress);
+ return serverChannel;
+ }
+
+ Optional readSocketMessage(SocketChannel channel) throws IOException {
+ ByteBuffer buffer = ByteBuffer.allocate(1024);
+ int bytesRead = channel.read(buffer);
+ if (bytesRead < 0) return Optional.empty();
+ byte[] bytes = new byte[bytesRead];
+ buffer.flip();
+ buffer.get(bytes);
+ String message = new String(bytes);
+ return Optional.of(message);
+ }
+
+}
\ No newline at end of file
diff --git a/guest/spring-security/src/main/resources/logback.xml b/core-java-modules/core-java-networking-3/src/main/resources/logback.xml
similarity index 100%
rename from guest/spring-security/src/main/resources/logback.xml
rename to core-java-modules/core-java-networking-3/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java
index 95530ef292..4dfc114438 100644
--- a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/FindFreePortUnitTest.java
@@ -4,36 +4,26 @@ import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
-import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.util.SocketUtils;
import java.io.IOException;
import java.net.ServerSocket;
-import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
public class FindFreePortUnitTest {
- private static int FREE_PORT_NUMBER;
- private static int[] FREE_PORT_RANGE;
-
- @BeforeAll
- public static void getExplicitFreePortNumberAndRange() {
- try (ServerSocket serverSocket = new ServerSocket(0)) {
- FREE_PORT_NUMBER = serverSocket.getLocalPort();
- FREE_PORT_RANGE = new int[] {FREE_PORT_NUMBER, FREE_PORT_NUMBER + 1, FREE_PORT_NUMBER + 2};
- } catch (IOException e) {
- fail("No free port is available");
- }
- }
+ private static final int DEFAULT_RANDOM_PORT = 34307;
@Test
public void givenExplicitFreePort_whenCreatingServerSocket_thenThatPortIsAssigned() {
- try (ServerSocket serverSocket = new ServerSocket(FREE_PORT_NUMBER)) {
+ int freePort = getFreePort();
+
+ try (ServerSocket serverSocket = new ServerSocket(freePort)) {
assertThat(serverSocket).isNotNull();
- assertThat(serverSocket.getLocalPort()).isEqualTo(FREE_PORT_NUMBER);
+ assertThat(serverSocket.getLocalPort()).isEqualTo(freePort);
} catch (IOException e) {
fail("Port is not available");
}
@@ -41,8 +31,10 @@ public class FindFreePortUnitTest {
@Test
public void givenExplicitOccupiedPort_whenCreatingServerSocket_thenExceptionIsThrown() {
- try (ServerSocket serverSocket = new ServerSocket(FREE_PORT_NUMBER)) {
- new ServerSocket(FREE_PORT_NUMBER);
+ int freePort = getFreePort();
+
+ try (ServerSocket serverSocket = new ServerSocket(freePort)) {
+ new ServerSocket(freePort);
fail("Same port cannot be used twice");
} catch (IOException e) {
assertThat(e).hasMessageContaining("Address already in use");
@@ -51,7 +43,7 @@ public class FindFreePortUnitTest {
@Test
public void givenExplicitPortRange_whenCreatingServerSocket_thenOnePortIsAssigned() {
- for (int port : FREE_PORT_RANGE) {
+ for (int port : getFreePorts()) {
try (ServerSocket serverSocket = new ServerSocket(port)) {
assertThat(serverSocket).isNotNull();
assertThat(serverSocket.getLocalPort()).isEqualTo(port);
@@ -104,11 +96,12 @@ public class FindFreePortUnitTest {
public void givenExplicitFreePort_whenCreatingJettyServer_thenThatPortIsAssigned() throws Exception {
Server jettyServer = new Server();
ServerConnector serverConnector = new ServerConnector(jettyServer);
- serverConnector.setPort(FREE_PORT_NUMBER);
+ int freePort = getFreePort();
+ serverConnector.setPort(freePort);
jettyServer.addConnector(serverConnector);
try {
jettyServer.start();
- assertThat(serverConnector.getLocalPort()).isEqualTo(FREE_PORT_NUMBER);
+ assertThat(serverConnector.getLocalPort()).isEqualTo(freePort);
} catch (Exception e) {
fail("Failed to start Jetty server");
} finally {
@@ -135,10 +128,11 @@ public class FindFreePortUnitTest {
@Test
public void givenExplicitFreePort_whenCreatingTomcatServer_thenThatPortIsAssigned() throws Exception {
Tomcat tomcatServer = new Tomcat();
- tomcatServer.setPort(FREE_PORT_NUMBER);
+ int freePort = getFreePort();
+ tomcatServer.setPort(freePort);
try {
tomcatServer.start();
- assertThat(tomcatServer.getConnector().getLocalPort()).isEqualTo(FREE_PORT_NUMBER);
+ assertThat(tomcatServer.getConnector().getLocalPort()).isEqualTo(freePort);
} catch (LifecycleException e) {
fail("Failed to start Tomcat server");
} finally {
@@ -147,4 +141,16 @@ public class FindFreePortUnitTest {
}
}
+ private int[] getFreePorts() {
+ int freePort = getFreePort();
+ return new int[]{freePort - 1, freePort, freePort + 1};
+ }
+
+ private int getFreePort() {
+ try(ServerSocket serverSocket = new ServerSocket(0)){
+ return serverSocket.getLocalPort();
+ } catch (IOException ex){
+ return DEFAULT_RANDOM_PORT;
+ }
+ }
}
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketClientUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketClientUnitTest.java
new file mode 100644
index 0000000000..8cd2ee94d4
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketClientUnitTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.socket;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.stubbing.Answer;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.StandardProtocolFamily;
+import java.net.UnixDomainSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+import java.nio.file.Path;
+import java.util.UUID;
+
+import static java.nio.file.Files.deleteIfExists;
+import static org.assertj.core.util.Files.newTemporaryFile;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class UnixDomainSocketClientUnitTest {
+
+ @Test
+ public void givenSocketPath_shouldCreateUnixDomainSocketAddress() {
+ // given
+ File tempFile = newTemporaryFile();
+ Path socketPath = tempFile.toPath();
+
+ // when
+ UnixDomainSocketAddress address = new UnixDomainSocketClient().getAddress(socketPath);
+
+ // then
+ assertEquals(address.getPath(), socketPath);
+
+ // cleanup
+ tempFile.delete();
+ }
+
+ @Test
+ public void givenUnixDomainSocketAddress_shouldOpenSocketChannel() throws IOException {
+ // given
+ File tempFile = newTemporaryFile();
+ Path socketPath = tempFile.toPath();
+ deleteIfExists(socketPath);
+ UnixDomainSocketAddress address = UnixDomainSocketAddress.of(socketPath);
+
+ // bind address as a unix domain socket
+ ServerSocketChannel serverChannel = ServerSocketChannel.open(StandardProtocolFamily.UNIX);
+ serverChannel.bind(address);
+
+ // when
+ SocketChannel socketChannel = new UnixDomainSocketClient().openSocketChannel(address);
+
+ // then
+ assertTrue(socketChannel.isOpen());
+ assertEquals(socketChannel.getRemoteAddress(), address);
+
+ // cleanup
+ tempFile.delete();
+ }
+
+ @Test
+ public void givenSocketChannelAndMessage_shouldWriteMessage() throws IOException {
+ // given
+ SocketChannel socketChannel = Mockito.mock(SocketChannel.class);
+ String message = UUID.randomUUID().toString();
+ Mockito.when(socketChannel.write(Mockito.any(ByteBuffer.class)))
+ .thenAnswer(
+ (Answer) invocationOnMock -> {
+ ((ByteBuffer) invocationOnMock.getArguments()[0]).position(message.getBytes().length);
+ return -1;
+ }
+ );
+
+ // when
+ new UnixDomainSocketClient().writeMessage(socketChannel, message);
+
+ // then
+ Mockito.verify(socketChannel, Mockito.times(1)).write(Mockito.any(ByteBuffer.class));
+ }
+}
diff --git a/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketServerUnitTest.java b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketServerUnitTest.java
new file mode 100644
index 0000000000..1d0a68ac2f
--- /dev/null
+++ b/core-java-modules/core-java-networking-3/src/test/java/com/baeldung/socket/UnixDomainSocketServerUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.socket;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.UnixDomainSocketAddress;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.file.Path;
+
+import static java.nio.file.Files.deleteIfExists;
+import static org.assertj.core.util.Files.newTemporaryFile;
+import static org.junit.Assert.assertEquals;
+
+public class UnixDomainSocketServerUnitTest {
+
+ @Test
+ public void givenSocketPath_shouldCreateUnixDomainSocketAddress() {
+ // given
+ File tempFile = newTemporaryFile();
+ Path socketPath = tempFile.toPath();
+
+ // when
+ UnixDomainSocketAddress address = new UnixDomainSocketServer().getAddress(socketPath);
+
+ // then
+ assertEquals(address.getPath(), socketPath);
+
+ // cleanup
+ tempFile.delete();
+ }
+
+ @Test
+ public void givenUnixDomainSocketAddress_shouldCreateServerSocketChannel() throws IOException {
+ // given
+ File tempFile = newTemporaryFile();
+ Path socketPath = tempFile.toPath();
+ deleteIfExists(socketPath);
+ UnixDomainSocketAddress address = UnixDomainSocketAddress.of(socketPath);
+
+ // when
+ ServerSocketChannel serverSocketChannel = new UnixDomainSocketServer().createServerSocketChannel(address);
+
+ // then
+ assertEquals(serverSocketChannel.getLocalAddress(), address);
+
+ // cleanup
+ tempFile.delete();
+ }
+}
diff --git a/core-java-modules/core-java-nio-2/pom.xml b/core-java-modules/core-java-nio-2/pom.xml
index f9cf1f3060..eb56c2bf68 100644
--- a/core-java-modules/core-java-nio-2/pom.xml
+++ b/core-java-modules/core-java-nio-2/pom.xml
@@ -14,13 +14,4 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- 3.6.1
- test
-
-
-
\ No newline at end of file
diff --git a/guest/thread-pools/src/main/resources/logback.xml b/core-java-modules/core-java-nio-2/src/main/resources/logback.xml
similarity index 100%
rename from guest/thread-pools/src/main/resources/logback.xml
rename to core-java-modules/core-java-nio-2/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index dd5217df74..08441f6cee 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -45,29 +45,16 @@
jmh-generator-bytecode${jmh-generator.version}
-
- com.google.guava
- guava
- ${guava.version}
- io.rest-assuredjson-path${rest-assured.version}test
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- 5.4.0.Final
- 27.1-jre
- 3.10.03.1.1
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index 572000a714..0c6c921df9 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -1,100 +1,87 @@
- 4.0.0
- core-java-os
- 0.1.0-SNAPSHOT
- core-java-os
- jar
+ 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-os
+ 0.1.0-SNAPSHOT
+ core-java-os
+ jar
-
- com.baeldung.core-java-modules
- core-java-modules
- 0.0.1-SNAPSHOT
- ../
-
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit-jupiter-engine.version}
- test
-
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- log4j
- log4j
- ${log4j.version}
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.unix4j
- unix4j-command
- ${unix4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
-
-
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
-
- core-java-os
-
-
- src/main/resources
- true
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
+
+ core-java-os
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
-
-
- 4.1
- 4.01
-
- 3.6.1
- 1.8.9
- 1.9
- 1.9
- 25.1-jre
- 0.4
- 1.8.7
- 5.7.2
-
+
+ 4.01
+ 1.8.9
+ 1.9
+ 1.9
+ 0.4
+ 1.8.7
+ 1.18.22
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
index 38f21320e3..27bc750d8a 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/example/soundapi/AppUnitTest.java
@@ -1,5 +1,6 @@
package com.baeldung.example.soundapi;
+import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
@@ -37,6 +38,7 @@ public class AppUnitTest {
}
@Test
+ @Disabled
public void Given_TargetLineDataObject_When_Run_Then_GeneratesOutputStream() {
soundRecorder.setFormat(af);
@@ -52,6 +54,7 @@ public class AppUnitTest {
}
@Test
+ @Disabled
public void Given_AudioInputStream_When_NotNull_Then_SaveToWavFile() {
soundRecorder.setFormat(af);
soundRecorder.build(af);
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
index 53e9364207..9d24dd1578 100644
--- a/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
@@ -1,12 +1,23 @@
-package com.baeldung.java.shell;
+package com.baeldung.shell;
+import org.junit.After;
import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
+import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+
public class JavaProcessUnitIntegrationTest {
private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().startsWith("windows");
@@ -29,6 +40,18 @@ public class JavaProcessUnitIntegrationTest {
private String homeDirectory = System.getProperty("user.home");
+ private ExecutorService executorService;
+
+ @Before
+ public void setUp() {
+ executorService = Executors.newSingleThreadExecutor();
+ }
+
+ @After
+ public void tearDown() {
+ executorService.shutdown();
+ }
+
@Test
public void givenProcess_whenCreatingViaRuntime_shouldSucceed() throws Exception {
Process process;
@@ -38,9 +61,13 @@ public class JavaProcessUnitIntegrationTest {
process = Runtime.getRuntime().exec(String.format("sh -c ls %s", homeDirectory));
}
StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), consumer);
- Executors.newSingleThreadExecutor().submit(streamGobbler);
+
+ Future> future = executorService.submit(streamGobbler);
int exitCode = process.waitFor();
- Assert.assertEquals(0, exitCode);
+
+ // verify the stream output from the process
+ assertDoesNotThrow(() -> future.get(10, TimeUnit.SECONDS));
+ assertEquals(0, exitCode);
}
@Test
@@ -54,8 +81,12 @@ public class JavaProcessUnitIntegrationTest {
builder.directory(new File(homeDirectory));
Process process = builder.start();
StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), consumer);
- Executors.newSingleThreadExecutor().submit(streamGobbler);
+
+ Future> future = executorService.submit(streamGobbler);
int exitCode = process.waitFor();
- Assert.assertEquals(0, exitCode);
+
+ // verify the stream output from the process
+ assertDoesNotThrow(() -> future.get(10, TimeUnit.SECONDS));
+ assertEquals(0, exitCode);
}
}
diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md
index d52fd2d733..e09f8bb6fc 100644
--- a/core-java-modules/core-java-perf/README.md
+++ b/core-java-modules/core-java-perf/README.md
@@ -11,3 +11,4 @@ This module contains articles about performance of Java applications
- [Monitoring Java Applications with Flight Recorder](https://www.baeldung.com/java-flight-recorder-monitoring)
- [Branch Prediction in Java](https://www.baeldung.com/java-branch-prediction)
- [Capturing a Java Thread Dump](https://www.baeldung.com/java-thread-dump)
+- [JMX Ports](https://www.baeldung.com/jmx-ports)
diff --git a/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXConfiguration.java b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXConfiguration.java
new file mode 100644
index 0000000000..e60ea253ed
--- /dev/null
+++ b/core-java-modules/core-java-perf/src/main/java/com/baeldung/jmx/JMXConfiguration.java
@@ -0,0 +1,10 @@
+package com.baeldung.jmx;
+
+public class JMXConfiguration {
+
+ public static void main(String[] args) {
+ while (true) {
+ // to ensure application does not terminate
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection-2/README.md b/core-java-modules/core-java-reflection-2/README.md
index 4c888bdf58..c1966dd63d 100644
--- a/core-java-modules/core-java-reflection-2/README.md
+++ b/core-java-modules/core-java-reflection-2/README.md
@@ -6,3 +6,4 @@
- [Checking if a Java Class is ‘abstract’ Using Reflection](https://www.baeldung.com/java-reflection-is-class-abstract)
- [Invoking a Private Method in Java](https://www.baeldung.com/java-call-private-method)
- [Finding All Classes in a Java Package](https://www.baeldung.com/java-find-all-classes-in-package)
+- [Invoke a Static Method Using Java Reflection API](https://www.baeldung.com/java-invoke-static-method-reflection)
diff --git a/core-java-modules/core-java-reflection-2/pom.xml b/core-java-modules/core-java-reflection-2/pom.xml
index 75168936a7..2cb6d722a8 100644
--- a/core-java-modules/core-java-reflection-2/pom.xml
+++ b/core-java-modules/core-java-reflection-2/pom.xml
@@ -24,12 +24,7 @@
org.reflectionsreflections
- 0.9.12
-
-
- com.google.guava
- guava
- 30.1.1-jre
+ ${reflections.version}
@@ -56,7 +51,7 @@
- 3.8.0
+ 0.9.121.81.85.3.4
diff --git a/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/staticmethods/GreetingAndBye.java b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/staticmethods/GreetingAndBye.java
new file mode 100644
index 0000000000..471ed1ee5b
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/main/java/com/baeldung/reflection/access/staticmethods/GreetingAndBye.java
@@ -0,0 +1,12 @@
+package com.baeldung.reflection.access.staticmethods;
+
+public class GreetingAndBye {
+
+ public static String greeting(String name) {
+ return String.format("Hey %s, nice to meet you!", name);
+ }
+
+ private static String goodBye(String name) {
+ return String.format("Bye %s, see you next time.", name);
+ }
+}
diff --git a/guest/tomcat-app/src/main/resources/logback.xml b/core-java-modules/core-java-reflection-2/src/main/resources/logback.xml
similarity index 100%
rename from guest/tomcat-app/src/main/resources/logback.xml
rename to core-java-modules/core-java-reflection-2/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/check/abstractclass/GreetingAndByeClassUnitTest.java b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/check/abstractclass/GreetingAndByeClassUnitTest.java
new file mode 100644
index 0000000000..da82d2370c
--- /dev/null
+++ b/core-java-modules/core-java-reflection-2/src/test/java/com/baeldung/reflection/check/abstractclass/GreetingAndByeClassUnitTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.reflection.check.abstractclass;
+
+import com.baeldung.reflection.access.staticmethods.GreetingAndBye;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+class GreetingAndByeUnitTest {
+
+ @Test
+ void givenPublicStaticMethod_whenCallWithReflection_thenReturnExpectedResult() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ Class clazz = GreetingAndBye.class;
+ Method method = clazz.getMethod("greeting", String.class);
+ Object result = method.invoke(null, "Eric");
+ Assertions.assertEquals("Hey Eric, nice to meet you!", result);
+ }
+
+ @Test
+ void givenPrivateStaticMethod_whenCallWithReflection_thenReturnExpectedResult() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+ Class clazz = GreetingAndBye.class;
+ Method method = clazz.getDeclaredMethod("goodBye", String.class);
+ method.setAccessible(true);
+ Object result = method.invoke(null, "Eric");
+ Assertions.assertEquals("Bye Eric, see you next time.", result);
+ }
+}
diff --git a/core-java-modules/core-java-reflection/README.md b/core-java-modules/core-java-reflection/README.md
index 62d8719981..7c3ef69012 100644
--- a/core-java-modules/core-java-reflection/README.md
+++ b/core-java-modules/core-java-reflection/README.md
@@ -3,7 +3,6 @@
- [Void Type in Java](https://www.baeldung.com/java-void-type)
- [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields)
- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection)
-- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params)
- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies)
- [What Causes java.lang.reflect.InvocationTargetException?](https://www.baeldung.com/java-lang-reflect-invocationtargetexception)
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index b28ecccb80..1706bf3c45 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -14,14 +14,6 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
-
-
-
core-java-reflection
@@ -45,8 +37,6 @@
- 3.8.0
- 3.10.01.81.8
diff --git a/core-java-modules/core-java-regex-2/README.md b/core-java-modules/core-java-regex-2/README.md
index 25656c3cb1..6dafc74d41 100644
--- a/core-java-modules/core-java-regex-2/README.md
+++ b/core-java-modules/core-java-regex-2/README.md
@@ -3,3 +3,5 @@
- [Non-Capturing Regex Groups in Java](https://www.baeldung.com/java-regex-non-capturing-groups)
- [Lookahead and Lookbehind in Java Regex](https://www.baeldung.com/java-regex-lookahead-lookbehind)
- [Converting Camel Case and Title Case to Words in Java](https://www.baeldung.com/java-camel-case-title-case-to-words)
+- [How to Use Regular Expressions to Replace Tokens in Strings in Java](https://www.baeldung.com/java-regex-token-replacement)
+- More articles: [[<-- prev]](/core-java-modules/core-java-regex)
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex-2/pom.xml b/core-java-modules/core-java-regex-2/pom.xml
index a47c0ff357..ae9385e63c 100644
--- a/core-java-modules/core-java-regex-2/pom.xml
+++ b/core-java-modules/core-java-regex-2/pom.xml
@@ -14,17 +14,4 @@
0.0.1-SNAPSHOT
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
- 3.15.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex/src/main/java/com/baeldung/replacetokens/ReplacingTokens.java b/core-java-modules/core-java-regex-2/src/main/java/com/baeldung/replacetokens/ReplacingTokens.java
similarity index 100%
rename from core-java-modules/core-java-regex/src/main/java/com/baeldung/replacetokens/ReplacingTokens.java
rename to core-java-modules/core-java-regex-2/src/main/java/com/baeldung/replacetokens/ReplacingTokens.java
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/replacetokens/ReplacingTokensUnitTest.java b/core-java-modules/core-java-regex-2/src/test/java/com/baeldung/replacetokens/ReplacingTokensUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-regex/src/test/java/com/baeldung/replacetokens/ReplacingTokensUnitTest.java
rename to core-java-modules/core-java-regex-2/src/test/java/com/baeldung/replacetokens/ReplacingTokensUnitTest.java
diff --git a/core-java-modules/core-java-regex/README.md b/core-java-modules/core-java-regex/README.md
index 4c78f64d75..51c04af6ba 100644
--- a/core-java-modules/core-java-regex/README.md
+++ b/core-java-modules/core-java-regex/README.md
@@ -9,9 +9,9 @@
- [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char)
- [Pre-compile Regex Patterns Into Pattern Objects](https://www.baeldung.com/java-regex-pre-compile)
- [Difference Between Java Matcher find() and matches()](https://www.baeldung.com/java-matcher-find-vs-matches)
-- [How to Use Regular Expressions to Replace Tokens in Strings in Java](https://www.baeldung.com/java-regex-token-replacement)
- [Regular Expressions \s and \s+ in Java](https://www.baeldung.com/java-regex-s-splus)
- [Validate Phone Numbers With Java Regex](https://www.baeldung.com/java-regex-validate-phone-numbers)
- [How to Count the Number of Matches for a Regex?](https://www.baeldung.com/java-count-regex-matches)
- [Find All Numbers in a String in Java](https://www.baeldung.com/java-find-numbers-in-string)
- [Understanding the Pattern.quote Method](https://www.baeldung.com/java-pattern-quote)
+- More articles: [[next -->]](/core-java-modules/core-java-regex-2)
diff --git a/core-java-modules/core-java-regex/pom.xml b/core-java-modules/core-java-regex/pom.xml
index 3fb63fb42a..93f3ae3cdb 100644
--- a/core-java-modules/core-java-regex/pom.xml
+++ b/core-java-modules/core-java-regex/pom.xml
@@ -25,12 +25,6 @@
jmh-generator-annprocess${jmh-core.version}
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -43,8 +37,4 @@
-
- 3.15.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/matcher/MatcherUnitTest.java b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/matcher/MatcherUnitTest.java
index 304b9f2f1d..7ec4a1ae58 100644
--- a/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/matcher/MatcherUnitTest.java
+++ b/core-java-modules/core-java-regex/src/test/java/com/baeldung/regex/matcher/MatcherUnitTest.java
@@ -11,6 +11,9 @@ import org.junit.jupiter.api.Test;
public class MatcherUnitTest {
+ private static final String STRING_INPUT = "test+";
+ private static final String REGEX = "\\+";
+
@Test
public void whenFindFourDigitWorks_thenCorrect() {
Pattern stringPattern = Pattern.compile("\\d\\d\\d\\d");
@@ -60,4 +63,16 @@ public class MatcherUnitTest {
assertTrue(m.matches());// matches will always return the same return
}
+ @Test
+ public void whenUsingMatcher_thenReturnTrue() {
+ Pattern pattern = Pattern.compile(REGEX);
+ Matcher matcher = pattern.matcher(STRING_INPUT);
+ assertTrue(matcher.find());
+ }
+
+ @Test
+ public void whenUsingMatches_thenReturnFalse() {
+ assertFalse(Pattern.matches(REGEX, STRING_INPUT));
+ }
+
}
diff --git a/core-java-modules/core-java-security-2/README.md b/core-java-modules/core-java-security-2/README.md
index 680a7de925..31404d24a5 100644
--- a/core-java-modules/core-java-security-2/README.md
+++ b/core-java-modules/core-java-security-2/README.md
@@ -10,12 +10,7 @@ This module contains articles about core Java Security
- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
- [Checksums in Java](https://www.baeldung.com/java-checksums)
- [How to Read PEM File to Get Public and Private Keys](https://www.baeldung.com/java-read-pem-file-keys)
-- [Listing the Available Cipher Algorithms](https://www.baeldung.com/java-list-cipher-algorithms)
- [Get a List of Trusted Certificates in Java](https://www.baeldung.com/java-list-trusted-certificates)
- [Security Context Basics: User, Subject and Principal](https://www.baeldung.com/security-context-basics)
-- [Java AES Encryption and Decryption](https://www.baeldung.com/java-aes-encryption-decryption)
-- [InvalidAlgorithmParameterException: Wrong IV Length](https://www.baeldung.com/java-invalidalgorithmparameter-exception)
- [The java.security.egd JVM Option](https://www.baeldung.com/java-security-egd)
-- [RSA in Java](https://www.baeldung.com/java-rsa)
-- [3DES in Java](https://www.baeldung.com/java-3des)
- More articles: [[<-- prev]](/core-java-modules/core-java-security)
diff --git a/core-java-modules/core-java-security-2/pom.xml b/core-java-modules/core-java-security-2/pom.xml
index 8de12c0c46..7a354ee9e2 100644
--- a/core-java-modules/core-java-security-2/pom.xml
+++ b/core-java-modules/core-java-security-2/pom.xml
@@ -25,13 +25,6 @@
bcprov-jdk15on${bouncycastle.version}
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- javax.xml.bind
@@ -41,11 +34,8 @@
-
1.601.11
-
- 3.18.02.3.1
diff --git a/core-java-modules/core-java-security-3/README.md b/core-java-modules/core-java-security-3/README.md
index a37719964b..30cfd8a947 100644
--- a/core-java-modules/core-java-security-3/README.md
+++ b/core-java-modules/core-java-security-3/README.md
@@ -6,4 +6,6 @@ This module contains articles about core Java Security
- [Secret Key and String Conversion in Java](https://www.baeldung.com/java-secret-key-to-string)
- [Enabling Unlimited Strength Cryptography in Java](https://www.baeldung.com/jce-enable-unlimited-strength)
+- [Initialization Vector for Encryption](https://www.baeldung.com/java-encryption-iv)
+- [HMAC in Java](https://www.baeldung.com/java-hmac)
- More articles: [[<-- prev]](/core-java-modules/core-java-security-2)
diff --git a/core-java-modules/core-java-security-3/pom.xml b/core-java-modules/core-java-security-3/pom.xml
index 69d0ffb917..3cd546e697 100644
--- a/core-java-modules/core-java-security-3/pom.xml
+++ b/core-java-modules/core-java-security-3/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -26,13 +25,6 @@
bcprov-jdk15on${bouncycastle.version}
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- javax.xml.bind
@@ -42,11 +34,8 @@
-
1.601.11
-
- 3.18.02.3.1
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/certificate/Thumbprint.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/certificate/Thumbprint.java
new file mode 100644
index 0000000000..7ccf1091c6
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/certificate/Thumbprint.java
@@ -0,0 +1,38 @@
+package com.baeldung.certificate;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import javax.xml.bind.DatatypeConverter;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+public class Thumbprint {
+
+ public static void main(String[] args) throws CertificateException, IOException, NoSuchAlgorithmException {
+ X509Certificate certObject = getCertObject("baeldung.pem");
+ System.out.println(getThumbprint(certObject));
+ }
+
+ public static X509Certificate getCertObject(String filePath) throws IOException, CertificateException {
+ try (FileInputStream is = new FileInputStream(filePath)) {
+ CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
+ return (X509Certificate) certificateFactory.generateCertificate(is);
+ }
+ }
+
+ private static String getThumbprint(X509Certificate cert) throws NoSuchAlgorithmException, CertificateEncodingException {
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+ md.update(cert.getEncoded());
+ return DatatypeConverter.printHexBinary(md.digest()).toLowerCase();
+ }
+
+ private static String getThumbprintWithApache(X509Certificate cert) throws CertificateEncodingException {
+ return DigestUtils.sha1Hex(cert.getEncoded());
+ }
+}
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java
new file mode 100644
index 0000000000..552bd5d474
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/CryptoDriver.java
@@ -0,0 +1,86 @@
+package com.baeldung.crypto;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.GCMParameterSpec;
+import javax.crypto.spec.IvParameterSpec;
+import java.security.GeneralSecurityException;
+
+import com.baeldung.crypto.utils.CryptoUtils;
+
+public class CryptoDriver {
+
+ public byte[] ecbEncrypt(SecretKey key, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, key);
+ return cipher.doFinal(data);
+ }
+
+ public byte[] ecbDecrypt(SecretKey key, byte[] cipherText) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+ cipher.init(Cipher.DECRYPT_MODE, key);
+ return cipher.doFinal(cipherText);
+ }
+
+ public byte[] cbcEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, iv);
+ return cipher.doFinal(data);
+ }
+
+ public byte[] cbcDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+ cipher.init(Cipher.DECRYPT_MODE, key, iv);
+ return cipher.doFinal(cipherText);
+ }
+
+ public byte[] cfbEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, iv);
+ return cipher.doFinal(data);
+ }
+
+ public byte[] cfbDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
+ cipher.init(Cipher.DECRYPT_MODE, key, iv);
+ return cipher.doFinal(cipherText);
+ }
+
+ public byte[] ofbEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/OFB32/PKCS5Padding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, iv);
+ return cipher.doFinal(data);
+ }
+
+ public byte[] ofbDecrypt(SecretKey key, IvParameterSpec iv, byte[] cipherText) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/OFB32/PKCS5Padding");
+ cipher.init(Cipher.DECRYPT_MODE, key, iv);
+ return cipher.doFinal(cipherText);
+ }
+
+ public byte[][] ctrEncrypt(SecretKey key, IvParameterSpec iv, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, iv);
+ return new byte[][] { cipher.getIV(), cipher.doFinal(data) };
+ }
+
+ public byte[] ctrDecrypt(SecretKey key, byte[] iv, byte[] cipherText) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
+ cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
+ return cipher.doFinal(cipherText);
+ }
+
+ public byte[][] gcmEncrypt(SecretKey key, byte[] iv, byte[] data) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+ cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(128, iv));
+ byte[] ciphertext = cipher.doFinal(data);
+ return new byte[][] { iv, ciphertext };
+ }
+
+ public byte[] gcmDecrypt(SecretKey key, byte[] iv, byte[] ciphertext) throws GeneralSecurityException {
+ Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+ cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
+ byte[] plaintext = cipher.doFinal(ciphertext);
+ return plaintext;
+ }
+}
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java
new file mode 100644
index 0000000000..2d3df231ff
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/crypto/utils/CryptoUtils.java
@@ -0,0 +1,53 @@
+package com.baeldung.crypto.utils;
+
+import java.security.AlgorithmParameters;
+import java.security.GeneralSecurityException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidParameterSpecException;
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+
+public class CryptoUtils {
+
+ public static SecretKey generateKey() throws GeneralSecurityException {
+ KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
+ keyGenerator.init(256);
+ return keyGenerator.generateKey();
+ }
+
+ public static IvParameterSpec getIV() {
+ SecureRandom secureRandom = new SecureRandom();
+ byte[] iv = new byte[128 / 8];
+ byte[] nonce = new byte[96 / 8];
+ secureRandom.nextBytes(nonce);
+ System.arraycopy(nonce, 0, iv, 0, nonce.length);
+ return new IvParameterSpec(nonce);
+ }
+
+ public static IvParameterSpec getIVSecureRandom(String algorithm) throws NoSuchAlgorithmException, NoSuchPaddingException {
+ SecureRandom random = SecureRandom.getInstanceStrong();
+ byte[] iv = new byte[Cipher.getInstance(algorithm)
+ .getBlockSize()];
+ random.nextBytes(iv);
+ return new IvParameterSpec(iv);
+ }
+
+ public static IvParameterSpec getIVInternal(Cipher cipher) throws InvalidParameterSpecException {
+ AlgorithmParameters params = cipher.getParameters();
+ byte[] iv = params.getParameterSpec(IvParameterSpec.class)
+ .getIV();
+ return new IvParameterSpec(iv);
+ }
+
+ public static byte[] getRandomIVWithSize(int size) {
+ byte[] nonce = new byte[size];
+ new SecureRandom().nextBytes(nonce);
+ return nonce;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java
new file mode 100644
index 0000000000..3b504d9338
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/hmac/HMACUtil.java
@@ -0,0 +1,68 @@
+package com.baeldung.hmac;
+
+import org.apache.commons.codec.digest.HmacUtils;
+import org.bouncycastle.crypto.Digest;
+import org.bouncycastle.crypto.digests.MD5Digest;
+import org.bouncycastle.crypto.digests.SHA256Digest;
+import org.bouncycastle.crypto.digests.SHA384Digest;
+import org.bouncycastle.crypto.digests.SHA512Digest;
+import org.bouncycastle.crypto.macs.HMac;
+import org.bouncycastle.crypto.params.KeyParameter;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+
+public class HMACUtil {
+
+ public static String hmacWithJava(String algorithm, String data, String key)
+ throws NoSuchAlgorithmException, InvalidKeyException {
+ SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), algorithm);
+ Mac mac = Mac.getInstance(algorithm);
+ mac.init(secretKeySpec);
+ return bytesToHex(mac.doFinal(data.getBytes()));
+ }
+
+ public static String hmacWithApacheCommons(String algorithm, String data, String key) {
+ String hmac = new HmacUtils(algorithm, key).hmacHex(data);
+ return hmac;
+ }
+
+ public static String hmacWithBouncyCastle(String algorithm, String data, String key) {
+ Digest digest = getHashDigest(algorithm);
+ HMac hMac = new HMac(digest);
+ hMac.init(new KeyParameter(key.getBytes()));
+ byte[] hmacIn = data.getBytes();
+ hMac.update(hmacIn, 0, hmacIn.length);
+ byte[] hmacOut = new byte[hMac.getMacSize()];
+ hMac.doFinal(hmacOut, 0);
+ return bytesToHex(hmacOut);
+ }
+
+ private static Digest getHashDigest(String algorithm) {
+ switch (algorithm) {
+ case "HmacMD5":
+ return new MD5Digest();
+ case "HmacSHA256":
+ return new SHA256Digest();
+ case "HmacSHA384":
+ return new SHA384Digest();
+ case "HmacSHA512":
+ return new SHA512Digest();
+ }
+ return new SHA256Digest();
+ }
+
+ public static String bytesToHex(byte[] hash) {
+ StringBuilder hexString = new StringBuilder(2 * hash.length);
+ for (byte h : hash) {
+ String hex = Integer.toHexString(0xff & h);
+ if (hex.length() == 1)
+ hexString.append('0');
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ }
+}
diff --git a/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkey/Main.java b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkey/Main.java
new file mode 100644
index 0000000000..a7b1485150
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/main/java/com/baeldung/secretkey/Main.java
@@ -0,0 +1,99 @@
+package com.baeldung.secretkey;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.KeyGenerator;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.InvalidParameterException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Base64;
+import java.util.Random;
+
+import static javax.crypto.Cipher.ENCRYPT_MODE;
+
+public class Main {
+ private static final Logger logger = LoggerFactory.getLogger(Main.class);
+
+ private static final String CIPHER = "AES";
+
+ public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException {
+ String plainText = "How you doing Mike?";
+
+ encrypt(plainText, getRandomKey(CIPHER, 128));
+ encrypt(plainText, getRandomKey(CIPHER, 192));
+ encrypt(plainText, getRandomKey(CIPHER, 256));
+
+ encrypt(plainText, getSecureRandomKey(CIPHER, 128));
+ encrypt(plainText, getSecureRandomKey(CIPHER, 192));
+ encrypt(plainText, getSecureRandomKey(CIPHER, 256));
+
+ encrypt(plainText, getKeyFromKeyGenerator(CIPHER, 128));
+ encrypt(plainText, getKeyFromKeyGenerator(CIPHER, 192));
+ encrypt(plainText, getKeyFromKeyGenerator(CIPHER, 256));
+
+ encrypt(plainText, getPasswordBasedKey(CIPHER, 128, new char[] { 'R', 'a', 'n', 'd', 'o', 'm' }));
+ encrypt(plainText, getPasswordBasedKey(CIPHER, 192, new char[] { 'R', 'a', 'n', 'd', 'o', 'm' }));
+ encrypt(plainText, getPasswordBasedKey(CIPHER, 256, new char[] { 'R', 'a', 'n', 'd', 'o', 'm' }));
+
+ try {
+ encrypt(plainText, getSecureRandomKey(CIPHER, 111));
+ } catch (InvalidKeyException e) {
+ logger.error("Unable to generate key", e);
+ }
+
+ try {
+ encrypt(plainText, getKeyFromKeyGenerator(CIPHER, 111));
+ } catch (InvalidParameterException e) {
+ logger.error("Unable to generate key", e);
+ }
+ }
+
+ private static void encrypt(String plainText, Key key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+ Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
+ cipher.init(ENCRYPT_MODE, key);
+ byte[] cipherTextBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
+ logger.info(Base64.getEncoder().encodeToString(cipherTextBytes));
+ }
+
+ private static Key getRandomKey(String cipher, int keySize) {
+ byte[] randomKeyBytes = new byte[keySize / 8];
+ Random random = new Random();
+ random.nextBytes(randomKeyBytes);
+ return new SecretKeySpec(randomKeyBytes, cipher);
+ }
+
+ private static Key getSecureRandomKey(String cipher, int keySize) {
+ byte[] secureRandomKeyBytes = new byte[keySize / 8];
+ SecureRandom secureRandom = new SecureRandom();
+ secureRandom.nextBytes(secureRandomKeyBytes);
+ return new SecretKeySpec(secureRandomKeyBytes, cipher);
+ }
+
+ private static Key getKeyFromKeyGenerator(String cipher, int keySize) throws NoSuchAlgorithmException {
+ KeyGenerator keyGenerator = KeyGenerator.getInstance(cipher);
+ keyGenerator.init(keySize);
+ return keyGenerator.generateKey();
+ }
+
+ private static Key getPasswordBasedKey(String cipher, int keySize, char[] password) throws NoSuchAlgorithmException, InvalidKeySpecException {
+ byte[] salt = new byte[100];
+ SecureRandom random = new SecureRandom();
+ random.nextBytes(salt);
+ PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, 100000, keySize);
+ SecretKey pbeKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256").generateSecret(pbeKeySpec);
+ return new SecretKeySpec(pbeKey.getEncoded(), cipher);
+ }
+}
diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/CryptoDriverIVUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/CryptoDriverIVUnitTest.java
new file mode 100644
index 0000000000..f3bed310dd
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/crypto/CryptoDriverIVUnitTest.java
@@ -0,0 +1,86 @@
+package com.baeldung.crypto;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import java.security.GeneralSecurityException;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import com.baeldung.crypto.utils.CryptoUtils;
+
+public class CryptoDriverIVUnitTest{
+ private CryptoDriver driver = new CryptoDriver();
+ private String TEST_DATA = "Encrypt this for testing";
+
+ @Test
+ public void givenString_whenAesEcb_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ byte[] plaintext = TEST_DATA.getBytes();
+
+ byte[] ciphertext = driver.ecbEncrypt(key, plaintext);
+ byte[] decryptedtext = driver.ecbDecrypt(key, ciphertext);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+
+ @Test
+ public void givenString_whenAesCbc_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES");
+ byte[] plaintext = TEST_DATA.getBytes();
+
+ byte[] ciphertext = driver.cbcEncrypt(key, iv, plaintext);
+ byte[] decryptedtext = driver.cbcDecrypt(key, iv, ciphertext);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+
+ @Test
+ public void givenString_whenAesCfb_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/CFB/NoPadding");
+ byte[] plaintext = TEST_DATA.getBytes();
+
+ byte[] ciphertext = driver.cfbEncrypt(key, iv, plaintext);
+ byte[] decryptedtext = driver.cfbDecrypt(key, iv, ciphertext);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+
+ @Test
+ public void givenString_whenAesOfb_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/OFB32/PKCS5Padding");
+ byte[] plaintext = TEST_DATA.getBytes();
+
+ byte[] ciphertext = driver.ofbEncrypt(key, iv, plaintext);
+ byte[] decryptedtext = driver.ofbDecrypt(key, iv, ciphertext);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+
+ @Test
+ public void givenString_whenAesCtr_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ IvParameterSpec iv = CryptoUtils.getIVSecureRandom("AES/CTR/NoPadding");
+ byte[] plaintext = TEST_DATA.getBytes();
+
+ byte[][] ciphertext = driver.ctrEncrypt(key, iv, plaintext);
+ byte[] decryptedtext = driver.ctrDecrypt(key, ciphertext[0], ciphertext[1]);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+
+ @Test
+ void givenString_whenAesGcm_thenSuccess() throws GeneralSecurityException {
+ SecretKey key = CryptoUtils.generateKey();
+ byte[] iv = CryptoUtils.getRandomIVWithSize(12);
+ byte[] plaintext = (TEST_DATA).getBytes();
+
+ byte[][] ciphertext = driver.gcmEncrypt(key, iv, plaintext);
+ byte[] decryptedtext = driver.gcmDecrypt(key, ciphertext[0], ciphertext[1]);
+
+ Assertions.assertEquals(new String(decryptedtext), TEST_DATA);
+ }
+}
diff --git a/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hmac/HMACUtilUnitTest.java b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hmac/HMACUtilUnitTest.java
new file mode 100644
index 0000000000..0d7f97a094
--- /dev/null
+++ b/core-java-modules/core-java-security-3/src/test/java/com/baeldung/hmac/HMACUtilUnitTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.hmac;
+
+import org.junit.Test;
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+import static org.junit.Assert.assertEquals;
+
+public class HMACUtilUnitTest {
+
+ @Test
+ public void givenDataAndKeyAndAlgorithm_whenHmacWithJava_thenSuccess()
+ throws NoSuchAlgorithmException, InvalidKeyException {
+
+ //given
+ String hmacSHA256Value = "5b50d80c7dc7ae8bb1b1433cc0b99ecd2ac8397a555c6f75cb8a619ae35a0c35";
+ String hmacSHA256Algorithm = "HmacSHA256";
+ String data = "baeldung";
+ String key = "123456";
+
+ //when
+ String result = HMACUtil.hmacWithJava(hmacSHA256Algorithm, data, key);
+
+ //then
+ assertEquals(hmacSHA256Value, result);
+ }
+
+ @Test
+ public void givenDataAndKeyAndAlgorithm_whenHmacWithApacheCommons_thenSuccess() {
+
+ //given
+ String hmacMD5Value = "621dc816b3bf670212e0c261dc9bcdb6";
+ String hmacMD5Algorithm = "HmacMD5";
+ String data = "baeldung";
+ String key = "123456";
+
+ //when
+ String result = HMACUtil.hmacWithApacheCommons(hmacMD5Algorithm, data, key);
+
+ //then
+ assertEquals(hmacMD5Value, result);
+ }
+
+ @Test
+ public void givenDataAndKeyAndAlgorithm_whenHmacWithBouncyCastle_thenSuccess() {
+
+ //given
+ String hmacSHA512Value = "b313a21908df55c9e322e3c65a4b0b7561ab1594ca806b3affbc0d769a1" +
+ "290c1922aa6622587bea3c0c4d871470a6d06f54dbd20dbda84250e2741eb01f08e33";
+ String hmacSHA512Algorithm = "HmacSHA512";
+ String data = "baeldung";
+ String key = "123456";
+
+ //when
+ String result = HMACUtil.hmacWithBouncyCastle(hmacSHA512Algorithm, data, key);
+
+ //then
+ assertEquals(hmacSHA512Value, result);
+ }
+}
diff --git a/core-java-modules/core-java-security-algorithms/README.md b/core-java-modules/core-java-security-algorithms/README.md
new file mode 100644
index 0000000000..a1ce244ab8
--- /dev/null
+++ b/core-java-modules/core-java-security-algorithms/README.md
@@ -0,0 +1,11 @@
+## Core Java Security Algorithms
+
+This module contains articles about core Java Security Algorithms such as AES, DES, RSA, etc
+
+### Relevant Articles:
+
+- [Listing the Available Cipher Algorithms](https://www.baeldung.com/java-list-cipher-algorithms)
+- [Java AES Encryption and Decryption](https://www.baeldung.com/java-aes-encryption-decryption)
+- [InvalidAlgorithmParameterException: Wrong IV Length](https://www.baeldung.com/java-invalidalgorithmparameter-exception)
+- [RSA in Java](https://www.baeldung.com/java-rsa)
+- [3DES in Java](https://www.baeldung.com/java-3des)
diff --git a/core-java-modules/core-java-security-algorithms/pom.xml b/core-java-modules/core-java-security-algorithms/pom.xml
new file mode 100644
index 0000000000..967ddc103e
--- /dev/null
+++ b/core-java-modules/core-java-security-algorithms/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+ core-java-security-algorithms
+ 0.1.0-SNAPSHOT
+ core-java-security-algorithms
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
+
+
+ javax.xml.bind
+ jaxb-api
+ ${jaxb-api.version}
+
+
+
+
+ 1.60
+ 1.11
+ 2.3.1
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/aes/AESUtil.java b/core-java-modules/core-java-security-algorithms/src/main/java/com/baeldung/aes/AESUtil.java
similarity index 100%
rename from core-java-modules/core-java-security-2/src/main/java/com/baeldung/aes/AESUtil.java
rename to core-java-modules/core-java-security-algorithms/src/main/java/com/baeldung/aes/AESUtil.java
diff --git a/core-java-modules/core-java-security-2/src/main/java/com/baeldung/aes/Student.java b/core-java-modules/core-java-security-algorithms/src/main/java/com/baeldung/aes/Student.java
similarity index 100%
rename from core-java-modules/core-java-security-2/src/main/java/com/baeldung/aes/Student.java
rename to core-java-modules/core-java-security-algorithms/src/main/java/com/baeldung/aes/Student.java
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/aes/AESUtilUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security-2/src/test/java/com/baeldung/aes/AESUtilUnitTest.java
rename to core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/aes/AESUtilUnitTest.java
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security-2/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
rename to core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/cipher/AvailableCiphersUnitTest.java
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/des/TripleDESUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/des/TripleDESUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-security-2/src/test/java/com/baeldung/des/TripleDESUnitTest.java
rename to core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/des/TripleDESUnitTest.java
diff --git a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/rsa/RsaUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
rename to core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/rsa/RsaUnitTest.java
index ac93f71125..9659fd8871 100644
--- a/core-java-modules/core-java-security-2/src/test/java/com/baeldung/rsa/RsaUnitTest.java
+++ b/core-java-modules/core-java-security-algorithms/src/test/java/com/baeldung/rsa/RsaUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.cipher;
+package com.baeldung.rsa;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
diff --git a/core-java-modules/core-java-security-2/src/test/resources/baeldung.txt b/core-java-modules/core-java-security-algorithms/src/test/resources/baeldung.txt
similarity index 100%
rename from core-java-modules/core-java-security-2/src/test/resources/baeldung.txt
rename to core-java-modules/core-java-security-algorithms/src/test/resources/baeldung.txt
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index daba990776..b36de5ac4c 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -14,19 +14,4 @@
0.0.1-SNAPSHOT
-
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
-
- 3.10.0
-
-
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/README.md b/core-java-modules/core-java-serialization/README.md
new file mode 100644
index 0000000000..fc6cfcf134
--- /dev/null
+++ b/core-java-modules/core-java-serialization/README.md
@@ -0,0 +1,9 @@
+## Core Java Serialization
+
+### Relevant Articles:
+
+- [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable)
+- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization)
+- [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities)
+- [Serialization Validation in Java](https://www.baeldung.com/java-validate-serializable)
+- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
diff --git a/core-java-modules/core-java-serialization/pom.xml b/core-java-modules/core-java-serialization/pom.xml
new file mode 100644
index 0000000000..315ed8cdad
--- /dev/null
+++ b/core-java-modules/core-java-serialization/pom.xml
@@ -0,0 +1,180 @@
+
+
+ 4.0.0
+ core-java-serialization
+ 0.1.0-SNAPSHOT
+ core-java-serialization
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.springframework
+ spring-core
+ ${spring.core.version}
+
+
+ org.springframework
+ spring-core
+ ${spring.core.version}
+ test
+
+
+
+
+ core-java-serialization
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ ${source.version}
+ ${target.version}
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ 0.4
+ 1.8.7
+ 1.1
+ 3.0.0-M1
+ 4.3.20.RELEASE
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/deserialization/AppleProduct.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/AppleProduct.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/deserialization/AppleProduct.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/AppleProduct.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/deserialization/DefaultSerial.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/DefaultSerial.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/deserialization/DefaultSerial.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/DefaultSerial.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/deserialization/DeserializationUtility.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/DeserializationUtility.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/deserialization/DeserializationUtility.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/DeserializationUtility.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/deserialization/SerializationUtility.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/SerializationUtility.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/deserialization/SerializationUtility.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/deserialization/SerializationUtility.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Community.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Community.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Community.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Community.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Country.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Country.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Country.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Country.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Region.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Region.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/externalizable/Region.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/externalizable/Region.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/serialization/Address.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Address.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/serialization/Address.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Address.java
diff --git a/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Customer.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Customer.java
new file mode 100644
index 0000000000..51587b6c86
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Customer.java
@@ -0,0 +1,35 @@
+package com.baeldung.serialization;
+
+import java.io.Serializable;
+
+public class Customer implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private long id;
+ private volatile String name;
+ private Address address;
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/serialization/Employee.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Employee.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/serialization/Employee.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Employee.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/serialization/Person.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Person.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/serialization/Person.java
rename to core-java-modules/core-java-serialization/src/main/java/com/baeldung/serialization/Person.java
diff --git a/core-java-modules/core-java-serialization/src/main/java/com/baeldung/util/MySerializationUtils.java b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/util/MySerializationUtils.java
new file mode 100644
index 0000000000..568a503476
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/java/com/baeldung/util/MySerializationUtils.java
@@ -0,0 +1,46 @@
+package com.baeldung.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class MySerializationUtils {
+
+ public static byte[] serialize(T obj) throws IOException {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(obj);
+ oos.close();
+ return baos.toByteArray();
+ }
+
+ public static T deserialize(byte[] b, Class cl) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream bais = new ByteArrayInputStream(b);
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ Object o = ois.readObject();
+ return cl.cast(o);
+ }
+
+ public static boolean isSerializable(Class> it) {
+ boolean serializable = it.isPrimitive() || it.isInterface() || Serializable.class.isAssignableFrom(it);
+ if (!serializable) {
+ return false;
+ }
+ Field[] declaredFields = it.getDeclaredFields();
+ for (Field field : declaredFields) {
+ if (Modifier.isVolatile(field.getModifiers()) || Modifier.isTransient(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
+ continue;
+ }
+ Class> fieldType = field.getType();
+ if (!isSerializable(fieldType)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/core-java-modules/core-java-serialization/src/main/resources/log4j.properties b/core-java-modules/core-java-serialization/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/main/resources/log4j2.xml b/core-java-modules/core-java-serialization/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..a824bef9b0
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/main/resources/log4jstructuraldp.properties b/core-java-modules/core-java-serialization/src/main/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/main/resources/logback.xml b/core-java-modules/core-java-serialization/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
similarity index 99%
rename from core-java-modules/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
rename to core-java-modules/core-java-serialization/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
index d7c1ee17d4..89a603a298 100644
--- a/core-java-modules/core-java/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
+++ b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/deserialization/DeserializationUnitTest.java
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.io.InvalidClassException;
+import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/externalizable/ExternalizableUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/externalizable/ExternalizableUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/externalizable/ExternalizableUnitTest.java
rename to core-java-modules/core-java-serialization/src/test/java/com/baeldung/externalizable/ExternalizableUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/serialization/PersonUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/serialization/PersonUnitTest.java
rename to core-java-modules/core-java-serialization/src/test/java/com/baeldung/serialization/PersonUnitTest.java
diff --git a/core-java-modules/core-java-serialization/src/test/java/com/baeldung/serialization/SerializationUnitTest.java b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/serialization/SerializationUnitTest.java
new file mode 100644
index 0000000000..dde9beb2bb
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/test/java/com/baeldung/serialization/SerializationUnitTest.java
@@ -0,0 +1,113 @@
+package com.baeldung.serialization;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.apache.commons.lang3.SerializationUtils;
+import org.junit.Test;
+
+import com.baeldung.util.MySerializationUtils;
+
+public class SerializationUnitTest {
+
+ @Test(expected = NotSerializableException.class)
+ public void whenSerializing_ThenThrowsError() throws IOException {
+ Address address = new Address();
+ address.setHouseNumber(10);
+ FileOutputStream fileOutputStream = new FileOutputStream("yofile.txt");
+ try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
+ objectOutputStream.writeObject(address);
+ }
+ }
+
+ @Test
+ public void whenSerializingAndDeserializing_ThenObjectIsTheSame() throws IOException, ClassNotFoundException {
+ Person p = new Person();
+ p.setAge(20);
+ p.setName("Joe");
+
+ FileOutputStream fileOutputStream = new FileOutputStream("yofile.txt");
+ try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream)) {
+ objectOutputStream.writeObject(p);
+ }
+
+ FileInputStream fileInputStream = new FileInputStream("yofile.txt");
+ try (ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream)) {
+ Person p2 = (Person) objectInputStream.readObject();
+ assertEquals(p2.getAge(), p.getAge());
+ assertEquals(p2.getName(), p.getName());
+ }
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void whenSerializingUsingApacheCommons_ThenThrowsError() {
+ Address address = new Address();
+ address.setHouseNumber(10);
+ SerializationUtils.serialize((Serializable) address);
+ }
+
+ @Test
+ public void whenSerializingAndDeserializingUsingApacheCommons_ThenObjectIsTheSame() {
+ Person p = new Person();
+ p.setAge(20);
+ p.setName("Joe");
+ byte[] serialize = SerializationUtils.serialize(p);
+ Person p2 = (Person) SerializationUtils.deserialize(serialize);
+ assertEquals(p2.getAge(), p.getAge());
+ assertEquals(p2.getName(), p.getName());
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void whenSerializingUsingSpringSerializationUtils_ThenThrowsError() {
+ Address address = new Address();
+ address.setHouseNumber(10);
+ org.springframework.util.SerializationUtils.serialize((Serializable) address);
+ }
+
+ @Test
+ public void whenSerializingAndDeserializingUsingSpringSerializationUtils_ThenObjectIsTheSame() {
+ Person p = new Person();
+ p.setAge(20);
+ p.setName("Joe");
+ byte[] serialize = org.springframework.util.SerializationUtils.serialize(p);
+ Person p2 = (Person) org.springframework.util.SerializationUtils.deserialize(serialize);
+ assertEquals(p2.getAge(), p.getAge());
+ assertEquals(p2.getName(), p.getName());
+ }
+
+ @Test(expected = ClassCastException.class)
+ public void whenSerializingUsingCustomSerializationUtils_ThenThrowsError() throws IOException {
+ Address address = new Address();
+ address.setHouseNumber(10);
+ MySerializationUtils.serialize((Serializable) address);
+ }
+
+ @Test
+ public void whenSerializingAndDeserializingUsingCustomSerializationUtils_ThenObjectIsTheSame() throws IOException, ClassNotFoundException {
+ Person p = new Person();
+ p.setAge(20);
+ p.setName("Joe");
+ byte[] serialize = MySerializationUtils.serialize(p);
+ Person p2 = MySerializationUtils.deserialize(serialize, Person.class);
+ assertEquals(p2.getAge(), p.getAge());
+ assertEquals(p2.getName(), p.getName());
+ }
+
+ @Test
+ public void whenSerializingUsingCustomSerializationUtils_ThanOk() {
+ assertFalse(MySerializationUtils.isSerializable(Address.class));
+ assertTrue(MySerializationUtils.isSerializable(Person.class));
+ assertTrue(MySerializationUtils.isSerializable(Integer.class));
+ assertFalse(MySerializationUtils.isSerializable(Customer.class));
+ assertTrue(MySerializationUtils.isSerializable(Employee.class));
+ }
+}
diff --git a/core-java-modules/core-java-serialization/src/test/resources/log4j.properties b/core-java-modules/core-java-serialization/src/test/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/test/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/test/resources/log4j2.xml b/core-java-modules/core-java-serialization/src/test/resources/log4j2.xml
new file mode 100644
index 0000000000..a824bef9b0
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/test/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/test/resources/log4jstructuraldp.properties b/core-java-modules/core-java-serialization/src/test/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/test/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-serialization/src/test/resources/logback.xml b/core-java-modules/core-java-serialization/src/test/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-modules/core-java-serialization/src/test/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-2/pom.xml b/core-java-modules/core-java-streams-2/pom.xml
index 5f25a2d9fb..c8fa83c55a 100644
--- a/core-java-modules/core-java-streams-2/pom.xml
+++ b/core-java-modules/core-java-streams-2/pom.xml
@@ -30,25 +30,11 @@
log4j${log4j.version}
-
- junit
- junit
- ${junit.version}
- test
- jar
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- 1.91.9
- 3.11.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml
index b384ef7e0e..c2dfdc392b 100644
--- a/core-java-modules/core-java-streams-3/pom.xml
+++ b/core-java-modules/core-java-streams-3/pom.xml
@@ -29,19 +29,12 @@
org.openjdk.jmhjmh-core
- ${jmh.version}
+ ${jmh-core.version}org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
- test
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
+ ${jmh-generator.version}test
@@ -65,7 +58,7 @@
org.openjdk.jmhjmh-generator-annprocess
- ${jmh.version}
+ ${jmh-generator.version}
@@ -75,9 +68,6 @@
1.18.20
-
- 3.6.1
- 1.29
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
index 4862672c8a..a6bb827e77 100644
--- a/core-java-modules/core-java-streams/pom.xml
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -43,13 +43,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.codepoeticsprotonpack
@@ -105,14 +98,11 @@
-
0.9.01.150.6.52.101.3
-
- 3.11.11.8.93.11.8
diff --git a/core-java-modules/core-java-string-algorithms-2/pom.xml b/core-java-modules/core-java-string-algorithms-2/pom.xml
index 4b0d55508f..5af187abc2 100644
--- a/core-java-modules/core-java-string-algorithms-2/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-2/pom.xml
@@ -20,11 +20,6 @@
commons-lang3${commons-lang3.version}
-
- com.google.guava
- guava
- ${guava.version}
- org.openjdk.jmhjmh-core
@@ -35,12 +30,6 @@
jmh-generator-annprocess${jmh-generator.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.bitbucket.cowwocdiff-match-patch
@@ -60,7 +49,6 @@
- 3.6.11.2
diff --git a/core-java-modules/core-java-string-algorithms-3/README.md b/core-java-modules/core-java-string-algorithms-3/README.md
index 8d515b9aea..e6dbf3a489 100644
--- a/core-java-modules/core-java-string-algorithms-3/README.md
+++ b/core-java-modules/core-java-string-algorithms-3/README.md
@@ -6,3 +6,4 @@ This module contains articles about string-related algorithms.
- [Check if Two Strings are Anagrams in Java](https://www.baeldung.com/java-strings-anagrams)
- [Email Validation in Java](https://www.baeldung.com/java-email-validation-regex)
+- [Check if the First Letter of a String is Uppercase](https://www.baeldung.com/java-check-first-letter-uppercase)
diff --git a/core-java-modules/core-java-string-algorithms-3/pom.xml b/core-java-modules/core-java-string-algorithms-3/pom.xml
index 6376bfa677..c140fce584 100644
--- a/core-java-modules/core-java-string-algorithms-3/pom.xml
+++ b/core-java-modules/core-java-string-algorithms-3/pom.xml
@@ -4,8 +4,8 @@
4.0.0core-java-string-algorithms-30.1.0-SNAPSHOT
- jarcore-java-string-algorithms-3
+ jarcom.baeldung.core-java-modules
@@ -14,28 +14,16 @@
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- com.google.guava
- guava
- ${guava.version}
-
-
- org.junit.jupiter
- junit-jupiter
- test
- commons-validatorcommons-validator${validator.version}
+
+ org.apache.commons
+ commons-lang3
+ ${apache-commons-lang3.version}
+
@@ -61,9 +49,8 @@
- 3.6.1
- 28.1-jre1.7
+ 3.12.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/isuppercase/StringFirstCharacterUppercaseUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/isuppercase/StringFirstCharacterUppercaseUnitTest.java
new file mode 100644
index 0000000000..524f7ca839
--- /dev/null
+++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/isuppercase/StringFirstCharacterUppercaseUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.isuppercase;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import com.google.common.base.Ascii;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class StringFirstCharacterUppercaseUnitTest {
+
+ @Test
+ public void givenString_whenCheckingWithCharacterIsUpperCase_thenStringCapitalized() {
+ String example = "Katie";
+ Assertions.assertTrue(Character.isUpperCase(example.charAt(0)));
+ }
+
+ @Test
+ public void givenString_whenCheckingWithRegex_thenStringCapitalized() {
+ String example = "Katie";
+ String regEx = "[A-Z]\\w*";
+
+ Assertions.assertTrue(example.matches(regEx));
+ }
+
+ @Test
+ public void givenString_whenCheckingWithGuava_thenStringCapitalized() {
+ String example = "Katie";
+ Assertions.assertTrue(Ascii.isUpperCase(example.charAt(0)));
+ }
+}
diff --git a/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/repeatedcharstring/RepeatedCharacterStringUnitTest.java b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/repeatedcharstring/RepeatedCharacterStringUnitTest.java
new file mode 100644
index 0000000000..42697c781e
--- /dev/null
+++ b/core-java-modules/core-java-string-algorithms-3/src/test/java/com/baeldung/repeatedcharstring/RepeatedCharacterStringUnitTest.java
@@ -0,0 +1,92 @@
+package com.baeldung.repeatedcharstring;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Strings;
+
+import static java.util.stream.Stream.generate;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class RepeatedCharacterStringUnitTest {
+
+ private static final String EXPECTED_STRING = "aaaaaaa";
+ private static final int N = 7;
+
+ @Test
+ void givenString_whenStringBuilderUsed_thenStringCreated() {
+ StringBuilder builder = new StringBuilder(N);
+ for (int i = 0; i < N; i++) {
+ builder.append("a");
+ }
+ String newString = builder.toString();
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenCharArrayUsed_thenStringCreated() {
+ char[] charArray = new char[N];
+ for (int i = 0; i < N; i++) {
+ charArray[i] = 'a';
+ }
+ String newString = new String(charArray);
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenApacheStringUtilsUsed_thenStringCreated() {
+ char charToAppend = 'a';
+ String newString = StringUtils.repeat(charToAppend, N);
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenGuavaRepeatUsed_thenStringCreated() {
+ String charToAppend = "a";
+ String newString = Strings.repeat(charToAppend, N);
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenArraysFillUsed_thenStringCreated() {
+ char charToAppend = 'a';
+ char[] charArray = new char[N];
+ Arrays.fill(charArray, charToAppend);
+ String newString = new String(charArray);
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenGenerateAndJoiningUsed_thenStringCreated() {
+ String charToAppend = "a";
+ String newString = generate(() -> charToAppend).limit(N).collect(Collectors.joining());
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenStringJoinUsed_thenStringCreated() {
+ String charToAppend = "a";
+ String newString = String.join("", Collections.nCopies(N, charToAppend));
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenGuavaJoinerUsed_thenStringCreated() {
+ String charToAppend = "a";
+ String newString = Joiner.on("").join(Collections.nCopies(N, charToAppend));
+ assertEquals(EXPECTED_STRING, newString);
+ }
+
+ @Test
+ void givenString_whenRandomStringUtilsUsed_thenStringCreated() {
+ String charToAppend = "a";
+ String newString = RandomStringUtils.random(N, charToAppend);
+ assertEquals(EXPECTED_STRING, newString);
+ }
+}
diff --git a/core-java-modules/core-java-string-algorithms/pom.xml b/core-java-modules/core-java-string-algorithms/pom.xml
index 9fea569b29..84f3b61f84 100644
--- a/core-java-modules/core-java-string-algorithms/pom.xml
+++ b/core-java-modules/core-java-string-algorithms/pom.xml
@@ -15,11 +15,6 @@
-
- com.google.guava
- guava
- ${guava.version}
- org.apache.commonscommons-lang3
@@ -45,12 +40,6 @@
emoji-java${emoji-java.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -64,9 +53,7 @@
- 27.0.1-jre0.4.0
- 3.6.14.0.0
diff --git a/core-java-modules/core-java-string-apis/README.md b/core-java-modules/core-java-string-apis/README.md
index c9aa40de7a..0dd24d7e9a 100644
--- a/core-java-modules/core-java-string-apis/README.md
+++ b/core-java-modules/core-java-string-apis/README.md
@@ -10,3 +10,4 @@ This module contains articles about string APIs.
- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
- [StringBuilder vs StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer)
- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
+- [Getting a Character by Index From a String in Java](https://www.baeldung.com/java-character-at-position)
diff --git a/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringapi/StringCharAtUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringapi/StringCharAtUnitTest.java
new file mode 100644
index 0000000000..5d31b337ef
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringapi/StringCharAtUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.stringapi;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class StringCharAtUnitTest {
+ @Test
+ public void whenCallCharAt_thenSuccess() {
+ String sample = "abcdefg";
+ assertEquals('d', sample.charAt(3));
+ }
+
+ @Test()
+ public void whenCharAtNonExist_thenIndexOutOfBoundsExceptionThrown() {
+ String sample = "abcdefg";
+ assertThrows(IndexOutOfBoundsException.class, () -> sample.charAt(-1));
+ assertThrows(IndexOutOfBoundsException.class, () -> sample.charAt(sample.length()));
+ }
+
+ @Test
+ public void whenCallCharAt_thenReturnString() {
+ String sample = "abcdefg";
+ assertEquals("a", Character.toString(sample.charAt(0)));
+ assertEquals("a", String.valueOf(sample.charAt(0)));
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-2/README.md b/core-java-modules/core-java-string-conversions-2/README.md
index 46eb783a27..7abcd5e97a 100644
--- a/core-java-modules/core-java-string-conversions-2/README.md
+++ b/core-java-modules/core-java-string-conversions-2/README.md
@@ -9,4 +9,6 @@ This module contains articles about string conversions from/to another type.
- [Converting String to BigDecimal in Java](https://www.baeldung.com/java-string-to-bigdecimal)
- [Converting String to BigInteger in Java](https://www.baeldung.com/java-string-to-biginteger)
- [Convert a String to Camel Case](https://www.baeldung.com/java-string-to-camel-case)
+- [Convert a ByteBuffer to String in Java](https://www.baeldung.com/java-bytebuffer-to-string)
+- [Convert String to Float and Back in Java](https://www.baeldung.com/java-string-to-float)
- More articles: [[<-- prev]](/core-java-string-conversions)
diff --git a/core-java-modules/core-java-string-conversions-2/pom.xml b/core-java-modules/core-java-string-conversions-2/pom.xml
index 44968678f2..e424ef3083 100644
--- a/core-java-modules/core-java-string-conversions-2/pom.xml
+++ b/core-java-modules/core-java-string-conversions-2/pom.xml
@@ -15,23 +15,6 @@
-
- com.google.guava
- guava
- ${guava.version}
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.hamcrest
- hamcrest
- ${hamcrest.version}
- test
- com.ibm.icuicu4j
@@ -47,21 +30,8 @@
commons-text${commons-text.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- 64.2
- 3.12.2
- 1.9
- 30.1.1-jre
-
-
core-java-string-conversions-2
@@ -72,4 +42,9 @@
+
+ 64.2
+ 1.9
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java
new file mode 100644
index 0000000000..c498921d9a
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/bytebuffertostring/ByteArrayToStringUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.bytebuffertostring;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+import org.junit.Test;
+
+public class ByteArrayToStringUnitTest {
+ private static Charset charset = StandardCharsets.UTF_8;
+ private static final String content = "baeldung";
+
+ @Test
+ public void convertUsingNewStringFromBufferArray_thenOK() {
+ // Allocate a ByteBuffer
+ ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());
+ if (byteBuffer.hasArray()) {
+ String newContent = new String(byteBuffer.array(), charset);
+ assertEquals(content, newContent);
+ }
+ }
+
+ @Test
+ public void convertUsingNewStringFromByteBufferGetBytes_thenOK() {
+ // Allocate a ByteBuffer
+ ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());
+ byte[] bytes = new byte[byteBuffer.remaining()];
+ byteBuffer.get(bytes);
+ String newContent = new String(bytes, charset);
+ assertEquals(content, newContent);
+ }
+
+ @Test
+ public void convertUsingCharsetDecode_thenOK() {
+ // Allocate a ByteBuffer
+ ByteBuffer byteBuffer = ByteBuffer.wrap(content.getBytes());
+ String newContent = charset.decode(byteBuffer)
+ .toString();
+ assertEquals(content, newContent);
+ }
+
+}
diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtofloat/StringToFloatConversionUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtofloat/StringToFloatConversionUnitTest.java
new file mode 100644
index 0000000000..5780946bca
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtofloat/StringToFloatConversionUnitTest.java
@@ -0,0 +1,187 @@
+package com.baeldung.stringtofloat;
+
+import org.junit.jupiter.api.Test;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.ParseException;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class StringToFloatConversionUnitTest {
+
+ @Test
+ public void givenFloat_whenStringConcatenation_thenReturnString() {
+ Float givenFloat = 1.25f;
+
+ String result = givenFloat + "";
+
+ assertEquals("1.25", result);
+ }
+
+ @Test
+ public void givenFloatPrimitive_whenStringConcatenation_thenReturnString() {
+ float givenFloat = 1.25f;
+
+ String result = givenFloat + "";
+
+ assertEquals("1.25", result);
+ }
+
+ @Test
+ public void givenNullFloat_whenStringConcatenation_thenReturnNullString() {
+ Float givenFloat = null;
+
+ String result = givenFloat + "";
+
+ assertEquals("null", result);
+ }
+
+ @Test
+ public void givenFloat_whenToString_thenReturnString() {
+ Float givenFloat = 1.25f;
+
+ String result = Float.toString(givenFloat);
+
+ assertEquals("1.25", result);
+ }
+
+ @Test
+ public void givenNullFloat_whenToString_thenThrowNullPointerException() {
+ Float givenFloat = null;
+
+ assertThrows(NullPointerException.class, () -> Float.toString(givenFloat));
+ }
+
+ @Test
+ public void givenFloat_whenValueOf_thenReturnString() {
+ Float givenFloat = 1.25f;
+
+ String result = String.valueOf(givenFloat);
+
+ assertEquals("1.25", result);
+ }
+
+ @Test
+ public void givenNullFloat_whenValueOf_thenReturnNullString() {
+ Float givenFloat = null;
+
+ String result = String.valueOf(givenFloat);
+
+ assertEquals("null", result);
+ }
+
+ @Test
+ public void givenFloat_whenDecimalFormat_thenReturnString() {
+ Float givenFloat = 1.25f;
+
+ String result = new DecimalFormat("#.0000").format(givenFloat);
+
+ assertEquals("1.2500", result);
+ }
+
+ @Test
+ public void givenFloat_whenDecimalFormat_thenReturnWholeNumberString() {
+ Float givenFloat = 1.0025f;
+
+ String result = new DecimalFormat("#.##").format(givenFloat);
+
+ assertEquals("1", result);
+ }
+
+ @Test
+ public void givenNullFloat_whenDecimalFormat_thenThrowIllegalArgumentException() {
+ Float givenFloat = null;
+
+ assertThrows(IllegalArgumentException.class, () -> new DecimalFormat("#.000").format(givenFloat));
+ }
+
+ @Test
+ public void givenFloat_whenStringFormat_thenReturnString() {
+ Float givenFloat = 1.25f;
+
+ String result = String.format("%f", givenFloat);
+
+ assertEquals("1.250000", result);
+ }
+
+ @Test
+ public void givenFloat_whenStringFormatWithDecimalLimit_thenReturnRoundedString() {
+ Float givenFloat = 1.256f;
+
+ String result = String.format("%.2f", givenFloat);
+
+ assertEquals("1.26", result);
+ }
+
+ @Test
+ public void givenNullFloat_whenStringFormatWithDecimalLimit_thenReturnNullString() {
+ Float givenFloat = null;
+
+ String result = String.format("%f", givenFloat);
+
+ assertEquals("null", result);
+ }
+
+ @Test
+ public void givenString_whenParseFloat_thenReturnFloat() {
+ String givenString = "1.25";
+
+ float result = Float.parseFloat(givenString);
+
+ assertEquals(1.25f, result);
+ }
+
+ @Test
+ public void givenNullString_whenParseFloat_thenThrowNullPointerException() {
+ String givenString = null;
+
+ assertThrows(NullPointerException.class, () -> Float.parseFloat(givenString));
+ }
+
+ @Test
+ public void givenNonParsableString_whenParseFloat_thenThrowNumberFormatException() {
+ String givenString = "1.23x";
+
+ assertThrows(NumberFormatException.class, () -> Float.parseFloat(givenString));
+ }
+
+ @Test
+ public void givenString_whenValueOf_thenReturnFloat() {
+ String givenString = "1.25";
+
+ Float result = Float.valueOf(givenString);
+
+ assertEquals(1.25f, result);
+ }
+
+ @Test
+ public void givenNonParsableString_whenValueOf_thenThrowNumberFormatException() {
+ String givenString = "1.25x";
+
+ assertThrows(NumberFormatException.class, () -> Float.valueOf(givenString));
+ }
+
+ @Test
+ public void givenString_whenConstructor_thenReturnFloat() {
+ String givenString = "1.25";
+
+ Float result = new Float(givenString);
+
+ assertEquals(1.25f, result);
+ }
+
+ @Test
+ public void givenString_whenDecimalFormat_thenReturnFloat() throws ParseException {
+ String givenString = "1,250";
+ DecimalFormatSymbols symbols = new DecimalFormatSymbols();
+ symbols.setDecimalSeparator(',');
+ DecimalFormat decimalFormat = new DecimalFormat("#.000");
+ decimalFormat.setDecimalFormatSymbols(symbols);
+
+ Float result = decimalFormat.parse(givenString).floatValue();
+
+ assertEquals(1.25f, result);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-conversions/README.md b/core-java-modules/core-java-string-conversions/README.md
index 849660e482..a86062e4d4 100644
--- a/core-java-modules/core-java-string-conversions/README.md
+++ b/core-java-modules/core-java-string-conversions/README.md
@@ -10,7 +10,7 @@ This module contains articles about string conversions from/to another type.
- [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string)
- [Image to Base64 String Conversion](https://www.baeldung.com/java-base64-image-string)
- [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list)
-- [Converting Java String to Double](https://www.baeldung.com/java-string-to-double)
+- [Convert String to Double in Java](https://www.baeldung.com/java-string-to-double)
- [Convert Char to String in Java](https://www.baeldung.com/java-convert-char-to-string)
- [Convert String to int or Integer in Java](https://www.baeldung.com/java-convert-string-to-int-or-integer)
-- More articles: [[next -->]](/core-java-string-conversions-2)
\ No newline at end of file
+- More articles: [[next -->]](/core-java-string-conversions-2)
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
index 1047e3e7c3..f10ae401b3 100644
--- a/core-java-modules/core-java-string-conversions/pom.xml
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -30,24 +30,6 @@
commons-lang3${commons-lang3.version}
-
- com.google.guava
- guava
- ${guava.version}
-
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.hamcrest
- hamcrest
- ${hamcrest.version}
- test
-
@@ -62,7 +44,6 @@
61.1
- 3.6.1
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-2/README.md b/core-java-modules/core-java-string-operations-2/README.md
index d66515d372..f95b002906 100644
--- a/core-java-modules/core-java-string-operations-2/README.md
+++ b/core-java-modules/core-java-string-operations-2/README.md
@@ -12,5 +12,5 @@ This module contains articles about string operations.
- [L-Trim and R-Trim Alternatives in Java](https://www.baeldung.com/java-trim-alternatives)
- [Encode a String to UTF-8 in Java](https://www.baeldung.com/java-string-encode-utf-8)
- [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding)
-- [Convert Hex to ASCII in Java](https://www.baeldung.com/java-convert-hex-to-ascii) #remove additional readme file
+- [Convert Hex to ASCII in Java](https://www.baeldung.com/java-convert-hex-to-ascii)
- More articles: [[<-- prev]](../core-java-string-operations)
diff --git a/core-java-modules/core-java-string-operations-2/pom.xml b/core-java-modules/core-java-string-operations-2/pom.xml
index db8f78da70..92bfa6b2d8 100644
--- a/core-java-modules/core-java-string-operations-2/pom.xml
+++ b/core-java-modules/core-java-string-operations-2/pom.xml
@@ -20,11 +20,6 @@
validation-api${validation-api.version}
-
- com.google.guava
- guava
- ${guava.version}
- org.apache.commonscommons-lang3
@@ -45,12 +40,6 @@
javax.el${javax.el.version}
-
- org.hamcrest
- hamcrest
- ${hamcrest.version}
- test
- org.openjdk.jmhjmh-core
@@ -66,12 +55,6 @@
commons-codec${commons-codec.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -108,9 +91,7 @@
- 3.6.12.0.0.Final
- 28.2-jre6.0.2.Final3.0.02.2.6
diff --git a/guest/webservices/rest-server/src/main/resources/logback.xml b/core-java-modules/core-java-string-operations-2/src/main/resources/logback.xml
similarity index 100%
rename from guest/webservices/rest-server/src/main/resources/logback.xml
rename to core-java-modules/core-java-string-operations-2/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/hexToAscii/README.md b/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/hexToAscii/README.md
deleted file mode 100644
index c6d5826333..0000000000
--- a/core-java-modules/core-java-string-operations-2/src/test/java/com/baeldung/hexToAscii/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Convert Hex to ASCII in Java](http://www.baeldung.com/java-convert-hex-to-ascii)
diff --git a/core-java-modules/core-java-string-operations-3/README.md b/core-java-modules/core-java-string-operations-3/README.md
index f4cde6104f..b22cf56e3a 100644
--- a/core-java-modules/core-java-string-operations-3/README.md
+++ b/core-java-modules/core-java-string-operations-3/README.md
@@ -6,3 +6,7 @@
- [Split a String in Java and Keep the Delimiters](https://www.baeldung.com/java-split-string-keep-delimiters)
- [Validate String as Filename in Java](https://www.baeldung.com/java-validate-filename)
- [Count Spaces in a Java String](https://www.baeldung.com/java-string-count-spaces)
+- [Remove Accents and Diacritics From a String in Java](https://www.baeldung.com/java-remove-accents-from-text)
+- [Remove Beginning and Ending Double Quotes from a String](https://www.baeldung.com/java-remove-start-end-double-quote)
+- [Splitting a Java String by Multiple Delimiters](https://www.baeldung.com/java-string-split-multiple-delimiters)
+- [Split a String Only on the First Occurrence of Delimiter](https://www.baeldung.com/java-split-string-first-delimiter)
diff --git a/core-java-modules/core-java-string-operations-3/pom.xml b/core-java-modules/core-java-string-operations-3/pom.xml
index 642ade5ab3..19b3d57ffd 100644
--- a/core-java-modules/core-java-string-operations-3/pom.xml
+++ b/core-java-modules/core-java-string-operations-3/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -26,12 +25,6 @@
commons-lang3${apache-commons-lang3.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- org.apache.mavenmaven-artifact
@@ -77,7 +70,6 @@
1111
- 3.6.15.3.93.12.03.6.3
@@ -86,4 +78,4 @@
3.1.0
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtils.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtils.java
new file mode 100644
index 0000000000..c7cc162026
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtils.java
@@ -0,0 +1,37 @@
+package com.baeldung.doublequotesremoval;
+
+import com.google.common.base.CharMatcher;
+
+public class DoubleQuotesRemovalUtils {
+
+ public static String removeWithSubString(String input) {
+ if (input != null && input.length() >= 2 && input.charAt(0) == '\"'
+ && input.charAt(input.length() - 1) == '\"') {
+ return input.substring(1, input.length() - 1);
+ }
+
+ return input;
+ }
+
+ public static String removeWithReplaceAllSimple(String input) {
+ if (input == null || input.isEmpty())
+ return input;
+
+ return input.replaceAll("\"", "");
+ }
+
+ public static String removeWithReplaceAllAdvanced(String input) {
+ if (input == null || input.isEmpty())
+ return input;
+
+ return input.replaceAll("^\"|\"$", "");
+ }
+
+ public static String removeWithGuava(String input) {
+ if (input == null || input.isEmpty())
+ return input;
+
+ return CharMatcher.is('\"').trimFrom(input);
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/firstword/FirstWordGetter.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/firstword/FirstWordGetter.java
new file mode 100644
index 0000000000..03c134752a
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/firstword/FirstWordGetter.java
@@ -0,0 +1,20 @@
+package com.baeldung.firstword;
+
+public class FirstWordGetter {
+
+ public static void main(String[] args) {
+ String input = "Roberto \"I wish you a bug-free day\"";
+ System.out.println("Using split: " + getFirstWordUsingSplit(input));
+ System.out.println("Using subString: " + getFirstWordUsingSubString(input));
+ }
+
+ public static String getFirstWordUsingSubString(String input) {
+ int index = input.contains(" ") ? input.indexOf(" ") : 0;
+ return input.substring(0, index);
+ }
+
+ public static String getFirstWordUsingSplit(String input) {
+ String[] tokens = input.split(" ", 2);
+ return tokens[0];
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtilsUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtilsUnitTest.java
new file mode 100644
index 0000000000..2761cc3139
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/doublequotesremoval/DoubleQuotesRemovalUtilsUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.doublequotesremoval;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+public class DoubleQuotesRemovalUtilsUnitTest {
+
+ @Test
+ public void given_EmptyString_ShouldReturn_EmptyString() {
+ String input = "";
+
+ assertTrue(DoubleQuotesRemovalUtils.removeWithSubString(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithReplaceAllSimple(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithReplaceAllAdvanced(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithGuava(input).isEmpty());
+ }
+
+ @Test
+ public void given_DoubleQuotesOnly_ShouldReturn_EmptyString() {
+ String input = "\"\"";
+
+ assertTrue(DoubleQuotesRemovalUtils.removeWithSubString(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithReplaceAllSimple(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithReplaceAllAdvanced(input).isEmpty());
+ assertTrue(DoubleQuotesRemovalUtils.removeWithGuava(input).isEmpty());
+ }
+
+ @Test
+ public void given_TextWithDoubleQuotes_ShouldReturn_TextOnly() {
+
+ String input = "\"Example of text for this test suit\"";
+ String expectedResult = "Example of text for this test suit";
+
+ assertEquals(expectedResult, DoubleQuotesRemovalUtils.removeWithSubString(input));
+ assertEquals(expectedResult, DoubleQuotesRemovalUtils.removeWithReplaceAllSimple(input));
+ assertEquals(expectedResult, DoubleQuotesRemovalUtils.removeWithReplaceAllAdvanced(input));
+ assertEquals(expectedResult, DoubleQuotesRemovalUtils.removeWithGuava(input));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/firstword/FirstWordGetterUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/firstword/FirstWordGetterUnitTest.java
new file mode 100644
index 0000000000..bdaa25180e
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/firstword/FirstWordGetterUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.firstword;
+
+import static com.baeldung.firstword.FirstWordGetter.getFirstWordUsingSplit;
+import static com.baeldung.firstword.FirstWordGetter.getFirstWordUsingSubString;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class FirstWordGetterUnitTest {
+
+ @Test
+ public void givenString_whenSplit_thenFirstWordIsReturned() {
+ assertEquals("Roberto", getFirstWordUsingSplit("Roberto \"I wish you a bug-free day\""));
+ }
+
+ @Test
+ public void givenStringWithNoSpace_whenSplit_thenFirstWordIsReturned() {
+ assertEquals("StringWithNoSpace", getFirstWordUsingSplit("StringWithNoSpace"));
+ }
+
+ @Test
+ public void givenString_whenPassedToSubstring_thenFirstWordIsReturned() {
+ assertEquals("Roberto", getFirstWordUsingSubString("Roberto \"I wish you a bug-free day\""));
+ }
+
+ @Test
+ public void givenStringWithNoSpace_whenPassedToSubstring_thenFirstWordIsReturned() {
+ assertEquals("", getFirstWordUsingSubString("StringWithNoSpace"));
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/multipledelimiterssplit/MultipleDelimitersSplitUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/multipledelimiterssplit/MultipleDelimitersSplitUnitTest.java
new file mode 100644
index 0000000000..2da8955645
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/multipledelimiterssplit/MultipleDelimitersSplitUnitTest.java
@@ -0,0 +1,66 @@
+package com.baeldung.multipledelimiterssplit;
+
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterators;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class MultipleDelimitersSplitUnitTest {
+
+ @Test
+ public void givenString_whenSplittingByMultipleDelimitersWithRegEx_thenStringSplit() {
+ String example = "Mary;Thomas:Jane-Kate";
+ String[] names = example.split("[;:-]");
+ String[] expectedNames = new String[]{"Mary", "Thomas", "Jane", "Kate"};
+ Assertions.assertEquals(4, names.length);
+ Assertions.assertArrayEquals(expectedNames, names);
+ }
+
+ @Test
+ public void givenString_whenSplittingByWithCharMatcherAndOnMethod_thenStringSplit() {
+ String example = "Mary;Thomas:Jane-Kate";
+ String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};
+ Iterable expected = Arrays.asList(expectedArray);
+ Iterable names = Splitter.on(CharMatcher.anyOf(";:-")).split(example);
+ Assertions.assertEquals(4, Iterators.size(names.iterator()));
+ Assertions.assertIterableEquals(expected, names);
+ }
+
+ @Test
+ public void givenString_whenSplittingByWithRegexAndOnPatternMethod_thenStringSplit() {
+ String example = "Mary;Thomas:Jane-Kate";
+ String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};
+ Iterable expected = Arrays.asList(expectedArray);
+ Iterable names = Splitter.on(Pattern.compile("[;:-]")).split(example);
+ Assertions.assertEquals(4, Iterators.size(names.iterator()));
+ Assertions.assertIterableEquals(expected, names);
+ }
+
+ @Test
+ public void givenString_whenSplittingByMultipleDelimitersWithGuava_thenStringSplit() {
+ String example = "Mary;Thomas:Jane-Kate";
+ String[] expectedArray = new String[]{"Mary", "Thomas", "Jane", "Kate"};
+ Iterable expected = Arrays.asList(expectedArray);
+ Iterable names = Splitter.onPattern("[;:-]").split(example);
+ Assertions.assertEquals(4, Iterators.size(names.iterator()));
+ Assertions.assertIterableEquals(expected, names);
+ }
+
+ @Test
+ public void givenString_whenSplittingByMultipleDelimitersWithApache_thenStringSplit() {
+ String example = "Mary;Thomas:Jane-Kate";
+ String[] expectedNames = new String[]{"Mary", "Thomas", "Jane", "Kate"};
+ String[] names = StringUtils.split(example, ";:-");
+ Assertions.assertEquals(4, names.length);
+ Assertions.assertArrayEquals(expectedNames, names);
+ }
+
+}
+
diff --git a/core-java-modules/core-java-string-operations-4/README.md b/core-java-modules/core-java-string-operations-4/README.md
new file mode 100644
index 0000000000..0e6c9e7e2c
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/README.md
@@ -0,0 +1,9 @@
+### Relevant Articles:
+
+- [Ignoring Commas in Quotes When Splitting a Comma-separated String](https://www.baeldung.com/java-split-string-commas)
+- [Compare Strings While Ignoring Whitespace in Java](https://www.baeldung.com/java-compare-string-whitespace)
+- [Concatenating Null Strings in Java](https://www.baeldung.com/java-concat-null-string)
+- [Split a String Every n Characters in Java](https://www.baeldung.com/java-string-split-every-n-characters)
+- [String equals() Vs contentEquals() in Java](https://www.baeldung.com/java-string-equals-vs-contentequals)
+- [Check if a String Ends with a Certain Pattern in Java](https://www.baeldung.com/java-string-ends-pattern)
+
diff --git a/core-java-modules/core-java-string-operations-4/pom.xml b/core-java-modules/core-java-string-operations-4/pom.xml
new file mode 100644
index 0000000000..7f71ea8da5
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+ core-java-string-operations-4
+ 0.1.0-SNAPSHOT
+ core-java-string-operations-4
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ com.opencsv
+ opencsv
+ ${opencsv.version}
+
+
+ org.springframework
+ spring-core
+ ${spring-core.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${apache-commons-lang3.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 11
+ 11
+ 4.1
+ 5.3.13
+ 3.12.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java
new file mode 100644
index 0000000000..c3bbdb4dfb
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedString.java
@@ -0,0 +1,66 @@
+package com.baeldung.commaseparatedstring;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Splitter;
+import com.opencsv.CSVParser;
+import com.opencsv.CSVParserBuilder;
+import com.opencsv.CSVReader;
+import com.opencsv.CSVReaderBuilder;
+
+public class SplitCommaSeparatedString {
+
+ public static List splitWithParser(String input) {
+
+ List tokens = new ArrayList();
+ int startPosition = 0;
+ boolean isInQuotes = false;
+ for (int currentPosition = 0; currentPosition < input.length(); currentPosition++) {
+ if (input.charAt(currentPosition) == '\"') {
+ isInQuotes = !isInQuotes;
+ } else if (input.charAt(currentPosition) == ',' && !isInQuotes) {
+ tokens.add(input.substring(startPosition, currentPosition));
+ startPosition = currentPosition + 1;
+ }
+ }
+
+ String lastToken = input.substring(startPosition);
+ if (lastToken.equals(",")) {
+ tokens.add("");
+ } else {
+ tokens.add(lastToken);
+ }
+
+ return tokens;
+ }
+
+ public static List splitWithRegex(String input) {
+ String[] tokens = input.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1);
+ return Arrays.asList(tokens);
+ }
+
+ public static List splitWithGuava(String input) {
+ Pattern pattern = Pattern.compile(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
+ Splitter splitter = Splitter.on(pattern);
+ return splitter.splitToList(input);
+ }
+
+ public static List splitMultiLineWithOpenCSV(String input) throws IOException {
+ CSVParser parser = new CSVParserBuilder().withSeparator(',')
+ .build();
+
+ CSVReader reader = new CSVReaderBuilder(new StringReader(input)).withCSVParser(parser)
+ .build();
+
+ List list = new ArrayList<>();
+ list = reader.readAll();
+ reader.close();
+
+ return list;
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/concatenation/ConcatenatingNull.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/concatenation/ConcatenatingNull.java
new file mode 100644
index 0000000000..250a0d6b25
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/concatenation/ConcatenatingNull.java
@@ -0,0 +1,86 @@
+package com.baeldung.concatenation;
+
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class ConcatenatingNull {
+
+ public static void main(String[] args) {
+ String[] values = { "Java ", null, "", "is ", "great!" };
+
+ concatenateUsingPlusOperator(values);
+ concatenateUsingHelperMethod(values);
+ concatenateUsingStringBuilder(values);
+ concatenateUsingJoin(values);
+ concatenateUsingStringJoiner(values);
+ concatenateUsingCollectorsJoining(values);
+ concatenateUsingStringConcat(values);
+ }
+
+ public static String concatenateUsingStringConcat(String[] values) {
+ String result = "";
+
+ for (String value : values) {
+ result = result.concat(getNonNullString(value));
+ }
+
+ return result;
+ }
+
+ public static String concatenateUsingCollectorsJoining(String[] values) {
+ String result = Stream.of(values).filter(value -> null != value).collect(Collectors.joining(""));
+
+ return result;
+ }
+
+ public static String concatenateUsingStringJoiner(String[] values) {
+ StringJoiner result = new StringJoiner("");
+
+ for (String value : values) {
+ result = result.add(getNonNullString(value));
+ }
+
+ return result.toString();
+ }
+
+ public static String concatenateUsingJoin(String[] values) {
+ String result = String.join("", values);
+
+ return result;
+ }
+
+ public static String concatenateUsingStringBuilder(String[] values) {
+ StringBuilder result = new StringBuilder();
+
+ for (String value : values) {
+ result = result.append(getNonNullString(value));
+ }
+
+ return result.toString();
+ }
+
+ public static String concatenateUsingHelperMethod(String[] values) {
+ String result = "";
+
+ for (String value : values) {
+ result = result + getNonNullString(value);
+ }
+
+ return result;
+ }
+
+ public static String concatenateUsingPlusOperator(String[] values) {
+ String result = "";
+
+ for (String value : values) {
+ result = result + (value == null ? "" : value);
+ }
+
+ return result;
+ }
+
+ private static String getNonNullString(String value) {
+ return value == null ? "" : value;
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/endswithpattern/StringEndsWithPattern.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/endswithpattern/StringEndsWithPattern.java
new file mode 100644
index 0000000000..345ad6d91f
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/endswithpattern/StringEndsWithPattern.java
@@ -0,0 +1,45 @@
+package com.baeldung.endswithpattern;
+
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class StringEndsWithPattern {
+
+ public static boolean usingStringEndsWithMethod(String text, String suffix) {
+ if (text == null || suffix == null) {
+ return false;
+ }
+ return text.endsWith(suffix);
+ }
+
+ public static boolean usingStringMatchesMethod(String text, String suffix) {
+ if (text == null || suffix == null) {
+ return false;
+ }
+ String regex = ".*" + suffix + "$";
+ return text.matches(regex);
+ }
+
+ public static boolean usingStringRegionMatchesMethod(String text, String suffix) {
+ if (text == null || suffix == null) {
+ return false;
+ }
+ int toffset = text.length() - suffix.length();
+ return text.regionMatches(toffset, suffix, 0, suffix.length());
+ }
+
+ public static boolean usingPatternClass(String text, String suffix) {
+ if (text == null || suffix == null) {
+ return false;
+ }
+ Pattern pattern = Pattern.compile(".*" + suffix + "$");
+ return pattern.matcher(text)
+ .find();
+ }
+
+ public static boolean usingApacheCommonsLang(String text, String suffix) {
+ return StringUtils.endsWith(text, suffix);
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/split/SplitStringEveryNthChar.java b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/split/SplitStringEveryNthChar.java
new file mode 100644
index 0000000000..3ac31d012a
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/main/java/com/baeldung/split/SplitStringEveryNthChar.java
@@ -0,0 +1,51 @@
+package com.baeldung.split;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableList;
+
+public class SplitStringEveryNthChar {
+
+ public static List usingSplitMethod(String text, int n) {
+ String[] results = text.split("(?<=\\G.{" + n + "})");
+
+ return Arrays.asList(results);
+ }
+
+ public static List usingSubstringMethod(String text, int n) {
+ List results = new ArrayList<>();
+ int length = text.length();
+
+ for (int i = 0; i < length; i += n) {
+ results.add(text.substring(i, Math.min(length, i + n)));
+ }
+
+ return results;
+ }
+
+ public static List usingPattern(String text, int n) {
+ List results = new ArrayList<>();
+
+ Pattern pattern = Pattern.compile(".{1," + n + "}");
+ Matcher matcher = pattern.matcher(text);
+ while (matcher.find()) {
+ String match = text.substring(matcher.start(), matcher.end());
+ results.add(match);
+ }
+
+ return results;
+ }
+
+ public static List usingGuava(String text, int n) {
+ Iterable parts = Splitter.fixedLength(n)
+ .split(text);
+
+ return ImmutableList.copyOf(parts);
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java
new file mode 100644
index 0000000000..ca34430099
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/commaseparatedstring/SplitCommaSeparatedStringUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.commaseparatedstring;
+
+import static com.baeldung.commaseparatedstring.SplitCommaSeparatedString.splitMultiLineWithOpenCSV;
+import static com.baeldung.commaseparatedstring.SplitCommaSeparatedString.splitWithGuava;
+import static com.baeldung.commaseparatedstring.SplitCommaSeparatedString.splitWithParser;
+import static com.baeldung.commaseparatedstring.SplitCommaSeparatedString.splitWithRegex;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.assertArrayEquals;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Test;
+
+public class SplitCommaSeparatedStringUnitTest {
+
+ @Test
+ public void givenSingleLineInput_whenParsing_shouldIgnoreCommasInsideDoubleQuotes() {
+ String input = "baeldung,tutorial,splitting,text,\"ignoring this comma,\"";
+
+ var matcher = contains("baeldung", "tutorial", "splitting", "text", "\"ignoring this comma,\"");
+ assertThat(splitWithParser(input), matcher);
+ assertThat(splitWithRegex(input), matcher);
+ assertThat(splitWithGuava(input), matcher);
+ }
+
+ @Test
+ public void givenMultiLineInput_whenParsing_shouldIgnoreCommasInsideDoubleQuotes() throws IOException {
+ String input = "baeldung,tutorial,splitting,text,\"ignoring this comma,\"" + System.lineSeparator()
+ + "splitting,a,regular,line,no double quotes";
+
+ String[] firstLine = new String[]{"baeldung", "tutorial", "splitting", "text", "ignoring this comma,"};
+ String[] secondLine = new String[]{"splitting", "a", "regular", "line", "no double quotes"};
+
+ List result = splitMultiLineWithOpenCSV(input);
+
+ assertThat(result, hasSize(2));
+ assertArrayEquals(firstLine, result.get(0));
+ assertArrayEquals(secondLine, result.get(1));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/comparestrings/CompareIgnoreSpacesUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/comparestrings/CompareIgnoreSpacesUnitTest.java
new file mode 100644
index 0000000000..570ceb1598
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/comparestrings/CompareIgnoreSpacesUnitTest.java
@@ -0,0 +1,28 @@
+package com.baeldung.comparestrings;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class CompareIgnoreSpacesUnitTest {
+
+ private static String normalString = "ABCDEF";
+ private static String stringWithSpaces = " AB CD EF ";
+
+ @Test
+ public void givenTwoStrings_thenCompareWithReplaceAllMethod() {
+ assertEquals(normalString.replaceAll("\\s+",""), stringWithSpaces.replaceAll("\\s+",""));
+ }
+
+ @Test
+ public void givenTwoStrings_thenCompareWithApacheStringUtils() {
+ assertEquals(StringUtils.deleteWhitespace(normalString), StringUtils.deleteWhitespace(stringWithSpaces));
+ }
+
+ @Test
+ public void givenTwoStrings_thenCompareWithSpringStringUtils() {
+ assertEquals(org.springframework.util.StringUtils.trimAllWhitespace(normalString), org.springframework.util.StringUtils.trimAllWhitespace(stringWithSpaces));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/concatenation/ConcatenatingNullUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/concatenation/ConcatenatingNullUnitTest.java
new file mode 100644
index 0000000000..20e5f6ad7d
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/concatenation/ConcatenatingNullUnitTest.java
@@ -0,0 +1,59 @@
+package com.baeldung.concatenation;
+
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingCollectorsJoining;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingHelperMethod;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingJoin;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingPlusOperator;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingStringBuilder;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingStringConcat;
+import static com.baeldung.concatenation.ConcatenatingNull.concatenateUsingStringJoiner;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class ConcatenatingNullUnitTest {
+
+ String[] values = { "Java ", null, "", "is ", "great!" };
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingPlus_thenNullIsIgnored() {
+ String result = concatenateUsingPlusOperator(values);
+ assertEquals("Java is great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingHelperMethod_thenNullIsIgnored() {
+ String result = concatenateUsingHelperMethod(values);
+ assertEquals("Java is great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingStringBuilder_thenNullIsIgnored() {
+ String result = concatenateUsingStringBuilder(values);
+ assertEquals("Java is great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingJoin_thenNullIsNotIgnored() {
+ String result = concatenateUsingJoin(values);
+ assertEquals("Java nullis great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingStringJoiner_thenNullIsIgnored() {
+ String result = concatenateUsingStringJoiner(values);
+ assertEquals("Java is great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingCollectorsJoining_thenNullIsIgnored() {
+ String result = concatenateUsingCollectorsJoining(values);
+ assertEquals("Java is great!", result);
+ }
+
+ @Test
+ public void givenStringElementsWithNull_whenConcatenatedUsingStringConcat_thenNullIsIgnored() {
+ String result = concatenateUsingStringConcat(values);
+ assertEquals("Java is great!", result);
+ }
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/endswithpattern/StringEndsWithPatternUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/endswithpattern/StringEndsWithPatternUnitTest.java
new file mode 100644
index 0000000000..1680df17df
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/endswithpattern/StringEndsWithPatternUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.endswithpattern;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.jupiter.api.Test;
+
+public class StringEndsWithPatternUnitTest {
+
+ private static final String TEXT = "Welcome to baeldung.com";
+ private static final String SUFFIX = "com";
+
+ @Test
+ public void givenStringAndSuffix_whenUsingStringEndsWith_thenCheck() {
+
+ assertTrue(StringEndsWithPattern.usingStringEndsWithMethod(TEXT, SUFFIX));
+ }
+
+ @Test
+ public void givenStringAndSuffix_whenUsingStringMatches_thenCheck() {
+
+ assertTrue(StringEndsWithPattern.usingStringMatchesMethod(TEXT, SUFFIX));
+ }
+
+ @Test
+ public void givenStringAndSuffix_whenUsingStringRegionMatches_thenCheck() {
+
+ assertTrue(StringEndsWithPattern.usingStringRegionMatchesMethod(TEXT, SUFFIX));
+ }
+
+ @Test
+ public void givenStringAndSuffix_whenUsingPatternClass_thenCheck() {
+
+ assertTrue(StringEndsWithPattern.usingPatternClass(TEXT, SUFFIX));
+ }
+
+ @Test
+ public void givenStringAndSuffix_whenUsingApacheCommonsLang_thenCheck() {
+
+ assertTrue(StringEndsWithPattern.usingApacheCommonsLang(TEXT, SUFFIX));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/equalsvscontentequals/StringEqualsVsContentEqualsUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/equalsvscontentequals/StringEqualsVsContentEqualsUnitTest.java
new file mode 100644
index 0000000000..1b8c97d024
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/equalsvscontentequals/StringEqualsVsContentEqualsUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.equalsvscontentequals;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class StringEqualsVsContentEqualsUnitTest {
+
+ String actualString = "baeldung";
+ String identicalString = "baeldung";
+ CharSequence identicalStringInstance = "baeldung";
+ CharSequence identicalStringBufferInstance = new StringBuffer("baeldung");
+
+ @Test
+ public void whenIdenticalTestString_thenBothTrue() {
+ assertTrue(actualString.equals(identicalString));
+ assertTrue(actualString.contentEquals(identicalString));
+ }
+
+ @Test
+ public void whenSameContentButDifferentType_thenEqualsIsFalseAndContentEqualsIsTrue() {
+ assertTrue(actualString.equals(identicalStringInstance));
+ assertTrue(actualString.contentEquals(identicalStringInstance));
+
+ assertFalse(actualString.equals(identicalStringBufferInstance));
+ assertTrue(actualString.contentEquals(identicalStringBufferInstance));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/split/SplitStringEveryNthCharUnitTest.java b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/split/SplitStringEveryNthCharUnitTest.java
new file mode 100644
index 0000000000..03dcd5312e
--- /dev/null
+++ b/core-java-modules/core-java-string-operations-4/src/test/java/com/baeldung/split/SplitStringEveryNthCharUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.split;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+public class SplitStringEveryNthCharUnitTest {
+
+ public static final String TEXT = "abcdefgh123456";
+
+ @Test
+ public void givenString_whenUsingSplit_thenSplit() {
+ List results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);
+
+ assertThat(results, contains("abc", "def", "gh1", "234", "56"));
+ }
+
+ @Test
+ public void givenString_whenUsingSubstring_thenSplit() {
+ List results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);
+
+ assertThat(results, contains("abcd", "efgh", "1234", "56"));
+ }
+
+ @Test
+ public void givenString_whenUsingPattern_thenSplit() {
+ List results = SplitStringEveryNthChar.usingPattern(TEXT, 5);
+
+ assertThat(results, contains("abcde", "fgh12", "3456"));
+ }
+
+ @Test
+ public void givenString_whenUsingGuava_thenSplit() {
+ List results = SplitStringEveryNthChar.usingGuava(TEXT, 6);
+
+ assertThat(results, contains("abcdef", "gh1234", "56"));
+ }
+
+}
diff --git a/core-java-modules/core-java-string-operations/pom.xml b/core-java-modules/core-java-string-operations/pom.xml
index 67ce43277e..20e4df3ba3 100644
--- a/core-java-modules/core-java-string-operations/pom.xml
+++ b/core-java-modules/core-java-string-operations/pom.xml
@@ -40,12 +40,6 @@
commons-codec${commons-codec.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -59,7 +53,6 @@
- 3.6.11.15
diff --git a/core-java-modules/core-java-strings/pom.xml b/core-java-modules/core-java-strings/pom.xml
index aca0bb3346..2cc35dad5f 100644
--- a/core-java-modules/core-java-strings/pom.xml
+++ b/core-java-modules/core-java-strings/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -36,12 +35,6 @@
icu4j${icu4j.version}
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -55,7 +48,6 @@
- 3.6.161.115
diff --git a/core-java-modules/core-java-sun/pom.xml b/core-java-modules/core-java-sun/pom.xml
index 347020a736..e959932235 100644
--- a/core-java-modules/core-java-sun/pom.xml
+++ b/core-java-modules/core-java-sun/pom.xml
@@ -12,17 +12,9 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- com.suntools
@@ -94,10 +86,7 @@
-
- 3.6.11.7.0
-
1.8.0
diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
index 663cf6708b..cb2fd9fb40 100644
--- a/core-java-modules/core-java-time-measurements/pom.xml
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -13,7 +13,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
@@ -28,13 +27,6 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
- joda-timejoda-time
@@ -46,15 +38,9 @@
${asspectj.version}
- org.powermock
- powermock-module-junit4
- ${powermock.version}
- test
-
-
- org.powermock
- powermock-api-mockito2
- ${powermock.version}
+ org.mockito
+ mockito-inline
+ ${mockito-inline.version}test
@@ -75,8 +61,8 @@
+ org.apache.maven.pluginsmaven-surefire-plugin
- ${maven-surefire-plugin.version}
-javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
@@ -88,17 +74,12 @@
-
3.6.12.10
- 1.18.12
-
- 3.6.1
+ 1.18.221.8.9
- 2.0.71.44
-
- 2.22.1
+ 4.1.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java
index 608199197a..ba1821b1ce 100644
--- a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java
+++ b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java
@@ -1,20 +1,15 @@
package com.baeldung.time;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.mockito.MockedStatic;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.powermock.api.mockito.PowerMockito.mockStatic;
-import static org.powermock.api.mockito.PowerMockito.when;
+import static org.mockito.Mockito.mockStatic;
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ Instant.class })
public class InstantUnitTest {
@Test
@@ -22,12 +17,12 @@ public class InstantUnitTest {
String instantExpected = "2014-12-22T10:15:30Z";
Clock clock = Clock.fixed(Instant.parse(instantExpected), ZoneId.of("UTC"));
Instant instant = Instant.now(clock);
- mockStatic(Instant.class);
- when(Instant.now()).thenReturn(instant);
- Instant now = Instant.now();
-
- assertThat(now.toString()).isEqualTo(instantExpected);
+ try (MockedStatic mockedStatic = mockStatic(Instant.class)) {
+ mockedStatic.when(Instant::now).thenReturn(instant);
+ Instant now = Instant.now();
+ assertThat(now.toString()).isEqualTo(instantExpected);
+ }
}
@Test
diff --git a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
index 52dc9ba1c6..e4401d67b7 100644
--- a/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
+++ b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
@@ -1,9 +1,6 @@
package com.baeldung.time;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
import java.time.Clock;
import java.time.Instant;
@@ -11,11 +8,7 @@ import java.time.LocalDateTime;
import java.time.ZoneId;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.when;
-import static org.powermock.api.mockito.PowerMockito.mockStatic;
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({ LocalDateTime.class })
public class LocalDateTimeUnitTest {
@Test
diff --git a/core-java-modules/core-java-uuid/README.md b/core-java-modules/core-java-uuid/README.md
new file mode 100644
index 0000000000..836552d798
--- /dev/null
+++ b/core-java-modules/core-java-uuid/README.md
@@ -0,0 +1,5 @@
+## Core Java UUID
+
+### Relevant Articles:
+- [Generating Alphanumeric UUID String in Java](https://www.baeldung.com/java-generate-alphanumeric-uuid)
+- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
diff --git a/core-java-modules/core-java-uuid/pom.xml b/core-java-modules/core-java-uuid/pom.xml
new file mode 100644
index 0000000000..28519a1a68
--- /dev/null
+++ b/core-java-modules/core-java-uuid/pom.xml
@@ -0,0 +1,147 @@
+
+
+ 4.0.0
+ core-java-uuid
+ 0.1.0-SNAPSHOT
+ core-java-uuid
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+
+ core-java-uuid
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ prepare-package
+
+ copy-dependencies
+
+
+ ${project.build.directory}/libs
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ ${source.version}
+ ${target.version}
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*ManualTest.java
+
+
+ **/*IntegrationTest.java
+ **/*IntTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+ 3.0.0-M1
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
rename to core-java-modules/core-java-uuid/src/main/java/com/baeldung/uuid/UUIDGenerator.java
diff --git a/core-java-modules/core-java-uuid/src/main/resources/log4j.properties b/core-java-modules/core-java-uuid/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/main/resources/log4j2.xml b/core-java-modules/core-java-uuid/src/main/resources/log4j2.xml
new file mode 100644
index 0000000000..a824bef9b0
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/main/resources/logback.xml b/core-java-modules/core-java-uuid/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/uuid/UUIDGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDGeneratorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/uuid/UUIDGeneratorUnitTest.java
rename to core-java-modules/core-java-uuid/src/test/java/com/baeldung/uuid/UUIDGeneratorUnitTest.java
diff --git a/core-java-modules/core-java-uuid/src/test/resources/log4j.properties b/core-java-modules/core-java-uuid/src/test/resources/log4j.properties
new file mode 100644
index 0000000000..621cf01735
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/resources/log4j.properties
@@ -0,0 +1,6 @@
+log4j.rootLogger=DEBUG, A1
+
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/test/resources/log4j2.xml b/core-java-modules/core-java-uuid/src/test/resources/log4j2.xml
new file mode 100644
index 0000000000..a824bef9b0
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/resources/log4j2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/test/resources/log4jstructuraldp.properties b/core-java-modules/core-java-uuid/src/test/resources/log4jstructuraldp.properties
new file mode 100644
index 0000000000..5bc2bfe4b9
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/resources/log4jstructuraldp.properties
@@ -0,0 +1,9 @@
+
+# Root logger
+log4j.rootLogger=INFO, file, stdout
+
+# Write to console
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md
index f1cf2d8c09..a75805e0c2 100644
--- a/core-java-modules/core-java/README.md
+++ b/core-java-modules/core-java/README.md
@@ -3,13 +3,7 @@
### Relevant Articles:
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
-- [Introduction to Java Serialization](http://www.baeldung.com/java-serialization)
-- [Guide to UUID in Java](http://www.baeldung.com/java-uuid)
- [Compiling Java *.class Files with javac](http://www.baeldung.com/javac)
- [Introduction to Javadoc](http://www.baeldung.com/javadoc)
-- [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable)
-- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
-- [Deserialization Vulnerabilities in Java](https://www.baeldung.com/java-deserialization-vulnerabilities)
-- [Generating Alphanumeric UUID String in Java](https://www.baeldung.com/java-generate-alphanumeric-uuid)
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index db2b1edc70..188c6a6f63 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -49,18 +49,16 @@
${lombok.version}provided
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
- org.javamoneymoneta${javamoney.moneta.version}
+
+ org.springframework
+ spring-core
+ ${spring.core.version}
+
@@ -180,13 +178,12 @@
0.41.8.7
-
- 3.10.01.13.0.0-M11.81.8
+ 4.3.20.RELEASE
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java b/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java
new file mode 100644
index 0000000000..2bb9614e66
--- /dev/null
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/javadoc/CodeSnippetFormatting.java
@@ -0,0 +1,154 @@
+package com.baeldung.javadoc;
+
+public class CodeSnippetFormatting {
+
+ /**
+ * This is an example to show default behavior of code snippet formatting in Javadocs
+ *
+ * public class Application(){
+ *
+ * }
+ *
+ */
+ public void showCodeSnippetFormatting() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to show usage of HTML pre tag while code snippet formatting in Javadocs
+ *
+ *
+ * public class Application(){
+ * List nums = new ArrayList<>();
+ * }
+ *
+ *
+ */
+ public void showCodeSnippetFormattingUsingPRETag() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to show usage of HTML character entities while code snippet formatting in Javadocs
+ *
+ *
+ * public class Application(){
+ * List<Integer> nums = new ArrayList<>();
+ * }
+ *
+ *
+ */
+ public void showCodeSnippetFormattingUsingCharacterEntities() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to show usage of javadoc code tag while code snippet formatting in Javadocs
+ *
+ *
+ *
+ * public class Application(){
+ * {@code List nums = new ArrayList<>(); }
+ * }
+ *
+ *
+ */
+ public void showCodeSnippetFormattingUsingCodeTag() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to show issue faced while using annotations in Javadocs
+ *
+ *
+ *
+ * public class Application(){
+ * @Getter
+ * {@code List nums = new ArrayList<>(); }
+ * }
+ *
+ *
+ */
+ public void showCodeSnippetFormattingIssueUsingCodeTag() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to show usage of javadoc code tag for handling '@' character
+ *
+ *
+ *
+ * public class Application(){
+ * {@code @Getter}
+ * {@code List nums = new ArrayList<>(); }
+ * }
+ *
+ *
+ */
+ public void showCodeSnippetAnnotationFormattingUsingCodeTag() {
+ // do nothing
+ }
+
+
+ /**
+ * This is an example to show difference in javadoc literal and code tag
+ *
+ *
+ *
+ * {@literal @Getter}
+ * {@literal List nums = new ArrayList<>(); }
+ *
+ *
+ * {@code @Getter}
+ * {@code List nums = new ArrayList<>(); }
+ *
+ */
+ public void showCodeSnippetCommentsFormattingUsingCodeAndLiteralTag() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to illustrate a basic jQuery code snippet embedded in documentation comments
+ *
+ * {@code }
+ *
+ */
+ public void showJSCodeSnippetUsingJavadoc() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to illustrate an HTML code snippet embedded in documentation comments
+ *
{@code
+ *
+ *
+ *
Hello World!
+ *
+ * }
+ *
+ *
+ */
+ public void showHTMLCodeSnippetUsingJavadoc() {
+ // do nothing
+ }
+
+ /**
+ * This is an example to illustrate an HTML code snippet embedded in documentation comments
+ *
+ *
+ *
+ *
Hello World!
+ *
+ *
+ *
+ *
+ */
+ public void showHTMLCodeSnippetIssueUsingJavadoc() {
+ // do nothing
+ }
+
+}
diff --git a/core-java-modules/multimodulemavenproject/pom.xml b/core-java-modules/multimodulemavenproject/pom.xml
index f45774ae00..fbafa7ebff 100644
--- a/core-java-modules/multimodulemavenproject/pom.xml
+++ b/core-java-modules/multimodulemavenproject/pom.xml
@@ -23,23 +23,6 @@
mainappmodule
-
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
-
-
@@ -60,7 +43,6 @@
3.8.01.91.9
- 3.12.2
\ No newline at end of file
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 5291c8c3ca..d9da5a845b 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -90,7 +90,6 @@
core-java-lang-syntax-2core-java-networkingcore-java-networking-2
- core-java-networking-3core-java-niocore-java-nio-2core-java-optional
@@ -99,6 +98,9 @@
core-java-reflection-2core-java-securitycore-java-security-2
+ core-java-security-3
+ core-java-serialization
+ core-java-security-algorithmscore-java-streamscore-java-streams-2core-java-streams-3
@@ -114,6 +116,7 @@
core-java-suncore-java-regexcore-java-regex-2
+ core-java-uuidpre-jpms
@@ -134,9 +137,4 @@
-
- 2.22.2
- 5.6.2
-
-
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index 60e425b936..cd4bd0faa3 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -12,7 +12,6 @@
com.baeldung.core-java-modulescore-java-modules0.0.1-SNAPSHOT
- ../
diff --git a/ddd-modules/pom.xml b/ddd-modules/pom.xml
index 376dad89e5..134a9d0566 100644
--- a/ddd-modules/pom.xml
+++ b/ddd-modules/pom.xml
@@ -39,12 +39,6 @@
${junit-jupiter.version}test
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
@@ -80,9 +74,6 @@
3.8.11.0
-
- 5.6.2
- 3.12.2
diff --git a/ddd/pom.xml b/ddd/pom.xml
index cc5a173e85..3beb43bb35 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -86,11 +86,6 @@
spring-boot-starter-testtest
-
- org.mockito
- mockito-core
- test
- de.flapdoodle.embedde.flapdoodle.embed.mongo
diff --git a/discord4j/pom.xml b/discord4j/pom.xml
index 1e73e5109b..e15bd47583 100644
--- a/discord4j/pom.xml
+++ b/discord4j/pom.xml
@@ -43,7 +43,7 @@
com.discord4jdiscord4j-core
- 3.1.1
+ ${discord4j-core.version}
@@ -66,6 +66,7 @@
1.8
+ 3.1.1
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
index ab3ddd35b7..0de3694215 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -4,3 +4,5 @@
- [Reusing Docker Layers with Spring Boot](https://www.baeldung.com/docker-layers-spring-boot)
- [Running Spring Boot with PostgreSQL in Docker Compose](https://www.baeldung.com/spring-boot-postgresql-docker)
- [How To Configure Java Heap Size Inside a Docker Container](https://www.baeldung.com/ops/docker-jvm-heap-size)
+- [Dockerfile Strategies for Git](https://www.baeldung.com/ops/dockerfile-git-strategies)
+- [How to Get Docker-Compose to Always Use the Latest Image](https://www.baeldung.com/ops/docker-compose-latest-image)
diff --git a/docker/docker-sample-app/Dockerfile b/docker/docker-sample-app/Dockerfile
new file mode 100644
index 0000000000..71fc1a29d9
--- /dev/null
+++ b/docker/docker-sample-app/Dockerfile
@@ -0,0 +1,3 @@
+FROM openjdk:11
+COPY target/docker-sample-app-0.0.1.jar app.jar
+ENTRYPOINT ["java","-jar","/app.jar"]
diff --git a/docker/docker-sample-app/README.md b/docker/docker-sample-app/README.md
new file mode 100644
index 0000000000..6aeaa1d2a3
--- /dev/null
+++ b/docker/docker-sample-app/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles:
+
+- How to Get Docker-Compose to Always Use the Latest Image
diff --git a/docker/docker-sample-app/docker-compose-build-image.yaml b/docker/docker-sample-app/docker-compose-build-image.yaml
new file mode 100644
index 0000000000..27c1d8ee44
--- /dev/null
+++ b/docker/docker-sample-app/docker-compose-build-image.yaml
@@ -0,0 +1,8 @@
+version: '2.4'
+services:
+ db:
+ image: postgres
+ my_app:
+ build: .
+ ports:
+ - "8080:8080"
diff --git a/docker/docker-sample-app/docker-compose-with-image.yaml b/docker/docker-sample-app/docker-compose-with-image.yaml
new file mode 100644
index 0000000000..9a8822f762
--- /dev/null
+++ b/docker/docker-sample-app/docker-compose-with-image.yaml
@@ -0,0 +1,9 @@
+version: '2.4'
+services:
+ db:
+ image: postgres
+ my_app:
+ image: "eugen/test-app:latest"
+ ports:
+ - "8080:8080"
+
diff --git a/guest/remote-debugging/pom.xml b/docker/docker-sample-app/pom.xml
similarity index 54%
rename from guest/remote-debugging/pom.xml
rename to docker/docker-sample-app/pom.xml
index 4541160e37..6841fabcee 100644
--- a/guest/remote-debugging/pom.xml
+++ b/docker/docker-sample-app/pom.xml
@@ -1,33 +1,39 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.stackify
- remote-debugging
- 0.0.1-SNAPSHOT
- remote-debugging
- war
-
- org.springframework.boot
- spring-boot-starter-parent
- 1.5.8.RELEASE
-
+ com.baeldung.docker
+ docker
+ 0.0.1
+ docker-sample-app
+ docker-sample-app
+ Demo project for Spring Boot and Docker
+
+
+ 11
+
+
org.springframework.boot
- spring-boot-starter-web
+ spring-boot-starterorg.springframework.boot
- spring-boot-starter-tomcat
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
- remote-debuggingorg.springframework.boot
@@ -36,9 +42,4 @@
-
- UTF-8
- UTF-8
-
-
diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java
similarity index 57%
rename from guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java
rename to docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java
index 9d1a632638..e7ff52015c 100644
--- a/guest/remote-debugging/src/main/java/com/stackify/debug/JavaRemoteDebuggingApplication.java
+++ b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/DockAppApplication.java
@@ -1,12 +1,13 @@
-package com.stackify.debug;
+package com.baeldung.docker.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
-public class JavaRemoteDebuggingApplication {
+public class DockAppApplication {
public static void main(String[] args) {
- SpringApplication.run(JavaRemoteDebuggingApplication.class, args);
+ SpringApplication.run(DockAppApplication.class, args);
}
+
}
diff --git a/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java
new file mode 100644
index 0000000000..d46c57e606
--- /dev/null
+++ b/docker/docker-sample-app/src/main/java/com/baeldung/docker/app/endpoint/MyController.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.app.endpoint;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class MyController {
+
+ @GetMapping
+ public String version() {
+ return "1.7";
+ }
+}
diff --git a/docker/docker-sample-app/src/main/resources/application.properties b/docker/docker-sample-app/src/main/resources/application.properties
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/docker/docker-sample-app/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java b/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java
new file mode 100644
index 0000000000..7220766988
--- /dev/null
+++ b/docker/docker-sample-app/src/test/java/com/baeldung/docker/app/DockAppApplicationUnitTest.java
@@ -0,0 +1,13 @@
+package com.baeldung.docker.app;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DockAppApplicationUnitTest {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/docker/dockerfile-with-git/.gitmodules b/docker/dockerfile-with-git/.gitmodules
new file mode 100644
index 0000000000..aa3911dfc3
--- /dev/null
+++ b/docker/dockerfile-with-git/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "project"]
+ path = project
+ url = https://github.com/eugenp/tutorials.git
+ branch = master
\ No newline at end of file
diff --git a/docker/dockerfile-with-git/Dockerfile b/docker/dockerfile-with-git/Dockerfile
new file mode 100644
index 0000000000..91dfee3bc6
--- /dev/null
+++ b/docker/dockerfile-with-git/Dockerfile
@@ -0,0 +1,13 @@
+ADD . /project/
+ADD /build/ /project/
+ADD /output/project.jar /project/
+
+ADD ssh-private-key /root/.ssh/id_rsa
+RUN git clone git@github.com:eugenp/tutorials.git
+
+ARG username=$GIT_USERNAME
+ARG password=$GIT_PASSWORD
+RUN git clone https://username:password@github.com:eugenp/tutorials.git
+
+VOLUME /build/ /project/
+
diff --git a/docker/pom.xml b/docker/pom.xml
index 3fcc9ca94f..f481f1b8b7 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -25,6 +25,7 @@
docker-internal-dtodocker-spring-boot
+ docker-sample-app
diff --git a/drools/pom.xml b/drools/pom.xml
index cc96d9d032..daaf1fa8a7 100644
--- a/drools/pom.xml
+++ b/drools/pom.xml
@@ -19,7 +19,6 @@
httpcore${http-component-version}
-
org.kiekie-ci
diff --git a/eclipse/formatter.xml b/eclipse/formatter.xml
deleted file mode 100644
index 6887946a4c..0000000000
--- a/eclipse/formatter.xml
+++ /dev/null
@@ -1,295 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index b9a3870702..6c1a0e900f 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -1,7 +1,7 @@
+ 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.0com.baeldung.ethereumethereum
@@ -112,6 +112,13 @@
spring-boot-starter-testtest${spring.boot.version}
+
+
+
+ junit
+ junit
+
+ org.springframework
@@ -137,24 +144,6 @@
test
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.hamcrest
- hamcrest-core
-
-
-
-
- org.hamcrest
- hamcrest
- ${hamcrest.version}
- test
- com.jayway.jsonpathjson-path
@@ -202,7 +191,6 @@
1.5.0-RELEASE3.3.11.5.6.RELEASE
- 2.21.02.4.02.0.4.RELEASE3.1
diff --git a/feign/pom.xml b/feign/pom.xml
index 56059d2a77..cf28890868 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -11,7 +11,6 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ..
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index dbd21374e2..3d52ff0e36 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -11,7 +11,6 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ..
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index 6b93ccbc71..bcccc136a4 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -44,12 +44,6 @@
gwt-devprovided
-
- junit
- junit
- ${junit.version}
- test
-
diff --git a/gradle/maven-to-gradle/build.gradle b/gradle/maven-to-gradle/build.gradle
new file mode 100644
index 0000000000..71a9360f91
--- /dev/null
+++ b/gradle/maven-to-gradle/build.gradle
@@ -0,0 +1,31 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+plugins {
+ id 'java'
+ id 'maven-publish'
+}
+
+repositories {
+ mavenLocal()
+ maven {
+ url = 'http://repo.maven.apache.org/maven2'
+ }
+}
+
+dependencies {
+ implementation 'org.apache.commons:commons-lang3:3.12.0'
+}
+
+group = 'com.balendung'
+version = '0.0.1-SNAPSHOT'
+sourceCompatibility = '1.8'
+
+publishing {
+ publications {
+ maven(MavenPublication) {
+ from(components.java)
+ }
+ }
+}
diff --git a/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..f3d88b1c2f
Binary files /dev/null and b/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..ba94df8451
--- /dev/null
+++ b/gradle/maven-to-gradle/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradle/maven-to-gradle/gradlew b/gradle/maven-to-gradle/gradlew
new file mode 100644
index 0000000000..2fe81a7d95
--- /dev/null
+++ b/gradle/maven-to-gradle/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradle/maven-to-gradle/gradlew.bat b/gradle/maven-to-gradle/gradlew.bat
new file mode 100644
index 0000000000..9618d8d960
--- /dev/null
+++ b/gradle/maven-to-gradle/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/gradle/maven-to-gradle/pom.xml b/gradle/maven-to-gradle/pom.xml
new file mode 100644
index 0000000000..32eaf63d9c
--- /dev/null
+++ b/gradle/maven-to-gradle/pom.xml
@@ -0,0 +1,15 @@
+
+ 4.0.0
+ com.baeldung
+ maven-to-gradle
+ 0.0.1-SNAPSHOT
+
+
+ org.apache.commons
+ commons-lang3
+ 3.12.0
+
+
+
diff --git a/gradle/maven-to-gradle/settings.gradle b/gradle/maven-to-gradle/settings.gradle
new file mode 100644
index 0000000000..8a7251a5c2
--- /dev/null
+++ b/gradle/maven-to-gradle/settings.gradle
@@ -0,0 +1,5 @@
+/*
+ * This file was generated by the Gradle 'init' task.
+ */
+
+rootProject.name = 'maven-to-gradle'
diff --git a/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java b/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
new file mode 100644
index 0000000000..1e96d46ee9
--- /dev/null
+++ b/gradle/maven-to-gradle/src/main/java/com/sample/javacode/DisplayTime.java
@@ -0,0 +1,21 @@
+package com.sample.javacode;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class DisplayTime {
+
+ public static void main(String[] args) {
+ Date date = new java.util.Date();
+ System.out.println(date);
+ String gmt = date.toString();
+ boolean flag = StringUtils.isEmpty(gmt);
+ if (flag) {
+ System.out.println("No time found");
+ } else {
+ System.out.println(gmt);
+ }
+ }
+
+}
diff --git a/graphql/graphql-java/pom.xml b/graphql/graphql-java/pom.xml
index eae30aa8fa..4e2444c1fb 100644
--- a/graphql/graphql-java/pom.xml
+++ b/graphql/graphql-java/pom.xml
@@ -12,7 +12,6 @@
com.baeldungparent-modules1.0.0-SNAPSHOT
- ../..
diff --git a/grpc/pom.xml b/grpc/pom.xml
index 50700b0785..40284c90fe 100644
--- a/grpc/pom.xml
+++ b/grpc/pom.xml
@@ -1,88 +1,84 @@
- 4.0.0
- grpc
- 0.0.1-SNAPSHOT
- grpc
- jar
+ 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
+ grpc
+ 0.0.1-SNAPSHOT
+ grpc
+ jar
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
-
-
- io.grpc
- grpc-netty-shaded
- runtime
- ${io.grpc.version}
-
-
- io.grpc
- grpc-protobuf
- ${io.grpc.version}
-
-
- io.grpc
- grpc-stub
- ${io.grpc.version}
-
-
- io.grpc
- grpc-testing
- ${io.grpc.version}
- test
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- javax.annotation
- javax.annotation-api
- 1.2
-
-
+
+
+ io.grpc
+ grpc-netty-shaded
+ runtime
+ ${io.grpc.version}
+
+
+ io.grpc
+ grpc-protobuf
+ ${io.grpc.version}
+
+
+ io.grpc
+ grpc-stub
+ ${io.grpc.version}
+
+
+ io.grpc
+ grpc-testing
+ ${io.grpc.version}
+ test
+
+
+ javax.annotation
+ javax.annotation-api
+ 1.2
+
+
+
+
+
+
+ kr.motd.maven
+ os-maven-plugin
+ ${os-maven-plugin.version}
+
+
+
+
+ org.xolstice.maven.plugins
+ protobuf-maven-plugin
+ ${protobuf-maven-plugin.version}
+
+ com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
+ grpc-java
+ io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}
+
+
+
+
+ compile
+ compile-custom
+
+
+
+
+
+
+
+
+ 1.40.1
+ 3.17.2
+ 1.6.2
+ 0.6.1
+
-
-
-
- kr.motd.maven
- os-maven-plugin
- ${os-maven-plugin.version}
-
-
-
-
- org.xolstice.maven.plugins
- protobuf-maven-plugin
- ${protobuf-maven-plugin.version}
-
- com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}
- grpc-java
- io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}
-
-
-
-
- compile
- compile-custom
-
-
-
-
-
-
-
- 1.40.1
- 3.17.2
- 1.6.2
- 0.6.1
-
\ No newline at end of file
diff --git a/gson/pom.xml b/gson/pom.xml
index a928d87b61..082e53baf0 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -61,10 +61,7 @@
-
2.8.0
-
- 4.12.9.6
diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml
index ed295db2f4..8f5108bff1 100644
--- a/guava-modules/guava-18/pom.xml
+++ b/guava-modules/guava-18/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml
index 3c29a2a59c..ba85fe0ae8 100644
--- a/guava-modules/guava-19/pom.xml
+++ b/guava-modules/guava-19/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml
index 8b7c3cdcfd..9e791bfe23 100644
--- a/guava-modules/guava-21/pom.xml
+++ b/guava-modules/guava-21/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
diff --git a/guava-modules/guava-collections-list/pom.xml b/guava-modules/guava-collections-list/pom.xml
index d281be2235..6863b4011c 100644
--- a/guava-modules/guava-collections-list/pom.xml
+++ b/guava-modules/guava-collections-list/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
@@ -27,25 +26,6 @@
${commons-lang3.version}
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
org.hamcrestjava-hamcrest
@@ -65,12 +45,7 @@
-
- 4.1
-
- 3.6.12.0.0.0
- 5.6.2
\ No newline at end of file
diff --git a/guava-modules/guava-collections-map/pom.xml b/guava-modules/guava-collections-map/pom.xml
index a03a779b3e..04beaa13a1 100644
--- a/guava-modules/guava-collections-map/pom.xml
+++ b/guava-modules/guava-collections-map/pom.xml
@@ -12,24 +12,8 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
-
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
-
guava-collections-map
@@ -40,7 +24,4 @@
-
- 5.6.2
-
\ No newline at end of file
diff --git a/guava-modules/guava-collections-set/pom.xml b/guava-modules/guava-collections-set/pom.xml
index b989966a54..49bfc46ee2 100644
--- a/guava-modules/guava-collections-set/pom.xml
+++ b/guava-modules/guava-collections-set/pom.xml
@@ -11,39 +11,10 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
-
-
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
guava-collections-set
-
-
- 3.6.1
- 5.6.2
-
-
\ No newline at end of file
diff --git a/guava-modules/guava-collections/pom.xml b/guava-modules/guava-collections/pom.xml
index 021c4c6037..9283107023 100644
--- a/guava-modules/guava-collections/pom.xml
+++ b/guava-modules/guava-collections/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
@@ -32,25 +31,6 @@
${jool.version}
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
org.hamcrestjava-hamcrest
@@ -70,13 +50,8 @@
-
- 4.10.9.12
-
- 3.6.12.0.0.0
- 5.6.2
\ No newline at end of file
diff --git a/guava-modules/guava-core/pom.xml b/guava-modules/guava-core/pom.xml
index a15dfb5178..dd68fef43a 100644
--- a/guava-modules/guava-core/pom.xml
+++ b/guava-modules/guava-core/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
@@ -20,13 +19,6 @@
commons-lang3${commons-lang3.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -39,9 +31,4 @@
-
-
- 3.6.1
-
-
\ No newline at end of file
diff --git a/guava-modules/guava-io/pom.xml b/guava-modules/guava-io/pom.xml
index f6ebac8ba4..2ea91c5e4f 100644
--- a/guava-modules/guava-io/pom.xml
+++ b/guava-modules/guava-io/pom.xml
@@ -11,24 +11,8 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
-
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
-
guava-io
@@ -39,8 +23,4 @@
-
- 5.6.2
-
-
\ No newline at end of file
diff --git a/guava-modules/guava-utilities/pom.xml b/guava-modules/guava-utilities/pom.xml
index a9aca0ee08..ab849072a5 100644
--- a/guava-modules/guava-utilities/pom.xml
+++ b/guava-modules/guava-utilities/pom.xml
@@ -11,7 +11,6 @@
com.baeldungguava-modules0.0.1-SNAPSHOT
- ../
@@ -20,25 +19,6 @@
commons-lang3${commons-lang3.version}
-
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
@@ -51,10 +31,4 @@
-
-
- 5.6.2
- 3.6.1
-
-
\ No newline at end of file
diff --git a/guava-modules/pom.xml b/guava-modules/pom.xml
index 8ffac98b51..d5b01d3402 100644
--- a/guava-modules/pom.xml
+++ b/guava-modules/pom.xml
@@ -34,24 +34,6 @@
guava${guava.version}
-
- org.junit.jupiter
- junit-jupiter
- ${junit-jupiter.version}
- test
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-jupiter.version}
- test
-
-
- 2.22.2
- 5.6.2
- 29.0-jre
-
-
\ No newline at end of file
diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml
deleted file mode 100644
index 786f85ce86..0000000000
--- a/guest/core-java-9/pom.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
- 4.0.0
- com.stackify
- core-java-9
- 0.0.1-SNAPSHOT
- core-java-9
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
-
-
-
-
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
-
- 1.9
- 1.9
-
-
-
\ No newline at end of file
diff --git a/guest/core-java-9/src/main/java/com/stackify/optional/User.java b/guest/core-java-9/src/main/java/com/stackify/optional/User.java
deleted file mode 100644
index 903e75f6f6..0000000000
--- a/guest/core-java-9/src/main/java/com/stackify/optional/User.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.stackify.optional;
-
-public class User {
- private String email;
- private String password;
-
- public User(String email, String password) {
- super();
- this.email = email;
- this.password = password;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-}
diff --git a/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java b/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java
deleted file mode 100644
index 4c3503b811..0000000000
--- a/guest/core-java-9/src/test/java/com/stackify/optional/OptionalTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.stackify.optional;
-
-import org.junit.Test;
-import java.util.Optional;
-import java.util.List;
-
-import static org.junit.Assert.*;
-import java.util.stream.Collectors;
-
-public class OptionalTest {
-
- private User user;
-
- @Test
- public void whenEmptyOptional_thenGetValueFromOr() {
- User result = Optional.ofNullable(user)
- .or( () -> Optional.of(new User("default","1234"))).get();
-
- assertEquals(result.getEmail(), "default");
- }
-
- @Test
- public void whenIfPresentOrElse_thenOk() {
- Optional.ofNullable(user)
- .ifPresentOrElse( u -> System.out.println("User is:" + u.getEmail()), () -> System.out.println("User not found"));
- }
-
- @Test
- public void whenGetStream_thenOk() {
- User user = new User("john@gmail.com", "1234");
- List emails = Optional.ofNullable(user)
- .stream()
- .filter(u -> u.getEmail() != null && u.getEmail().contains("@"))
- .map( u -> u.getEmail())
- .collect(Collectors.toList());
-
- assertTrue(emails.size() == 1);
- assertEquals(emails.get(0), user.getEmail());
- }
-
-}
diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml
deleted file mode 100644
index aaf67fd27e..0000000000
--- a/guest/core-java/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
- 4.0.0
- com.stackify
- core-java
- 0.0.1-SNAPSHOT
- core-java
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
-
-
-
- org.apache.logging.log4j
- log4j-core
- ${log4j2.version}
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
-
-
- 2.8.2
- 3.6.1
-
-
-
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optional/Address.java b/guest/core-java/src/main/java/com/stackify/optional/Address.java
deleted file mode 100644
index f54c999920..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/Address.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.stackify.optional;
-
-public class Address {
- private String addressLine;
- private String city;
- private Country country;
-
- public Address(String addressLine, String city, Country country) {
- super();
- this.addressLine = addressLine;
- this.city = city;
- this.country = country;
- }
-
- public String getAddressLine() {
- return addressLine;
- }
-
- public void setAddressLine(String addressLine) {
- this.addressLine = addressLine;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
-
-}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/Country.java b/guest/core-java/src/main/java/com/stackify/optional/Country.java
deleted file mode 100644
index bf97ef7b6d..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/Country.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.stackify.optional;
-
-public class Country {
- private String name;
- private String isocode;
-
- public Country(String name, String isocode) {
- super();
- this.name = name;
- this.isocode = isocode;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getIsocode() {
- return isocode;
- }
-
- public void setIsocode(String isocode) {
- this.isocode = isocode;
- }
-
-}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/User.java b/guest/core-java/src/main/java/com/stackify/optional/User.java
deleted file mode 100644
index 910f2605dd..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/User.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.stackify.optional;
-
-import java.util.Optional;
-
-public class User {
- private String email;
- private String password;
-
- private Address address;
-
- private String position;
-
- public User(String email, String password) {
- super();
- this.email = email;
- this.password = password;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Optional getPosition() {
- return Optional.ofNullable(position);
- }
-
- public void setPosition(String position) {
- this.position = position;
- }
-
-}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java
deleted file mode 100644
index 1e10c67c39..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/chaining/Address.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.stackify.optional.chaining;
-
-import java.util.Optional;
-
-public class Address {
- private String addressLine;
- private String city;
- private Country country;
-
- public Address(String addressLine, String city) {
- this.addressLine = addressLine;
- this.city = city;
- }
-
- public String getAddressLine() {
- return addressLine;
- }
-
- public void setAddressLine(String addressLine) {
- this.addressLine = addressLine;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public Optional getCountry() {
- return Optional.ofNullable(country);
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-}
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java
deleted file mode 100644
index 89e85a9b43..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/chaining/Country.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.stackify.optional.chaining;
-
-public class Country {
- private String name;
- private String isocode;
-
- public Country(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getIsocode() {
- return isocode;
- }
-
- public void setIsocode(String isocode) {
- this.isocode = isocode;
- }
-
-
-}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java b/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java
deleted file mode 100644
index 07eb398abe..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optional/chaining/User.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.stackify.optional.chaining;
-
-import java.util.Optional;
-
-public class User {
- private String email;
- private String password;
-
- private Address address;
-
- private String position;
-
- public User(String email, String password) {
- this.email = email;
- this.password = password;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public Optional getAddress() {
- return Optional.ofNullable(address);
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Optional getPosition() {
- return Optional.ofNullable(position);
- }
-
- public void setPosition(String position) {
- this.position = position;
- }
-
-}
diff --git a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitamin.java b/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitamin.java
deleted file mode 100644
index 90cb49b321..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitamin.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package com.stackify.optionalparams;
-
-public class MultiVitamin {
-
- private String name; // required
- private int vitaminA; // in mcg
- private int vitaminC; // in mg
- private int calcium; // in mg
- private int iron; // in mg
-
- public MultiVitamin(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public int getVitaminA() {
- return vitaminA;
- }
-
- public void setVitaminA(int vitaminA) {
- this.vitaminA = vitaminA;
- }
-
- public int getVitaminC() {
- return vitaminC;
- }
-
- public void setVitaminC(int vitaminC) {
- this.vitaminC = vitaminC;
- }
-
- public int getCalcium() {
- return calcium;
- }
-
- public void setCalcium(int calcium) {
- this.calcium = calcium;
- }
-
- public int getIron() {
- return iron;
- }
-
- public void setIron(int iron) {
- this.iron = iron;
- }
-}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminAllowingNulls.java b/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminAllowingNulls.java
deleted file mode 100644
index 1d2a61354d..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminAllowingNulls.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.stackify.optionalparams;
-
-public class MultiVitaminAllowingNulls {
-
- private String name; // required
- private Integer vitaminA; // in mcg
- private Integer vitaminC; // in mg
- private Integer calcium; // in mg
- private Integer iron; // in mg
-
- public MultiVitaminAllowingNulls(String name, Integer vitaminA, Integer vitaminC, Integer calcium, Integer iron) {
- this.name = name;
- this.vitaminA = vitaminA;
- this.vitaminC = vitaminC;
- this.calcium = calcium;
- this.iron = iron;
- }
-
- public String getName() {
- return name;
- }
-
- public Integer getVitaminA() {
- return vitaminA;
- }
-
- public Integer getVitaminC() {
- return vitaminC;
- }
-
- public Integer getCalcium() {
- return calcium;
- }
-
- public Integer getIron() {
- return iron;
- }
-}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminOverloading.java b/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminOverloading.java
deleted file mode 100644
index e9dcb2509b..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminOverloading.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.stackify.optionalparams;
-
-public class MultiVitaminOverloading {
-
- static final int DEFAULT_IRON_AMOUNT = 20;
-
- private final String name; // required
- private final int vitaminA; // in mcg
- private final int vitaminC; // in mg
- private final int calcium; // in mg
- private final int iron; // in mg
-
- public MultiVitaminOverloading(String name) {
- this(name, 0);
- }
-
- public MultiVitaminOverloading(String name, int vitaminA) {
- this(name, vitaminA, 0);
- }
-
- public MultiVitaminOverloading(String name, int vitaminA, int vitaminC) {
- this(name, vitaminA, vitaminC, 0);
- }
-
- public MultiVitaminOverloading(String name, int vitaminA, int vitaminC, int calcium) {
- this(name, vitaminA, vitaminC, calcium, DEFAULT_IRON_AMOUNT);
- }
-
- public MultiVitaminOverloading(String name, int vitaminA, int vitaminC, int calcium, int iron) {
- this.name = name;
- this.vitaminA = vitaminA;
- this.vitaminC = vitaminC;
- this.calcium = calcium;
- this.iron = iron;
- }
-
- public String getName() {
- return name;
- }
-
- public int getVitaminA() {
- return vitaminA;
- }
-
- public int getVitaminC() {
- return vitaminC;
- }
-
- public int getCalcium() {
- return calcium;
- }
-
- public int getIron() {
- return iron;
- }
-}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminStaticFactoryMethods.java b/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminStaticFactoryMethods.java
deleted file mode 100644
index 229a2f0004..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminStaticFactoryMethods.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.stackify.optionalparams;
-
-public class MultiVitaminStaticFactoryMethods {
-
- static final int IRON_AMT_DEF = 20;
- static final int IRON_AMT_MEN = 30;
-
- static final int CALCIUM_AMT_DEF = 100;
- static final int CALCIUM_AMT_WOMEN = 120;
-
- private final String name; // required
- private final int vitaminA; // in mcg
- private final int vitaminC; // in mg
- private final int calcium; // in mg
- private final int iron; // in mg
-
- public static MultiVitaminStaticFactoryMethods forMen(String name) {
- return new MultiVitaminStaticFactoryMethods(name, 5000, 60, CALCIUM_AMT_DEF, IRON_AMT_MEN);
- }
-
- public static MultiVitaminStaticFactoryMethods forWomen(String name) {
- return new MultiVitaminStaticFactoryMethods(name, 5000, 60, CALCIUM_AMT_WOMEN, IRON_AMT_DEF);
- }
-
- private MultiVitaminStaticFactoryMethods(String name, int vitaminA, int vitaminC, int calcium, int iron) {
- this.name = name;
- this.vitaminA = vitaminA;
- this.vitaminC = vitaminC;
- this.calcium = calcium;
- this.iron = iron;
- }
-
- public String getName() {
- return name;
- }
-
- public int getVitaminA() {
- return vitaminA;
- }
-
- public int getVitaminC() {
- return vitaminC;
- }
-
- public int getCalcium() {
- return calcium;
- }
-
- public int getIron() {
- return iron;
- }
-}
\ No newline at end of file
diff --git a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminWithBuilder.java b/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminWithBuilder.java
deleted file mode 100644
index 8097074b86..0000000000
--- a/guest/core-java/src/main/java/com/stackify/optionalparams/MultiVitaminWithBuilder.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.stackify.optionalparams;
-
-public class MultiVitaminWithBuilder {
-
- private final String name; // required
- private final int vitaminA; // in mcg
- private final int vitaminC; // in mg
- private final int calcium; // in mg
- private final int iron; // in mg
-
- private MultiVitaminWithBuilder(MultiVitaminBuilder builder) {
- this.name = builder.name;
- this.vitaminA = builder.vitaminA;
- this.vitaminC = builder.vitaminC;
- this.calcium = builder.calcium;
- this.iron = builder.iron;
- }
-
- public String getName() {
- return name;
- }
-
- public int getVitaminA() {
- return vitaminA;
- }
-
- public int getVitaminC() {
- return vitaminC;
- }
-
- public int getCalcium() {
- return calcium;
- }
-
- public int getIron() {
- return iron;
- }
-
- public static class MultiVitaminBuilder {
-
- private static final int ZERO = 0;
-
- private final String name; // required
- private int vitaminA = ZERO;
- private int vitaminC = ZERO;
- private int calcium = ZERO;
- private int iron = ZERO;
-
- public MultiVitaminBuilder(String name) {
- this.name = name;
- }
-
- public MultiVitaminBuilder withVitaminA(int vitaminA) {
- this.vitaminA = vitaminA;
- return this;
- }
-
- public MultiVitaminBuilder withVitaminC(int vitaminC) {
- this.vitaminC = vitaminC;
- return this;
- }
-
- public MultiVitaminBuilder withCalcium(int calcium) {
- this.calcium = calcium;
- return this;
- }
-
- public MultiVitaminBuilder withIron(int iron) {
- this.iron = iron;
- return this;
- }
-
- public MultiVitaminWithBuilder build() {
- return new MultiVitaminWithBuilder(this);
- }
- }
-}
diff --git a/guest/core-java/src/main/java/com/stackify/stream/Employee.java b/guest/core-java/src/main/java/com/stackify/stream/Employee.java
deleted file mode 100644
index 005990c863..0000000000
--- a/guest/core-java/src/main/java/com/stackify/stream/Employee.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.stackify.stream;
-
-public class Employee {
- private Integer id;
- private String name;
- private Double salary;
-
- public Employee(Integer id, String name, Double salary) {
- this.id = id;
- this.name = name;
- this.salary = salary;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Double getSalary() {
- return salary;
- }
-
- public void setSalary(Double salary) {
- this.salary = salary;
- }
-
- public void salaryIncrement(Double percentage) {
- Double newSalary = salary + percentage * salary / 100;
- setSalary(newSalary);
- }
-
- public String toString() {
- return "Id: " + id + " Name:" + name + " Price:" + salary;
- }
-}
diff --git a/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java b/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java
deleted file mode 100644
index 223fee5e26..0000000000
--- a/guest/core-java/src/main/java/com/stackify/stream/EmployeeRepository.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.stackify.stream;
-
-import java.util.List;
-
-public class EmployeeRepository {
- private List empList;
-
- public EmployeeRepository(List empList) {
- this.empList = empList;
-
- }
- public Employee findById(Integer id) {
- for (Employee emp : empList) {
- if (emp.getId() == id) {
- return emp;
- }
- }
-
- return null;
- }
-}
diff --git a/guest/core-java/src/main/resources/log4j2.xml b/guest/core-java/src/main/resources/log4j2.xml
deleted file mode 100644
index a67aae6aa6..0000000000
--- a/guest/core-java/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java b/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java
deleted file mode 100644
index c6e6ddb15d..0000000000
--- a/guest/core-java/src/test/java/com/stackify/optional/OptionalTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.stackify.optional;
-
-import static org.junit.Assert.*;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.Test;
-
-public class OptionalTest {
-
- private User user;
-
- private Logger logger = LogManager.getLogger(OptionalTest.class);
-
- @Test(expected = NullPointerException.class)
- public void testNull() {
- String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
- }
-
- @Test
- public void test() {
-
- if (user != null) {
- Address address = user.getAddress();
- if (address != null) {
- Country country = address.getCountry();
- if (country != null) {
- String isocode = country.getIsocode();
- if (isocode != null) {
- isocode = isocode.toUpperCase();
- }
- }
- }
- }
-
- }
-
- @Test(expected = NoSuchElementException.class)
- public void whenCreateEmptyOptional_thenNull() {
- Optional emptyOpt = Optional.empty();
- emptyOpt.get();
- }
-
- @Test(expected = NullPointerException.class)
- public void whenCreateOfEmptyOptional_thenNullPointerException() {
- Optional opt = Optional.of(user);
- }
-
- @Test
- public void whenCreateOfNullableOptional_thenOk() {
- String name = "John";
- Optional opt = Optional.ofNullable(name);
- assertEquals("John", opt.get());
- }
-
- @Test
- public void whenCheckIsPresent_thenOk() {
- user = new User("john@gmail.com", "1234");
- Optional opt = Optional.ofNullable(user);
- assertTrue(opt.isPresent());
-
- assertEquals(user.getEmail(), opt.get().getEmail());
- }
-
- @Test
- public void whenCheckIfPresent_thenOk() {
- user = new User("john@gmail.com", "1234");
- Optional opt = Optional.ofNullable(user);
- assertTrue(opt.isPresent());
-
- opt.ifPresent(u -> assertEquals(user.getEmail(), u.getEmail()));
- }
-
- @Test
- public void whenEmptyValue_thenReturnDefault() {
- User user = null;
- User user2 = new User("anna@gmail.com", "1234");
- User result = Optional.ofNullable(user).orElse(user2);
-
- assertEquals("anna@gmail.com", result.getEmail());
- }
-
- @Test
- public void whenValueNotNull_thenIgnoreDefault() {
- User user = new User("john@gmail.com", "1234");
- User user2 = new User("anna@gmail.com", "1234");
- User result = Optional.ofNullable(user).orElse(user2);
-
- assertEquals("john@gmail.com", result.getEmail());
- }
-
- @Test
- public void whenSetDefaultOrElseGet_thenOk() {
- User user = null;
- User user2 = new User("anna@gmail.com", "1234");
- User result = Optional.ofNullable(user).orElseGet(() -> user2);
-
- assertEquals("anna@gmail.com", result.getEmail());
- }
-
- @Test
- public void givenPresentValue_whenCompare_thenOk() {
- User user = new User("john@gmail.com", "1234");
- logger.info("Using orElse");
- User result = Optional.ofNullable(user).orElse(createNewUser());
- logger.info("Using orElseGet");
- User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
- }
-
- private User createNewUser() {
- logger.info("Creating New User");
- return new User("extra@gmail.com", "1234");
- }
-
- @Test
- public void givenEmptyValue_whenCompare_thenOk() {
- User user = null;
- logger.info("Using orElse");
- User result = Optional.ofNullable(user).orElse(createNewUser());
- logger.info("Using orElseGet");
- User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void whenThrowException_thenOk() {
- User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());
- }
-
- @Test
- public void whenMap_thenOk() {
- user = new User("anna@gmail.com", "1234");
- String email = Optional.ofNullable(user).map(u -> u.getEmail()).orElse("default@gmail.com");
- assertEquals(email, user.getEmail());
-
- }
-
- @Test
- public void whenFlatMap_thenOk() {
- user = new User("anna@gmail.com", "1234");
- user.setPosition("Developer");
- String position = Optional.ofNullable(user).flatMap(u -> u.getPosition()).orElse("default");
- assertEquals(position, user.getPosition().get());
-
- }
-
- @Test
- public void whenFilter_thenOk() {
- user = new User("anna@gmail.com", "1234");
- Optional result = Optional.ofNullable(user).filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
-
- assertTrue(result.isPresent());
- }
-
- @Test
- public void whenStream_thenOk() {
- List users = new ArrayList<>();
- User user = users.stream().findFirst().orElse(new User("default", "1234"));
- assertEquals(user.getEmail(), "default");
- }
-
-}
diff --git a/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java b/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java
deleted file mode 100644
index 660497c367..0000000000
--- a/guest/core-java/src/test/java/com/stackify/optional/chaining/OptionalChainingTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.stackify.optional.chaining;
-
-import static org.junit.Assert.*;
-
-import java.util.Optional;
-
-import org.junit.Test;
-
-public class OptionalChainingTest {
-
- @Test
- public void whenChaining_thenOk() {
- User user = new User("anna@gmail.com", "1234");
-
- String result = Optional.ofNullable(user)
- .flatMap(u -> u.getAddress())
- .flatMap(a -> a.getCountry())
- .map(c -> c.getIsocode())
- .orElse("default");
-
- assertEquals(result, "default");
- }
-
- @Test
- public void whenChainingWithMethodReferences_thenOk() {
- User user = new User("anna@gmail.com", "1234");
-
- String result = Optional.ofNullable(user)
- .flatMap(User::getAddress)
- .flatMap(Address::getCountry)
- .map(Country::getIsocode)
- .orElse("default");
-
- assertEquals(result, "default");
- }
-}
diff --git a/guest/core-java/src/test/java/com/stackify/optionalparams/OptionalParamsUnitTest.java b/guest/core-java/src/test/java/com/stackify/optionalparams/OptionalParamsUnitTest.java
deleted file mode 100644
index 947ce83a90..0000000000
--- a/guest/core-java/src/test/java/com/stackify/optionalparams/OptionalParamsUnitTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-package com.stackify.optionalparams;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.math.BigDecimal;
-
-import org.assertj.core.util.Arrays;
-import org.junit.Test;
-
-public class OptionalParamsUnitTest {
-
- @Test
- public void whenCreateMultiVitaminWithOverloading_thenOk() {
- MultiVitaminOverloading multiVitamin = new MultiVitaminOverloading("Default Multivitamin");
-
- assertThat(multiVitamin.getName()).isEqualTo("Default Multivitamin");
- assertThat(multiVitamin.getVitaminA()).isEqualTo(0);
- assertThat(multiVitamin.getVitaminC()).isEqualTo(0);
- assertThat(multiVitamin.getCalcium()).isEqualTo(0);
- assertThat(multiVitamin.getIron()).isEqualTo(MultiVitaminOverloading.DEFAULT_IRON_AMOUNT);
- }
-
- @Test
- public void whenCreateMultiVitaminWithStaticFactoryMethods_thenOk() {
- MultiVitaminStaticFactoryMethods mensMultiVitamin = MultiVitaminStaticFactoryMethods.forMen("Complete for Men");
-
- assertThat(mensMultiVitamin.getName()).isEqualTo("Complete for Men");
- assertThat(mensMultiVitamin.getCalcium()).isEqualTo(MultiVitaminStaticFactoryMethods.CALCIUM_AMT_DEF);
- assertThat(mensMultiVitamin.getIron()).isEqualTo(MultiVitaminStaticFactoryMethods.IRON_AMT_MEN);
-
- MultiVitaminStaticFactoryMethods womensMultiVitamin = MultiVitaminStaticFactoryMethods.forWomen("Complete for Women");
-
- assertThat(womensMultiVitamin.getName()).isEqualTo("Complete for Women");
- assertThat(womensMultiVitamin.getCalcium()).isEqualTo(MultiVitaminStaticFactoryMethods.CALCIUM_AMT_WOMEN);
- assertThat(womensMultiVitamin.getIron()).isEqualTo(MultiVitaminStaticFactoryMethods.IRON_AMT_DEF);
- }
-
- @Test
- public void whenCreateMultiVitaminWithBuilder_thenOk() {
- MultiVitaminWithBuilder vitamin = new MultiVitaminWithBuilder.MultiVitaminBuilder("Maximum Strength")
- .withCalcium(100)
- .withIron(200)
- .withVitaminA(50)
- .withVitaminC(1000)
- .build();
-
- assertThat(vitamin.getName()).isEqualTo("Maximum Strength");
- assertThat(vitamin.getCalcium()).isEqualTo(100);
- assertThat(vitamin.getIron()).isEqualTo(200);
- assertThat(vitamin.getVitaminA()).isEqualTo(50);
- assertThat(vitamin.getVitaminC()).isEqualTo(1000);
- }
-
- @Test
- public void whenCreateMutliVitaminWithAccessors_thenOk() {
- MultiVitamin vitamin = new MultiVitamin("Generic");
- vitamin.setVitaminA(50);
- vitamin.setVitaminC(1000);
- vitamin.setCalcium(100);
- vitamin.setIron(200);
-
- assertThat(vitamin.getName()).isEqualTo("Generic");
- assertThat(vitamin.getCalcium()).isEqualTo(100);
- assertThat(vitamin.getIron()).isEqualTo(200);
- assertThat(vitamin.getVitaminA()).isEqualTo(50);
- assertThat(vitamin.getVitaminC()).isEqualTo(1000);
- }
-
- @Test
- public void whenCreateMultiVitaminWithNulls_thenOk() {
- MultiVitamin vitamin = new MultiVitamin(null);
-
- assertThat(vitamin.getName()).isNull();
- }
-
- public void varArgsDemo() {
- Object[] args = Arrays.array(Long.valueOf(1), Integer.valueOf(2), BigDecimal.valueOf(3));
-
- processVarArgsWithCastingAntiPattern(args);
- }
-
- private void processVarArgsWithCastingAntiPattern(Object... args) {
- String message = "processing %s as %s";
-
- // never do this sort of thing
- for (Object arg : args) {
- if (arg instanceof Long) {
- System.out.println(String.format(message, arg, "Long"));
- } else if (arg instanceof Integer) {
- System.out.println(String.format(message, arg, "Integer"));
- } else if (arg instanceof BigDecimal) {
- System.out.println(String.format(message, arg, "BigDecimal"));
- }
- }
- }
-}
diff --git a/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java b/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java
deleted file mode 100644
index cf988d035a..0000000000
--- a/guest/core-java/src/test/java/com/stackify/stream/EmployeeTest.java
+++ /dev/null
@@ -1,455 +0,0 @@
-package com.stackify.stream;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
-import static org.junit.Assert.assertEquals;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.DoubleSummaryStatistics;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-import java.util.Vector;
-import java.util.function.BinaryOperator;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.junit.After;
-import org.junit.Test;
-
-public class EmployeeTest {
- private String fileName = "src/test/resources/test.txt";
-
- private static Employee[] arrayOfEmps = {
- new Employee(1, "Jeff Bezos", 100000.0),
- new Employee(2, "Bill Gates", 200000.0),
- new Employee(3, "Mark Zuckerberg", 300000.0)
- };
-
- private static List empList = Arrays.asList(arrayOfEmps);
- private static EmployeeRepository employeeRepository = new EmployeeRepository(empList);
-
- @After
- public void cleanup() throws IOException {
- Files.deleteIfExists(Paths.get(fileName));
- }
-
- @Test
- public void whenGetStreamFromList_ObtainStream() {
- assert(empList.stream() instanceof Stream>);
- }
-
- @Test
- public void whenGetStreamFromArray_ObtainStream() {
- assert(Stream.of(arrayOfEmps) instanceof Stream>);
- }
-
- @Test
- public void whenGetStreamFromElements_ObtainStream() {
- assert(Stream.of(arrayOfEmps[0], arrayOfEmps[1], arrayOfEmps[2]) instanceof Stream>);
- }
-
- @Test
- public void whenBuildStreamFromElements_ObtainStream() {
- Stream.Builder empStreamBuilder = Stream.builder();
-
- empStreamBuilder.accept(arrayOfEmps[0]);
- empStreamBuilder.accept(arrayOfEmps[1]);
- empStreamBuilder.accept(arrayOfEmps[2]);
-
- Stream empStream = empStreamBuilder.build();
-
- assert(empStream instanceof Stream>);
- }
-
- @Test
- public void whenIncrementSalaryForEachEmployee_thenApplyNewSalary() {
- Employee[] arrayOfEmps = {
- new Employee(1, "Jeff Bezos", 100000.0),
- new Employee(2, "Bill Gates", 200000.0),
- new Employee(3, "Mark Zuckerberg", 300000.0)
- };
-
- List empList = Arrays.asList(arrayOfEmps);
-
- empList.stream().forEach(e -> e.salaryIncrement(10.0));
-
- assertThat(empList, contains(
- hasProperty("salary", equalTo(110000.0)),
- hasProperty("salary", equalTo(220000.0)),
- hasProperty("salary", equalTo(330000.0))
- ));
- }
-
- @Test
- public void whenIncrementSalaryUsingPeek_thenApplyNewSalary() {
- Employee[] arrayOfEmps = {
- new Employee(1, "Jeff Bezos", 100000.0),
- new Employee(2, "Bill Gates", 200000.0),
- new Employee(3, "Mark Zuckerberg", 300000.0)
- };
-
- List empList = Arrays.asList(arrayOfEmps);
-
- empList.stream()
- .peek(e -> e.salaryIncrement(10.0))
- .peek(System.out::println)
- .collect(Collectors.toList());
-
- assertThat(empList, contains(
- hasProperty("salary", equalTo(110000.0)),
- hasProperty("salary", equalTo(220000.0)),
- hasProperty("salary", equalTo(330000.0))
- ));
- }
-
- @Test
- public void whenMapIdToEmployees_thenGetEmployeeStream() {
- Integer[] empIds = { 1, 2, 3 };
-
- List employees = Stream.of(empIds)
- .map(employeeRepository::findById)
- .collect(Collectors.toList());
-
- assertEquals(employees.size(), empIds.length);
- }
-
- @Test
- public void whenFlatMapEmployeeNames_thenGetNameStream() {
- List> namesNested = Arrays.asList(
- Arrays.asList("Jeff", "Bezos"),
- Arrays.asList("Bill", "Gates"),
- Arrays.asList("Mark", "Zuckerberg"));
-
- List namesFlatStream = namesNested.stream()
- .flatMap(Collection::stream)
- .collect(Collectors.toList());
-
- assertEquals(namesFlatStream.size(), namesNested.size() * 2);
- }
-
- @Test
- public void whenFilterEmployees_thenGetFilteredStream() {
- Integer[] empIds = { 1, 2, 3, 4 };
-
- List employees = Stream.of(empIds)
- .map(employeeRepository::findById)
- .filter(e -> e != null)
- .filter(e -> e.getSalary() > 200000)
- .collect(Collectors.toList());
-
- assertEquals(Arrays.asList(arrayOfEmps[2]), employees);
- }
-
- @Test
- public void whenFindFirst_thenGetFirstEmployeeInStream() {
- Integer[] empIds = { 1, 2, 3, 4 };
-
- Employee employee = Stream.of(empIds)
- .map(employeeRepository::findById)
- .filter(e -> e != null)
- .filter(e -> e.getSalary() > 100000)
- .findFirst()
- .orElse(null);
-
- assertEquals(employee.getSalary(), new Double(200000));
- }
-
- @Test
- public void whenCollectStreamToList_thenGetList() {
- List employees = empList.stream().collect(Collectors.toList());
-
- assertEquals(empList, employees);
- }
-
- @Test
- public void whenStreamToArray_thenGetArray() {
- Employee[] employees = empList.stream().toArray(Employee[]::new);
-
- assertThat(empList.toArray(), equalTo(employees));
- }
-
- @Test
- public void whenStreamCount_thenGetElementCount() {
- Long empCount = empList.stream()
- .filter(e -> e.getSalary() > 200000)
- .count();
-
- assertEquals(empCount, new Long(1));
- }
-
- @Test
- public void whenLimitInfiniteStream_thenGetFiniteElements() {
- Stream infiniteStream = Stream.iterate(2, i -> i * 2);
-
- List collect = infiniteStream
- .skip(3)
- .limit(5)
- .collect(Collectors.toList());
-
- assertEquals(collect, Arrays.asList(16, 32, 64, 128, 256));
- }
-
- @Test
- public void whenSortStream_thenGetSortedStream() {
- List employees = empList.stream()
- .sorted((e1, e2) -> e1.getName().compareTo(e2.getName()))
- .collect(Collectors.toList());
-
- assertEquals(employees.get(0).getName(), "Bill Gates");
- assertEquals(employees.get(1).getName(), "Jeff Bezos");
- assertEquals(employees.get(2).getName(), "Mark Zuckerberg");
- }
-
-
- @Test
- public void whenFindMin_thenGetMinElementFromStream() {
- Employee firstEmp = empList.stream()
- .min((e1, e2) -> e1.getId() - e2.getId())
- .orElseThrow(NoSuchElementException::new);
-
- assertEquals(firstEmp.getId(), new Integer(1));
- }
-
- @Test
- public void whenFindMax_thenGetMaxElementFromStream() {
- Employee maxSalEmp = empList.stream()
- .max(Comparator.comparing(Employee::getSalary))
- .orElseThrow(NoSuchElementException::new);
-
- assertEquals(maxSalEmp.getSalary(), new Double(300000.0));
- }
-
- @Test
- public void whenApplyDistinct_thenRemoveDuplicatesFromStream() {
- List intList = Arrays.asList(2, 5, 3, 2, 4, 3);
- List distinctIntList = intList.stream().distinct().collect(Collectors.toList());
-
- assertEquals(distinctIntList, Arrays.asList(2, 5, 3, 4));
- }
-
- @Test
- public void whenApplyMatch_thenReturnBoolean() {
- List intList = Arrays.asList(2, 4, 5, 6, 8);
-
- boolean allEven = intList.stream().allMatch(i -> i % 2 == 0);
- boolean oneEven = intList.stream().anyMatch(i -> i % 2 == 0);
- boolean noneMultipleOfThree = intList.stream().noneMatch(i -> i % 3 == 0);
-
- assertEquals(allEven, false);
- assertEquals(oneEven, true);
- assertEquals(noneMultipleOfThree, false);
- }
-
- @Test
- public void whenFindMaxOnIntStream_thenGetMaxInteger() {
- Integer latestEmpId = empList.stream()
- .mapToInt(Employee::getId)
- .max()
- .orElseThrow(NoSuchElementException::new);
-
- assertEquals(latestEmpId, new Integer(3));
- }
-
- @Test
- public void whenApplySumOnIntStream_thenGetSum() {
- Double avgSal = empList.stream()
- .mapToDouble(Employee::getSalary)
- .average()
- .orElseThrow(NoSuchElementException::new);
-
- assertEquals(avgSal, new Double(200000));
- }
-
- @Test
- public void whenApplyReduceOnStream_thenGetValue() {
- Double sumSal = empList.stream()
- .map(Employee::getSalary)
- .reduce(0.0, Double::sum);
-
- assertEquals(sumSal, new Double(600000));
- }
-
- @Test
- public void whenCollectByJoining_thenGetJoinedString() {
- String empNames = empList.stream()
- .map(Employee::getName)
- .collect(Collectors.joining(", "))
- .toString();
-
- assertEquals(empNames, "Jeff Bezos, Bill Gates, Mark Zuckerberg");
- }
-
- @Test
- public void whenCollectBySet_thenGetSet() {
- Set empNames = empList.stream()
- .map(Employee::getName)
- .collect(Collectors.toSet());
-
- assertEquals(empNames.size(), 3);
- }
-
- @Test
- public void whenToVectorCollection_thenGetVector() {
- Vector empNames = empList.stream()
- .map(Employee::getName)
- .collect(Collectors.toCollection(Vector::new));
-
- assertEquals(empNames.size(), 3);
- }
-
- @Test
- public void whenApplySummarizing_thenGetBasicStats() {
- DoubleSummaryStatistics stats = empList.stream()
- .collect(Collectors.summarizingDouble(Employee::getSalary));
-
- assertEquals(stats.getCount(), 3);
- assertEquals(stats.getSum(), 600000.0, 0);
- assertEquals(stats.getMin(), 100000.0, 0);
- assertEquals(stats.getMax(), 300000.0, 0);
- assertEquals(stats.getAverage(), 200000.0, 0);
- }
-
- @Test
- public void whenApplySummaryStatistics_thenGetBasicStats() {
- DoubleSummaryStatistics stats = empList.stream()
- .mapToDouble(Employee::getSalary)
- .summaryStatistics();
-
- assertEquals(stats.getCount(), 3);
- assertEquals(stats.getSum(), 600000.0, 0);
- assertEquals(stats.getMin(), 100000.0, 0);
- assertEquals(stats.getMax(), 300000.0, 0);
- assertEquals(stats.getAverage(), 200000.0, 0);
- }
-
- @Test
- public void whenStreamPartition_thenGetMap() {
- List intList = Arrays.asList(2, 4, 5, 6, 8);
- Map> isEven = intList.stream().collect(
- Collectors.partitioningBy(i -> i % 2 == 0));
-
- assertEquals(isEven.get(true).size(), 4);
- assertEquals(isEven.get(false).size(), 1);
- }
-
- @Test
- public void whenStreamGroupingBy_thenGetMap() {
- Map> groupByAlphabet = empList.stream().collect(
- Collectors.groupingBy(e -> new Character(e.getName().charAt(0))));
-
- assertEquals(groupByAlphabet.get('B').get(0).getName(), "Bill Gates");
- assertEquals(groupByAlphabet.get('J').get(0).getName(), "Jeff Bezos");
- assertEquals(groupByAlphabet.get('M').get(0).getName(), "Mark Zuckerberg");
- }
-
- @Test
- public void whenStreamMapping_thenGetMap() {
- Map> idGroupedByAlphabet = empList.stream().collect(
- Collectors.groupingBy(e -> new Character(e.getName().charAt(0)),
- Collectors.mapping(Employee::getId, Collectors.toList())));
-
- assertEquals(idGroupedByAlphabet.get('B').get(0), new Integer(2));
- assertEquals(idGroupedByAlphabet.get('J').get(0), new Integer(1));
- assertEquals(idGroupedByAlphabet.get('M').get(0), new Integer(3));
- }
-
- @Test
- public void whenStreamReducing_thenGetValue() {
- Double percentage = 10.0;
- Double salIncrOverhead = empList.stream().collect(Collectors.reducing(
- 0.0, e -> e.getSalary() * percentage / 100, (s1, s2) -> s1 + s2));
-
- assertEquals(salIncrOverhead, 60000.0, 0);
- }
-
- @Test
- public void whenStreamGroupingAndReducing_thenGetMap() {
- Comparator byNameLength = Comparator.comparing(Employee::getName);
-
- Map> longestNameByAlphabet = empList.stream().collect(
- Collectors.groupingBy(e -> new Character(e.getName().charAt(0)),
- Collectors.reducing(BinaryOperator.maxBy(byNameLength))));
-
- assertEquals(longestNameByAlphabet.get('B').get().getName(), "Bill Gates");
- assertEquals(longestNameByAlphabet.get('J').get().getName(), "Jeff Bezos");
- assertEquals(longestNameByAlphabet.get('M').get().getName(), "Mark Zuckerberg");
- }
-
- @Test
- public void whenParallelStream_thenPerformOperationsInParallel() {
- Employee[] arrayOfEmps = {
- new Employee(1, "Jeff Bezos", 100000.0),
- new Employee(2, "Bill Gates", 200000.0),
- new Employee(3, "Mark Zuckerberg", 300000.0)
- };
-
- List empList = Arrays.asList(arrayOfEmps);
-
- empList.stream().parallel().forEach(e -> e.salaryIncrement(10.0));
-
- assertThat(empList, contains(
- hasProperty("salary", equalTo(110000.0)),
- hasProperty("salary", equalTo(220000.0)),
- hasProperty("salary", equalTo(330000.0))
- ));
- }
-
- @Test
- public void whenGenerateStream_thenGetInfiniteStream() {
- Stream.generate(Math::random)
- .limit(5)
- .forEach(System.out::println);
- }
-
- @Test
- public void whenIterateStream_thenGetInfiniteStream() {
- Stream evenNumStream = Stream.iterate(2, i -> i * 2);
-
- List collect = evenNumStream
- .limit(5)
- .collect(Collectors.toList());
-
- assertEquals(collect, Arrays.asList(2, 4, 8, 16, 32));
- }
-
- @Test
- public void whenStreamToFile_thenGetFile() throws IOException {
- String[] words = {
- "hello",
- "refer",
- "world",
- "level"
- };
-
- try (PrintWriter pw = new PrintWriter(
- Files.newBufferedWriter(Paths.get(fileName)))) {
- Stream.of(words).forEach(pw::println);
- }
- }
-
- private List getPalindrome(Stream stream, int length) {
- return stream.filter(s -> s.length() == length)
- .filter(s -> s.compareToIgnoreCase(
- new StringBuilder(s).reverse().toString()) == 0)
- .collect(Collectors.toList());
- }
-
- @Test
- public void whenFileToStream_thenGetStream() throws IOException {
- whenStreamToFile_thenGetFile();
-
- List str = getPalindrome(Files.lines(Paths.get(fileName)), 5);
- assertThat(str, contains("refer", "level"));
- }
-}
diff --git a/guest/core-kotlin/.gitignore b/guest/core-kotlin/.gitignore
deleted file mode 100644
index 0c017e8f8c..0000000000
--- a/guest/core-kotlin/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-/bin/
-
-#ignore gradle
-.gradle/
-
-
-#ignore build and generated files
-build/
-node/
-out/
-
-#ignore installed node modules and package lock file
-node_modules/
-package-lock.json
diff --git a/guest/core-kotlin/README.md b/guest/core-kotlin/README.md
deleted file mode 100644
index fad62ebea6..0000000000
--- a/guest/core-kotlin/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-
-- [Kotlin vs Java](https://www.baeldung.com/kotlin/vs-java)
diff --git a/guest/core-kotlin/pom.xml b/guest/core-kotlin/pom.xml
deleted file mode 100644
index ad0368c6ab..0000000000
--- a/guest/core-kotlin/pom.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-
-
- 4.0.0
- com.stackify
- core-kotlin
- 1.0-SNAPSHOT
- core-kotlin
- jar
-
-
-
- jcenter
- http://jcenter.bintray.com
-
-
-
-
-
- org.junit.platform
- junit-platform-runner
- ${junit.platform.version}
- test
-
-
- org.jetbrains.kotlin
- kotlin-stdlib
- ${kotlin-stdlib.version}
-
-
- org.jetbrains.kotlin
- kotlin-stdlib-jdk8
- ${kotlin-stdlib.version}
-
-
- org.jetbrains.kotlin
- kotlin-test-junit
- ${kotlin-test-junit.version}
- test
-
-
- org.jetbrains.kotlin
- kotlin-reflect
- ${kotlin-reflect.version}
-
-
- org.jetbrains.spek
- spek-api
- ${spek.api.version}
- test
-
-
- org.jetbrains.spek
- spek-subject-extension
- ${spek.subject.version}
- test
-
-
- org.jetbrains.spek
- spek-junit-platform-engine
- ${spek.junit.version}
- test
-
-
- com.nhaarman
- mockito-kotlin
- ${mockito-kotlin.version}
- test
-
-
- org.assertj
- assertj-core
- ${assertj.version}
- test
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
-
- org.apache.maven.plugins
- maven-failsafe-plugin
- ${maven-failsafe-plugin.version}
- test
-
-
- org.jetbrains.kotlin
- kotlin-maven-plugin
- ${kotlin-maven-plugin.version}
- provided
-
-
-
-
-
-
- org.jetbrains.kotlin
- kotlin-maven-plugin
- ${kotlin-maven-plugin.version}
-
-
- compile
-
- compile
-
-
-
- ${project.basedir}/src/main/kotlin
-
-
-
-
- test-compile
-
- test-compile
-
-
-
- ${project.basedir}/src/test/kotlin
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
-
-
- default-compile
- none
-
-
-
- default-testCompile
- none
-
-
- java-compile
- compile
-
- compile
-
-
-
-
-
- maven-failsafe-plugin
- ${maven-failsafe-plugin.version}
-
-
- org.junit.platform
- junit-platform-surefire-provider
- ${junit.platform.version}
-
-
-
-
- junit5
-
- integration-test
- verify
-
-
-
- **/*Test5.java
-
-
-
-
-
-
-
-
-
- 2.22.0
- UTF-8
- 1.2.60
- 1.2.51
- 1.2.51
- 1.2.51
- 0.22.5
- 1.5.0
- 3.6.1
- 1.0.0
- 5.2.0
- 3.10.0
- 3.7.0
- 1.1.5
- 1.1.5
- 1.1.5
-
-
-
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/CompanionObjectTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/CompanionObjectTest.kt
deleted file mode 100644
index 69573fb75b..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/CompanionObjectTest.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-
-class CompanionObjectTest {
-
- @Test
- fun givenAClassWithCompanionObject_whenCallingMethodTheSameAsStaticOne_thenWeGetAResult() {
- assertEquals("A", A.returnClassName())
- }
-
-}
-
-class A {
- companion object {
- fun returnClassName(): String {
- return "A"
- }
- }
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ConstructorTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ConstructorTest.kt
deleted file mode 100644
index fdb5d05db5..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ConstructorTest.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-
-class ConstructorTests {
-
- @Test
- fun givenAClassWithPrimaryConstructor_whenCreatingAnInstance_thenWeGetObject() {
- var example = Example(1, "Example")
-
- assertEquals(1, example.id)
- assertEquals("Example", example.name)
- }
-
-}
-
-class Example constructor(val id: Int, var name: String)
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DataClassTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DataClassTest.kt
deleted file mode 100644
index ad79538d3c..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DataClassTest.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-
-class DataClassTest {
-
- @Test
- fun givenASampleDataClass_whenCallingToStringMethod_thenItReturnsAllProperties() {
- val student = Student(1, "John", "Smith")
-
- assertEquals(1, student.id)
- assertEquals("John", student.name)
- assertEquals("Smith", student.lastName)
- assertEquals("Student(id=1, name=John, lastName=Smith)", student.toString())
- }
-
- @Test
- fun givenASampleDataClass_whenCreatingACopyWithGeneratedFunction_thenItReturnsACopyWithRequestedChanges() {
- val student = Student(1, "John", "Smith")
- val student2 = student.copy(id = 2, name = "Anne")
-
- assertEquals(2, student2.id)
- assertEquals("Anne", student2.name)
- assertEquals("Smith", student2.lastName)
- assertEquals("Student(id=2, name=Anne, lastName=Smith)", student2.toString())
- assertFalse(student.equals(student2))
- }
-
-}
-
-data class Student(val id: Int, val name: String, val lastName: String)
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DelegationTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DelegationTest.kt
deleted file mode 100644
index 2da824c2db..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/DelegationTest.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-
-class DelegationTest {
-
- @Test
- fun givenAClassWithDelegation_whenCallDelegatedMethod_thenWeGetAResultDefinedInPassedObject() {
- val car = Car(V6Engine())
-
- assertEquals("Vroom", car.makeSound())
- }
-
-}
-
-interface Engine {
- fun makeSound(): String
-}
-
-class V6Engine: Engine {
- override fun makeSound(): String {
- return "Vroom"
- }
-}
-
-class Car(e: Engine) : Engine by e
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExceptionsTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExceptionsTest.kt
deleted file mode 100644
index 073c4dd890..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExceptionsTest.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import java.io.IOException
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class ExceptionsTest {
-
- @Test
- fun givenATryExpression_whenReturning5InLastExpressionOfTryBlock_thenWeGet5() {
- val value: Int = try { 5 } catch (e: IOException) { 6 }
-
- assertEquals(5, value)
- }
-
- @Test
- fun givenATryExpression_whenReturning6InLastExpressionOfCatchBlock_thenWeGet6() {
- val value: Int = try { funThrowingException() } catch (e: IOException) { 6 }
-
- assertEquals(6, value)
- }
-
- @org.junit.Test(expected = IllegalArgumentException::class)
- fun givenANullString_whenUsingElvisOperator_thenExceptionIsThrown() {
- val sampleString: String? = null
-
- sampleString?.length ?: throw IllegalArgumentException("String must not be null")
- }
-
- private fun funThrowingException(): Nothing {
- throw IOException()
- }
-
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExtensionFunctionsTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExtensionFunctionsTest.kt
deleted file mode 100644
index 3db73b6d2d..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/ExtensionFunctionsTest.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-
-class ExtensionFunctionsTest {
-
- @Test
- fun givenAStringWithAnExtensionFunction_whenCallingThatFunction_thenItConcatenatesStrings() {
- val sampleString = "ABC"
- val concatenatedString = sampleString.appendString("DEF")
-
- assertEquals("ABCDEF", concatenatedString)
- }
-
- @Test
- fun givenAStringWithAnExtensionProperty_whenReadingProperty_thenItReturnsLengthOfString() {
- val sampleString = "ABC"
-
- assertEquals(3, sampleString.size)
- }
-
- fun String.appendString(str : String): String {
- return plus(str)
- }
-
- val String.size: Int
- get() = length
-
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/FunctionsTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/FunctionsTest.kt
deleted file mode 100644
index 6176478dfe..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/FunctionsTest.kt
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-
-class FunctionsTest {
-
- @Test
- fun givenALambdaExpressionConcatenatingString_whenUsingTheFunctionWithAAndBString_thenWeGetAB() {
- val concat: (String, String) -> String = { a, b -> a + b }
-
- assertEquals("AB", concat("A","B"))
- }
-
- @Test
- fun givenAnAnonymousFunctionConcatenatingString_whenUsingTheFunctionWithAAndBString_thenWeGetAB() {
- val concat: (String, String) -> String = fun(a: String, b: String): String { return a + b }
-
- assertEquals("AB", concat("A","B"))
- }
-
- @Test
- fun givenAnPlusMethodOfString_whenUsingTheFunctionWithAAndBString_thenWeGetAB() {
- val concat = String::plus
-
- assertEquals("AB", concat("A","B"))
- }
-
- @Test
- fun givenAStringConstractorAssignedToFunction_whenUsingFunctionReference_thenWeGetNewString() {
- val concat = ::String
-
- assertEquals("A", concat().plus("A"))
- }
-
- @Test
- fun givenAClassImplementingAFunctionType_whenUsingTheFunctionWithAAndBString_thenWeGetAB() {
- val concat = StringConcatenation()
-
- assertEquals("AB", concat("A", "B"))
- }
-
- @Test
- fun givenALambdaExpressionWithReceiver_whenUsingTheFunctionWithReceiver_thenWeGetABC() {
- val concat: String.(String, String) -> String = { a, b -> plus(a).plus(b) }
-
- assertEquals("ABC", "A".concat("B", "C"))
- }
-
- @Test
- fun givenALambdaExpressionWithinLambdaExpression_whenUsingTheFunction_thenWeGetAB() {
- val concat: (String) -> ((String) -> String) = { a -> {b -> a + b} }
-
- assertEquals("AB", (concat("A")("B")))
- }
-
- @Test
- fun given3NestedLambdaExpression_whenUsingTheFunction_thenWeGetABC() {
- val concat: (String) -> (String) -> (String) -> String = { a -> {b -> { c -> a + b + c} } }
-
- assertEquals("ABC", concat("A")("B")("C"))
- }
-
-}
-
-class StringConcatenation: (String, String) -> String {
- override fun invoke(p1: String, p2: String): String {
- return p1 + p2
- }
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/IsOperatorTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/IsOperatorTest.kt
deleted file mode 100644
index 1817602cdf..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/IsOperatorTest.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.math.absoluteValue
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class IsOperatorTest {
-
- @Test
- fun givenSampleValue_whenUsingIsOperatorInIfStatement_thenItCastsAutomaticallyToString() {
- val value: Any = "string"
-
- if(value is String) {
- assertEquals(6, value.length)
- }
- }
-
- @Test
- fun givenSampleValue_whenUsingIsOperatorWithAndOperator_thenItCastsAutomaticallyToString() {
- val value: Any = "string"
-
- assertTrue(value is String && value.length == 6)
- }
-
- @Test
- fun givenSampleValue_whenUsingWithWhenOperator_thenItCastsAutomaticallyToString() {
- val value: Any = "string"
-
- when(value) {
- is String -> assertEquals(6, value.length)
- is Int -> assertEquals(6, value.absoluteValue)
- }
- }
-
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/NullSafetyTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/NullSafetyTest.kt
deleted file mode 100644
index 8cb3cbc761..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/NullSafetyTest.kt
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import kotlin.test.Test
-import java.lang.NullPointerException
-import kotlin.test.assertEquals
-import kotlin.test.assertNotNull
-import kotlin.test.assertNull
-
-class NullSafetyTest {
-
- @Test
- fun givenStringAndNull_whenUsingSafeCallOperatorWithLengthMethod_thenReturnsLengthForStringAndNullForNull() {
- val stringValue: String? = "string"
- val nullValue: String? = null
-
- assertNotNull(stringValue?.length)
- assertNull(nullValue?.length)
- }
-
- @Test(expected = NullPointerException::class)
- fun givenNullReference_whenUsingTheNotNullAssertionOperator_thenItThrowsNullPointerException() {
- val stringValue: String? = "string"
- val nullValue: String? = null
-
- assertNotNull(stringValue!!.length)
- nullValue!!.length
- }
-
- @Test
- fun givenStringAndNull_whenUsingElvisOperator_thenItTestsAgainstNullAndReturnsTheProperValue() {
- val stringValue: String? = "string"
- val nullValue: String? = null
-
- val shouldBeLength: Int = stringValue?.length ?: -1
- val souldBeMinusOne: Int = nullValue?.length ?: -1
-
- assertEquals(6, shouldBeLength)
- assertEquals(-1, souldBeMinusOne)
- }
-
- @Test
- fun givenString_whenCastingToInt_thenItReturnsNull() {
- val stringValue: String? = "string"
-
- val intValue: Int? = stringValue as? Int
-
- assertNull(intValue)
- }
-
- @Test
- fun givenCollectionWithNulls_whenFilterNonNull_thenItReturnsCollectionWithoutNulls() {
- val list: List = listOf("a", "b", null)
- val nonNullList = list.filterNotNull()
-
- assertEquals(2, nonNullList.size)
- assertEquals(nonNullList, listOf("a", "b"))
- }
-
- @Test
- fun givenCollectionWithNulls_whenLetWithSafeCallOperator_thenItOmitsNulls() {
- val list: List = listOf("a", "b", null)
- for(elem in list) {
- elem?.let { assertNotNull(it) }
- }
- }
-
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/OperatorsOverloadingTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/OperatorsOverloadingTest.kt
deleted file mode 100644
index a28008da20..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/OperatorsOverloadingTest.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertTrue
-
-class OperatorsOverloadingTest {
-
- @Test
- fun givenThePlaneClassWithOverloadedIncrementationOperator_whenCallingTheOperator_thenItIncreasesSpeed(){
- var plane = Plane(0.0)
-
- plane++
- assertEquals(50.0, plane.currentSpeed)
- }
-
- @Test
- fun givenThePlaneClassWithOverloadedMinusOperator_whenCallingTheOperator_thenItDecreaseSpeed(){
- var plane = Plane(1000.0)
-
- plane - 500.0
- assertEquals(500.0, plane.currentSpeed)
- }
-
- @Test
- fun givenThePlaneClassWithOverloadedInvokeOperator_whenCallingTheOperator_thenItSetSpeed(){
- var plane = Plane(0.0)
-
- plane(150.0)
- assertEquals(150.0, plane.currentSpeed)
- }
-
- @Test
- fun given2PlaneObjectWithOverloadedComparisonOperator_whenCallingTheOperator_thenItComparesSpeedValues(){
- var plane = Plane(0.0)
- var plane2 = Plane(150.0)
-
- assertTrue(plane < (plane2))
- }
-
-}
-
-class Plane(var currentSpeed: Double) {
-
- operator fun inc(): Plane {
- currentSpeed += 50.0
- return this
- }
-
- operator fun minus(number: Double) {
- currentSpeed = if(currentSpeed < number) 0.0 else currentSpeed - number
- }
-
- operator fun invoke(speed: Double) {
- currentSpeed = speed
- }
-
- operator fun compareTo(plane: Plane): Int {
- return currentSpeed.compareTo(plane.currentSpeed)
- }
-}
\ No newline at end of file
diff --git a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/PropertiesTest.kt b/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/PropertiesTest.kt
deleted file mode 100644
index 95abcd68a2..0000000000
--- a/guest/core-kotlin/src/test/kotlin/com/baeldung/kotlinvsjava/PropertiesTest.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.kotlinvsjava
-
-import org.junit.Test
-import java.math.BigDecimal
-import kotlin.test.assertEquals
-
-class PropertiesTest {
-
- @Test
- fun givenASampleClassWithValAndVarProperties_whenSettingPrice_thenWeGetZeroOrOne() {
- val product = Product()
- product.price = BigDecimal(10)
-
- val product2 = Product()
- product2.price = null
-
- assertEquals("empty", product.id)
- assertEquals("empty", product2.id)
- assertEquals(BigDecimal(10), product.price)
- assertEquals(BigDecimal(1), product2.price)
- }
-
-}
-
-class Product {
-
- val id: String? = "empty"
-
- var price: BigDecimal? = BigDecimal.ZERO
- set(value) = if(value == null) { field = BigDecimal.ONE} else { field = value }
-
-}
\ No newline at end of file
diff --git a/guest/deep-jsf/README.md b/guest/deep-jsf/README.md
deleted file mode 100644
index b5f532535b..0000000000
--- a/guest/deep-jsf/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-## Building
-
-To build the module, use Maven's `package` goal:
-
-```
-mvn clean package
-```
-
-The `war` file will be available at `target/deep-jsf.war`
-
-## Running
-
-The `war` application is deployed to a Java EE 7 compliant application server, for example, to GlassFish 4 or later.
-
-The example then will be accessible at http://localhost:8080/deep-jsf/index.xhtml
\ No newline at end of file
diff --git a/guest/deep-jsf/pom.xml b/guest/deep-jsf/pom.xml
deleted file mode 100644
index 91cf567e73..0000000000
--- a/guest/deep-jsf/pom.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
- 4.0.0
- com.stackify
- deep-jsf
- 0.0.1-SNAPSHOT
- deep-jsf
- war
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
-
-
-
- javax
- javaee-api
- ${javaee-api.version}
- provided
-
-
-
-
- deep-jsf
-
-
-
- false
- 7.0
-
-
-
\ No newline at end of file
diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java
deleted file mode 100644
index 7f5cf99781..0000000000
--- a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/GreetControllerBean.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.stackify.deepjsf;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.RequestScoped;
-
-@ManagedBean
-@RequestScoped
-public class GreetControllerBean {
-
- public String greet() {
- return "greet";
- }
-
-}
diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java
deleted file mode 100644
index d4f6a6e815..0000000000
--- a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/PhaseListenerBean.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.stackify.deepjsf;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.RequestScoped;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIViewRoot;
-import javax.faces.component.visit.VisitContext;
-import javax.faces.component.visit.VisitResult;
-import javax.faces.event.PhaseEvent;
-import javax.faces.event.PhaseId;
-import javax.servlet.http.HttpServletRequest;
-
-@ManagedBean
-@RequestScoped
-public class PhaseListenerBean {
-
- public void beforeListener(PhaseEvent event) {
- if (!event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
- return;
- }
- UIViewRoot root = event.getFacesContext().getViewRoot();
-
- boolean showNewFeature = showNewFeatureForIp(event);
-
- processComponentTree(root, event, showNewFeature);
- }
-
- private boolean showNewFeatureForIp(PhaseEvent event) {
- HttpServletRequest request = (HttpServletRequest) event.getFacesContext()
- .getExternalContext().getRequest();
- String ip = request.getRemoteAddr();
- return !ip.startsWith("127.0");
- }
-
- private void processComponentTree(UIComponent component, PhaseEvent event, boolean show) {
- component.visitTree(VisitContext.createVisitContext(event.getFacesContext()),
- (context, target) -> {
- if (target.getId() != null
- && target.getId().startsWith("new-feature-")
- && !show) {
- target.setRendered(false);
- }
- return VisitResult.ACCEPT;
- });
- }
-
-}
diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java
deleted file mode 100644
index f6c94e87b8..0000000000
--- a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserBean.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.stackify.deepjsf;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.SessionScoped;
-import javax.faces.event.ValueChangeEvent;
-
-@ManagedBean
-@SessionScoped
-public class UserBean {
-
- private String name = "";
-
- private String lastName = "";
-
- private String proposedLogin = "";
-
- public void nameChanged(ValueChangeEvent event) {
- this.proposedLogin = event.getNewValue() + "-" + lastName;
- }
-
- public void lastNameChanged(ValueChangeEvent event) {
- this.proposedLogin = name + "-" + event.getNewValue();
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getProposedLogin() {
- return proposedLogin;
- }
-
- public void setProposedLogin(String proposedLogin) {
- this.proposedLogin = proposedLogin;
- }
-}
diff --git a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java b/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java
deleted file mode 100644
index c2a46a019a..0000000000
--- a/guest/deep-jsf/src/main/java/com/stackify/deepjsf/UserControllerBean.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.stackify.deepjsf;
-
-import javax.faces.bean.ManagedBean;
-import javax.faces.bean.RequestScoped;
-
-@ManagedBean
-@RequestScoped
-public class UserControllerBean {
-
- public String register() {
- return "register-success";
- }
-
-}
diff --git a/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml b/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml
deleted file mode 100644
index 264e60065c..0000000000
--- a/guest/deep-jsf/src/main/webapp/WEB-INF/faces-config.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- /register.xhtml
-
- register-success
- /hello.xhtml
-
-
-
-
\ No newline at end of file
diff --git a/guest/deep-jsf/src/main/webapp/greet.xhtml b/guest/deep-jsf/src/main/webapp/greet.xhtml
deleted file mode 100644
index 50c79c64e1..0000000000
--- a/guest/deep-jsf/src/main/webapp/greet.xhtml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/guest/deep-jsf/src/main/webapp/hello.xhtml b/guest/deep-jsf/src/main/webapp/hello.xhtml
deleted file mode 100644
index f9c3745dca..0000000000
--- a/guest/deep-jsf/src/main/webapp/hello.xhtml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/guest/deep-jsf/src/main/webapp/index.xhtml b/guest/deep-jsf/src/main/webapp/index.xhtml
deleted file mode 100644
index de99b89815..0000000000
--- a/guest/deep-jsf/src/main/webapp/index.xhtml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/guest/deep-jsf/src/main/webapp/register.xhtml b/guest/deep-jsf/src/main/webapp/register.xhtml
deleted file mode 100644
index ba1b8e0233..0000000000
--- a/guest/deep-jsf/src/main/webapp/register.xhtml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/guest/junit5-example/.gitignore b/guest/junit5-example/.gitignore
deleted file mode 100644
index 60be5b80aa..0000000000
--- a/guest/junit5-example/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-.settings/
-.classpath
-.project
diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml
deleted file mode 100644
index 05e320f96d..0000000000
--- a/guest/junit5-example/pom.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
- 4.0.0
- junit5-example
- junit5-example
- 0.0.1-SNAPSHOT
- junit5-example
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
-
-
-
- org.junit.jupiter
- junit-jupiter-params
- ${junit.jupiter.version}
-
-
- org.junit.vintage
- junit-vintage-engine
- ${junit-vintage.version}
-
-
- com.h2database
- h2
- ${h2.version}
-
-
- org.apache.logging.log4j
- log4j-core
- ${log4j-core.version}
-
-
-
-
-
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- org.junit.platform
- junit-platform-surefire-provider
- ${junit-platform-surefire-provider.version}
-
-
-
-
- math
-
-
-
-
-
-
-
- 5.0.0-M4
- 4.12.0-M4
- 2.8.2
- 1.0.0-M4
-
-
\ No newline at end of file
diff --git a/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java b/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java
deleted file mode 100644
index 091d077ef6..0000000000
--- a/guest/junit5-example/src/main/java/com/stackify/daos/UserDAO.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package com.stackify.daos;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import com.stackify.models.User;
-import com.stackify.utils.ConnectionUtil;
-
-public class UserDAO {
-
- private Logger logger = LogManager.getLogger(UserDAO.class);
-
- public void createTable() {
- try (Connection con = ConnectionUtil.getConnection()) {
- String createQuery = "CREATE TABLE users(email varchar(50) primary key, name varchar(50))";
- PreparedStatement pstmt = con.prepareStatement(createQuery);
-
- pstmt.execute();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
-
- }
-
- public void add(User user) {
- try (Connection con = ConnectionUtil.getConnection()) {
-
- String insertQuery = "INSERT INTO users(email,name) VALUES(?,?)";
- PreparedStatement pstmt = con.prepareStatement(insertQuery);
- pstmt.setString(1, user.getEmail());
- pstmt.setString(2, user.getName());
-
- pstmt.executeUpdate();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- }
-
- public void update(User user) {
- try (Connection con = ConnectionUtil.getConnection()) {
-
- String updateQuery = "UPDATE users SET name=? WHERE email=?";
- PreparedStatement pstmt = con.prepareStatement(updateQuery);
- pstmt.setString(1, user.getName());
- pstmt.setString(2, user.getEmail());
-
- pstmt.executeUpdate();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- }
-
- public void delete(User user) {
- try (Connection con = ConnectionUtil.getConnection()) {
-
- String deleteQuery = "DELETE FROM users WHERE email=?";
- PreparedStatement pstmt = con.prepareStatement(deleteQuery);
- pstmt.setString(1, user.getEmail());
-
- pstmt.executeUpdate();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- }
-
- public void delete(String email) {
- try (Connection con = ConnectionUtil.getConnection()) {
-
- String deleteQuery = "DELETE FROM users WHERE email=?";
- PreparedStatement pstmt = con.prepareStatement(deleteQuery);
- pstmt.setString(1, email);
-
- pstmt.executeUpdate();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- }
-
- public User findOne(String email) {
- User user = null;
-
- try (Connection con = ConnectionUtil.getConnection()) {
- String query = "SELECT * FROM users WHERE email=?";
- PreparedStatement pstmt = con.prepareStatement(query);
- pstmt.setString(1, email);
-
- ResultSet rs = pstmt.executeQuery();
- while (rs.next()) {
- user = new User();
- user.setEmail(rs.getString("email"));
- user.setName(rs.getString("name"));
- }
-
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
-
- return user;
- }
-
- public List findAll() {
- List users = new ArrayList<>();
-
- try (Connection con = ConnectionUtil.getConnection()) {
- String query = "SELECT * FROM users";
- PreparedStatement pstmt = con.prepareStatement(query);
-
- ResultSet rs = pstmt.executeQuery();
- while (rs.next()) {
- User user = new User();
- user.setEmail(rs.getString("email"));
- user.setName(rs.getString("name"));
- users.add(user);
- }
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
-
- return users;
- }
-
- public void deleteAll() {
- try (Connection con = ConnectionUtil.getConnection()) {
-
- String deleteQuery = "DELETE FROM users";
- PreparedStatement pstmt = con.prepareStatement(deleteQuery);
-
- pstmt.executeUpdate();
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- }
-
-}
diff --git a/guest/junit5-example/src/main/java/com/stackify/models/User.java b/guest/junit5-example/src/main/java/com/stackify/models/User.java
deleted file mode 100644
index d6951102a7..0000000000
--- a/guest/junit5-example/src/main/java/com/stackify/models/User.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.stackify.models;
-
-public class User {
- private String email;
- private String name;
-
- public User() {
- }
-
- public User(String email, String name) {
- super();
- this.email = email;
- this.name = name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((email == null) ? 0 : email.hashCode());
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- User other = (User) obj;
- if (email == null) {
- if (other.email != null)
- return false;
- } else if (!email.equals(other.email))
- return false;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
-
-}
diff --git a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java
deleted file mode 100644
index 2c1fa80f2e..0000000000
--- a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironment.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.stackify.test.conditions;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.junit.jupiter.api.extension.ExtendWith;
-
-@Target({ ElementType.METHOD })
-@Retention(RetentionPolicy.RUNTIME)
-@ExtendWith(DisabledOnEnvironmentCondition.class)
-public @interface DisabledOnEnvironment {
- String[] value();
-}
\ No newline at end of file
diff --git a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java b/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java
deleted file mode 100644
index adb9d9c09e..0000000000
--- a/guest/junit5-example/src/main/java/com/stackify/test/conditions/DisabledOnEnvironmentCondition.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.stackify.test.conditions;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Optional;
-import java.util.Properties;
-
-import org.junit.jupiter.api.extension.ConditionEvaluationResult;
-import org.junit.jupiter.api.extension.TestExecutionCondition;
-import org.junit.jupiter.api.extension.TestExtensionContext;
-import org.junit.platform.commons.support.AnnotationSupport;
-
-import com.stackify.utils.ConnectionUtil;
-
-public class DisabledOnEnvironmentCondition implements TestExecutionCondition {
-
- @Override
- public ConditionEvaluationResult evaluate(TestExtensionContext context) {
- Properties props = new Properties();
- String env = "";
- try {
- props.load(ConnectionUtil.class.getResourceAsStream("/application.properties"));
- env = props.getProperty("env");
- } catch (IOException e) {
- e.printStackTrace();
- }
- Optional disabled = AnnotationSupport.findAnnotation(context.getElement().get(), DisabledOnEnvironment.class);
- if (disabled.isPresent()) {
- String[] envs = disabled.get().value();
- if (Arrays.asList(envs).contains(env)) {
- return ConditionEvaluationResult.disabled("Disabled on environment " + env);
- }
- }
-
- return ConditionEvaluationResult.enabled("Enabled on environment "+env);
- }
-
-}
diff --git a/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java b/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java
deleted file mode 100644
index bcfe5058a7..0000000000
--- a/guest/junit5-example/src/main/java/com/stackify/utils/ConnectionUtil.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.stackify.utils;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.SQLException;
-import java.util.Properties;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-public class ConnectionUtil {
-
- private static Logger logger = LogManager.getLogger(ConnectionUtil.class);
-
- public static Connection getConnection() {
- try {
- Properties props = new Properties();
- props.load(ConnectionUtil.class.getResourceAsStream("jdbc.properties"));
- Class.forName(props.getProperty("jdbc.driver"));
- Connection con = DriverManager.getConnection(props.getProperty("jdbc.url"), props.getProperty("jdbc.user"), props.getProperty("jdbc.password"));
- return con;
- }
-
- catch (FileNotFoundException exc) {
- logger.error(exc.getMessage());
- } catch (IOException exc) {
- logger.error(exc.getMessage());
- } catch (ClassNotFoundException exc) {
- logger.error(exc.getMessage());
- } catch (SQLException exc) {
- logger.error(exc.getMessage());
- }
- return null;
- }
-
-}
diff --git a/guest/junit5-example/src/main/resources/application.properties b/guest/junit5-example/src/main/resources/application.properties
deleted file mode 100644
index 601f964ff3..0000000000
--- a/guest/junit5-example/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-env=dev
\ No newline at end of file
diff --git a/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties b/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties
deleted file mode 100644
index 2d9a39b157..0000000000
--- a/guest/junit5-example/src/main/resources/com/stackify/utils/jdbc.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-jdbc.driver=org.h2.Driver
-jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
-jdbc.user=
-jdbc.password=
\ No newline at end of file
diff --git a/guest/junit5-example/src/main/resources/log4j2.xml b/guest/junit5-example/src/main/resources/log4j2.xml
deleted file mode 100644
index 602b5ab490..0000000000
--- a/guest/junit5-example/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java b/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java
deleted file mode 100644
index d8f13b5715..0000000000
--- a/guest/junit5-example/src/test/java/com/stackify/test/DatabaseConnectionTest.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.stackify.test;
-
-import java.sql.Connection;
-
-import org.junit.jupiter.api.Test;
-
-import com.stackify.utils.ConnectionUtil;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-public interface DatabaseConnectionTest {
-
- @Test
- default void testDatabaseConnection() {
- Connection con = ConnectionUtil.getConnection();
- assertNotNull(con);
- }
-
-}
diff --git a/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java b/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java
deleted file mode 100644
index 39b3b5aac5..0000000000
--- a/guest/junit5-example/src/test/java/com/stackify/test/DynamicTests.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.stackify.test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.function.Function;
-import java.util.stream.Stream;
-
-import static org.junit.jupiter.api.Assertions.*;
-import org.junit.jupiter.api.DynamicTest;
-import org.junit.jupiter.api.TestFactory;
-import org.junit.jupiter.api.function.ThrowingConsumer;
-
-import com.stackify.daos.UserDAO;
-import com.stackify.models.User;
-
-public class DynamicTests {
-
- @TestFactory
- public Collection dynamicTestCollection() {
- return Arrays.asList(DynamicTest.dynamicTest("Dynamic Test", () -> assertTrue(1 == 1)));
- }
-
- @TestFactory
- public Stream dynamicUserTestCollection() {
- List inputList = Arrays.asList(new User("john@yahoo.com", "John"), new User("ana@yahoo.com", "Ana"));
-
- Function displayNameGenerator = (input) -> "Saving user: " + input;
-
- UserDAO userDAO = new UserDAO();
- ThrowingConsumer testExecutor = (input) -> {
- userDAO.add(input);
- assertNotNull(userDAO.findOne(input.getEmail()));
- };
-
- return DynamicTest.stream(inputList.iterator(), displayNameGenerator, testExecutor);
- }
-}
diff --git a/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java b/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java
deleted file mode 100644
index a23a5bf20b..0000000000
--- a/guest/junit5-example/src/test/java/com/stackify/test/IncrementTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.stackify.test;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.RepeatedTest;
-import org.junit.jupiter.api.RepetitionInfo;
-
-public class IncrementTest {
-
- private static Logger logger = LogManager.getLogger(IncrementTest.class);
-
- @BeforeEach
- public void increment() {
- logger.info("Before Each Test");
- }
-
- @RepeatedTest(value = 3, name = RepeatedTest.SHORT_DISPLAY_NAME)
- public void test(RepetitionInfo info) {
- assertTrue(1 == 1);
- logger.info("Repetition #" + info.getCurrentRepetition());
- }
-}
diff --git a/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java b/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java
deleted file mode 100644
index db3c38ceac..0000000000
--- a/guest/junit5-example/src/test/java/com/stackify/test/TaggedTest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.stackify.test;
-
-import static org.junit.jupiter.api.Assertions.*;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-@Tag("math")
-public class TaggedTest {
-
- @Test
- @Tag("arithmetic")
- public void testEquals() {
- assertTrue(1 == 1);
- }
-
-}
diff --git a/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java b/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java
deleted file mode 100644
index 88958a8232..0000000000
--- a/guest/junit5-example/src/test/java/com/stackify/test/UsersTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.stackify.test;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.jupiter.api.AfterAll;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.TestInfo;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.jupiter.api.Assumptions.*;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import com.stackify.daos.UserDAO;
-import com.stackify.models.User;
-
-import com.stackify.test.conditions.DisabledOnEnvironment;
-
-public class UsersTest implements DatabaseConnectionTest {
-
- private static UserDAO userDAO;
-
- private static Logger logger = LogManager.getLogger(UsersTest.class);
-
- @BeforeAll
- public static void addData() {
- userDAO = new UserDAO();
- userDAO.createTable();
-
- User user1 = new User("john@gmail.com", "John");
- User user2 = new User("ana@gmail.com", "Ana");
- userDAO.add(user1);
- userDAO.add(user2);
- }
-
- @Test
- @DisplayName("Test Get Users")
- public void testGetUsersNumber() {
- assertEquals(2, userDAO.findAll().size());
-
- }
-
- @Test
- @DisplayName("Test Get Users")
- public void testGetUsersNumberWithInfo(TestInfo testInfo) {
- assertEquals(2, userDAO.findAll().size());
- assertEquals("Test Get Users", testInfo.getDisplayName());
- assertEquals(UsersTest.class, testInfo.getTestClass().get());
- logger.info("Running test method:" + testInfo.getTestMethod().get().getName());
- }
-
- @Test
- public void testGetUser() {
- User user = userDAO.findOne("john@gmail.com");
- assertEquals("John", user.getName(), "User name:" + user.getName() + " incorrect");
- }
-
- @Test
- public void testClassicAssertions() {
- User user1 = userDAO.findOne("john@gmail.com");
- User user2 = userDAO.findOne("john@yahoo.com");
-
- assertNotNull(user1);
- assertNull(user2);
-
- user2 = new User("john@yahoo.com", "John");
- assertEquals(user1.getName(), user2.getName(), "Names are not equal");
- assertFalse(user1.getEmail().equals(user2.getEmail()), "Emails are equal");
- assertNotSame(user1, user2);
- }
-
- @Test
- @Disabled
- public void testGroupedAssertions() {
- User user = userDAO.findOne("john@gmail.com");
- assertAll("user", () -> assertEquals("Johnson", user.getName()), () -> assertEquals("johnson@gmail.com", user.getEmail()));
- }
-
- @Test
- public void testIterableEquals() {
- User user1 = new User("john@gmail.com", "John");
- User user2 = new User("ana@gmail.com", "Ana");
-
- List users = new ArrayList<>();
- users.add(user1);
- users.add(user2);
-
- assertIterableEquals(users, userDAO.findAll());
- }
-
- @Test
- public void testLinesMatch() {
- List expectedLines = Collections.singletonList("(.*)@(.*)");
- List emails = Arrays.asList("john@gmail.com");
- assertLinesMatch(expectedLines, emails);
- }
-
- @Test
- void testThrows() {
- User user = null;
- Exception exception = assertThrows(NullPointerException.class, () -> user.getName());
- logger.info(exception.getMessage());
- }
-
- @Test
- @DisabledOnEnvironment({ "dev", "prod")
- void testFail() {
- fail("this test fails");
- }
-
- @Test
- void testAssumptions() {
- List users = userDAO.findAll();
- assumeFalse(users == null);
- assumeTrue(users.size() > 0);
-
- User user1 = new User("john@gmail.com", "John");
-
- assumingThat(users.contains(user1), () -> assertTrue(users.size() > 1));
- }
-
- @ParameterizedTest
- @ValueSource(strings = { "john@gmail.com", "ana@gmail.com" })
- public void testParameterized(String email) {
- assertNotNull(userDAO.findOne(email));
- }
-
- @AfterAll
- public static void removeData() {
- userDAO.deleteAll();
- }
-
- @Nested
- class DeleteUsersTest {
- @Test
- public void addUser() {
- User user = new User("bob@gmail.com", "Bob");
- userDAO.add(user);
- assertNotNull(userDAO.findOne("bob@gmail.com"));
-
- userDAO.delete("bob@gmail.com");
- assertNull(userDAO.findOne("bob@gmail.com"));
- }
- }
-
-}
diff --git a/guest/log4j2-example/.gitignore b/guest/log4j2-example/.gitignore
deleted file mode 100644
index 60be5b80aa..0000000000
--- a/guest/log4j2-example/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-.settings/
-.classpath
-.project
diff --git a/guest/log4j2-example/java.log b/guest/log4j2-example/java.log
deleted file mode 100644
index 21e964d9ce..0000000000
--- a/guest/log4j2-example/java.log
+++ /dev/null
@@ -1,3 +0,0 @@
-14:00:35.258 INFO Programmatic Logger Message
-14:03:51.178 INFO Programmatic Logger Message
-14:04:11.753 INFO Programmatic Logger Message
diff --git a/guest/log4j2-example/logs/app.log b/guest/log4j2-example/logs/app.log
deleted file mode 100644
index 022f6fcea9..0000000000
--- a/guest/log4j2-example/logs/app.log
+++ /dev/null
@@ -1,25 +0,0 @@
-[
-{
- "timeMillis" : 1496315051753,
- "thread" : "main",
- "level" : "INFO",
- "loggerName" : "RollingFileLogger",
- "message" : "Json Message 1",
- "endOfBatch" : false,
- "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
- "threadId" : 1,
- "threadPriority" : 5
-}
-, {
- "timeMillis" : 1496315051862,
- "thread" : "main",
- "level" : "INFO",
- "loggerName" : "RollingFileLogger",
- "message" : "Json Messag 2",
- "endOfBatch" : false,
- "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
- "threadId" : 1,
- "threadPriority" : 5
-}
-
-]
diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml
deleted file mode 100644
index a3284dbfe3..0000000000
--- a/guest/log4j2-example/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
- 4.0.0
- log4j2-example
- log4j2-example
- 0.0.1-SNAPSHOT
- log4j2-example
-
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ../../
-
-
-
-
-
- org.apache.logging.log4j
- log4j-core
- ${log4j-core.version}
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
-
-
-
-
- src/main/resources/
-
- **/*.java
-
-
-
-
-
-
- 2.8.2
-
-
-
\ No newline at end of file
diff --git a/guest/log4j2-example/src/main/java/com/stackify/models/User.java b/guest/log4j2-example/src/main/java/com/stackify/models/User.java
deleted file mode 100644
index 1a53651292..0000000000
--- a/guest/log4j2-example/src/main/java/com/stackify/models/User.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.stackify.models;
-
-import java.time.LocalDate;
-
-public class User {
- private String name;
- private String email;
- private LocalDate dateOfBirth;
-
- public User() {
- }
-
- public User(String name, String email) {
- super();
- this.name = name;
- this.email = email;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public LocalDate getDateOfBirth() {
- return dateOfBirth;
- }
-
- public void setDateOfBirth(LocalDate dateOfBirth) {
- this.dateOfBirth = dateOfBirth;
- }
-
-}
diff --git a/guest/log4j2-example/src/main/java/com/stackify/services/MyService.java b/guest/log4j2-example/src/main/java/com/stackify/services/MyService.java
deleted file mode 100644
index 4b1dc0bf34..0000000000
--- a/guest/log4j2-example/src/main/java/com/stackify/services/MyService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.stackify.services;
-
-import java.time.LocalDate;
-import java.time.Period;
-
-import com.stackify.models.User;
-
-public class MyService {
-
- public int calculateUserAge(User user) {
- return Period.between(user.getDateOfBirth(), LocalDate.now()).getYears();
- }
-
-}
diff --git a/guest/log4j2-example/src/main/resources/log4j2.xml b/guest/log4j2-example/src/main/resources/log4j2.xml
deleted file mode 100644
index 06f2ba5245..0000000000
--- a/guest/log4j2-example/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/log4j2-example/src/test/java/com/stackify/services/MyServiceUnitTest.java b/guest/log4j2-example/src/test/java/com/stackify/services/MyServiceUnitTest.java
deleted file mode 100644
index bd08225be4..0000000000
--- a/guest/log4j2-example/src/test/java/com/stackify/services/MyServiceUnitTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.stackify.services;
-
-import java.time.LocalDate;
-import java.time.Month;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.core.Appender;
-import org.apache.logging.log4j.core.LoggerContext;
-import org.apache.logging.log4j.core.appender.FileAppender;
-import org.apache.logging.log4j.core.config.AppenderRef;
-import org.apache.logging.log4j.core.config.Configuration;
-import org.apache.logging.log4j.core.config.LoggerConfig;
-import org.apache.logging.log4j.core.layout.PatternLayout;
-import org.junit.Test;
-
-import com.stackify.models.User;
-import com.stackify.services.MyService;
-
-public class MyServiceUnitTest {
-
- private static final Logger logger = LogManager.getLogger(MyServiceUnitTest.class);
-
- @Test
- public void testService() {
- MyService myService = new MyService();
- User user = new User("John", "john@yahoo.com");
- user.setDateOfBirth(LocalDate.of(1980, Month.APRIL, 20));
- logger.info("Age of user {} is {}", () -> user.getName(), () -> myService.calculateUserAge(user));
- }
-
- @Test
- public void testColoredLogger() {
- logger.fatal("Fatal level message");
- logger.error("Error level message");
- logger.warn("Warn level message");
- logger.info("Info level message");
- logger.debug("Debug level message");
- }
-
- @Test
- public void testRollingFileAppender() {
- Logger rfLogger = LogManager.getLogger("RollingFileLogger");
- rfLogger.info("Json Message 1");
- rfLogger.info("Json Message 2");
- }
-
- @Test
- public void testProgrammaticConfig() {
- LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
- Configuration config = ctx.getConfiguration();
-
- PatternLayout layout = PatternLayout.newBuilder().withConfiguration(config).withPattern("%d{HH:mm:ss.SSS} %level %msg%n").build();
-
- Appender appender = FileAppender.newBuilder().setConfiguration(config).withName("programmaticFileAppender").withLayout(layout).withFileName("java.log").build();
- appender.start();
- config.addAppender(appender);
- AppenderRef ref = AppenderRef.createAppenderRef("programmaticFileAppender", null, null);
- AppenderRef[] refs = new AppenderRef[] { ref };
-
- LoggerConfig loggerConfig = LoggerConfig.createLogger(false, Level.INFO, "programmaticLogger", "true", refs, null, config, null);
-
- loggerConfig.addAppender(appender, null, null);
- config.addLogger("programmaticLogger", loggerConfig);
- ctx.updateLoggers();
-
- Logger pLogger = LogManager.getLogger("programmaticLogger");
- pLogger.info("Programmatic Logger Message");
- }
-
- @Test
- public void testCustomLevel() {
- Level myLevel = Level.forName("NEW_LEVEL", 350);
- logger.log(myLevel, "Custom Level Message");
-
- logger.log(Level.getLevel("NEW_XML_LEVEL"), "Custom XML Level Message");
-
- }
-
-}
diff --git a/guest/logback-example/src/main/java/com/stackify/logging/IgnoreLoggerFilter.java b/guest/logback-example/src/main/java/com/stackify/logging/IgnoreLoggerFilter.java
deleted file mode 100644
index c0eb414588..0000000000
--- a/guest/logback-example/src/main/java/com/stackify/logging/IgnoreLoggerFilter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.stackify.logging;
-
-import org.slf4j.Marker;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.turbo.TurboFilter;
-import ch.qos.logback.core.spi.FilterReply;
-
-public class IgnoreLoggerFilter extends TurboFilter {
-
- private String loggerName;
-
- @Override
- public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) {
- if (loggerName == null) {
- return FilterReply.NEUTRAL;
- } else if (loggerName.equals(logger.getName())) {
- return FilterReply.DENY;
- } else
- return FilterReply.NEUTRAL;
- }
-
- public void setLoggerName(String loggerName) {
- this.loggerName = loggerName;
- }
-
-}
diff --git a/guest/logback-example/src/main/java/com/stackify/models/Employee.java b/guest/logback-example/src/main/java/com/stackify/models/Employee.java
deleted file mode 100644
index 1d040b372b..0000000000
--- a/guest/logback-example/src/main/java/com/stackify/models/Employee.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.stackify.models;
-
-public class Employee {
-
- private String email;
- private String name;
-
- private double salary;
-
- public Employee() {
- }
-
- public Employee(String email, String name, double salary) {
- this.email = email;
- this.name = name;
- this.salary = salary;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public double getSalary() {
- return salary;
- }
-
- public void setSalary(double salary) {
- this.salary = salary;
- }
-
-}
diff --git a/guest/logback-example/src/main/java/com/stackify/services/EmployeeService.java b/guest/logback-example/src/main/java/com/stackify/services/EmployeeService.java
deleted file mode 100644
index 1795101f40..0000000000
--- a/guest/logback-example/src/main/java/com/stackify/services/EmployeeService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.stackify.services;
-
-import com.stackify.models.Employee;
-
-public class EmployeeService {
-
- public double calculateBonus(Employee user) {
- return 0.1 * user.getSalary();
- }
-
-}
diff --git a/guest/logback-example/src/main/resources/application.properties b/guest/logback-example/src/main/resources/application.properties
deleted file mode 100644
index 601f964ff3..0000000000
--- a/guest/logback-example/src/main/resources/application.properties
+++ /dev/null
@@ -1 +0,0 @@
-env=dev
\ No newline at end of file
diff --git a/guest/logback-example/src/main/resources/logback.xml b/guest/logback-example/src/main/resources/logback.xml
deleted file mode 100644
index d8ec24c7c3..0000000000
--- a/guest/logback-example/src/main/resources/logback.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
-
- System.out
-
-
-
-
-
-
-
-
- log-%d{yyyy-MM-dd}.log
- 30
- 3GB
-
-
- 3MB
-
-
- %d [%thread] %-5level %logger{50} - %msg%n
-
-
-
-
-
- userRole
- ANONYMOUS
-
-
-
- ${userRole}.log
-
- %d [%thread] %level %mdc %logger{50} - %msg%n
-
-
-
-
-
-
-
-
- %d %green([%thread]) %highlight(%level) %logger{50} - %msg%n
-
-
-
-
-
-
- %thread%level%logger%msg
-
-
- log.html
-
-
-
-
-
- ERROR
- ACCEPT
- DENY
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
-
- System.err
-
-
-
-
- WARN
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
-
-
-
-
-
-
- return (level > DEBUG && message.toLowerCase().contains("employee"));
-
- DENY
- NEUTRAL
-
-
- %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
-
-
-
-
-
- 2
-
-
-
- ignoredColorLogger
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/logback-example/src/test/java/com/stackify/services/EmployeeServiceUnitTest.java b/guest/logback-example/src/test/java/com/stackify/services/EmployeeServiceUnitTest.java
deleted file mode 100644
index a3051f7087..0000000000
--- a/guest/logback-example/src/test/java/com/stackify/services/EmployeeServiceUnitTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.stackify.services;
-
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
-
-import com.stackify.models.Employee;
-
-import ch.qos.logback.classic.Level;
-
-public class EmployeeServiceUnitTest {
- private static final Logger logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-
- private EmployeeService employeeService = new EmployeeService();
-
- @Test
- public void testAppenders() {
- Logger rollingFileLogger = LoggerFactory.getLogger("rollingFileLogger");
- rollingFileLogger.info("Testing rolling file logger");
-
- MDC.put("userRole", "ADMIN");
- Logger siftingLogger = LoggerFactory.getLogger("roleSiftingLogger");
- siftingLogger.info("Admin Action");
- }
-
- @Test
- public void testLayouts() {
- Logger htmlLogger = LoggerFactory.getLogger("htmlLogger");
- htmlLogger.error("Employee Information Update Failed");
- htmlLogger.info("New Account Created");
-
- Logger colorLogger = LoggerFactory.getLogger("colorLogger");
- colorLogger.error("Employee Information Update Failed");
- colorLogger.info("New Account Created");
- }
-
- @Test
- public void testLogLevel() {
- ch.qos.logback.classic.Logger rollingFileLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("rollingFileLogger");
- rollingFileLogger.setLevel(Level.DEBUG);
- rollingFileLogger.debug("Testing Log Level");
- }
-
- @Test
- public void testParameter() {
- Employee employee = new Employee("john@gmail.com", "John", 2000);
- if (logger.isDebugEnabled()) {
- logger.debug("The bonus for employee: " + employee.getName() + " is " + employeeService.calculateBonus(employee));
- }
- logger.debug("The bonus for employee {} is {}", employee.getName(), employeeService.calculateBonus(employee));
- }
-
- @Test
- public void testFilters() {
- Logger levelFilterLogger = LoggerFactory.getLogger("levelFilterLogger");
- levelFilterLogger.error("Employee Information Update Failed");
- Logger thresholdFilterLogger = LoggerFactory.getLogger("thresholdFilterLogger");
- thresholdFilterLogger.trace("Employee record inserted");
- Logger evaluatorFilterLogger = LoggerFactory.getLogger("evaluatorFilterLogger");
- evaluatorFilterLogger.debug("Employee account deactivated");
- }
-
- @Test
- public void testIgnoredLogger() {
- Logger colorLogger = LoggerFactory.getLogger("ignoredColorLogger");
- colorLogger.info("Ignored Log Message");
- }
-
- @Test
- public void testConditionalConfiguration() {
- logger.trace("Employee record updated");
- }
-}
diff --git a/guest/remote-debugging/README.md b/guest/remote-debugging/README.md
deleted file mode 100644
index cc63e7fd59..0000000000
--- a/guest/remote-debugging/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-## Building
-
-To build the module, use Maven's `package` goal:
-
-```
-mvn clean package
-```
-
-The `war` file will be available at `target/remote-debugging.war`
-
-## Running
-
-The `war` application is deployed to Apache Tomcat 8 or any other Java Web or Application server.
-To deploy it to the Apache Tomcat 8 server, drop it in the `tomcat/webapps` directory.
-
-The service then will be accessible at http://localhost:8080/remote-debugging/hello?name=John
\ No newline at end of file
diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java b/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java
deleted file mode 100644
index b69e2b6c77..0000000000
--- a/guest/remote-debugging/src/main/java/com/stackify/debug/config/WebInitializer.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.stackify.debug.config;
-
-import com.stackify.debug.JavaRemoteDebuggingApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.boot.web.support.SpringBootServletInitializer;
-
-public class WebInitializer extends SpringBootServletInitializer {
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
- return application.sources(JavaRemoteDebuggingApplication.class);
- }
-}
diff --git a/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java b/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java
deleted file mode 100644
index 8c614a36ec..0000000000
--- a/guest/remote-debugging/src/main/java/com/stackify/debug/rest/HelloController.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.stackify.debug.rest;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController("/hello")
-public class HelloController {
-
- @GetMapping
- public String hello(@RequestParam("name") String name) {
- String message = "Hello, " + name;
- return message;
- }
-
-}
diff --git a/guest/slf4j/guide/pom.xml b/guest/slf4j/guide/pom.xml
deleted file mode 100644
index 8b479a4ba7..0000000000
--- a/guest/slf4j/guide/pom.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- 4.0.0
- com.stackify.slf4j.guide
- slf4j-parent-module
- 1.0.0-SNAPSHOT
- slf4j-parent-module
- pom
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.0.6.RELEASE
-
-
-
- slf4j-logback
- slf4j-log4j2
- slf4j-log4j
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.powermock
- powermock-module-junit4
- ${powermock.version}
- test
-
-
- org.powermock
- powermock-api-mockito2
- ${powermock.version}
- test
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
-
-
- UTF-8
- UTF-8
- 1.8
- 2.0.0-beta.5
-
-
diff --git a/guest/slf4j/guide/slf4j-log4j/pom.xml b/guest/slf4j/guide/slf4j-log4j/pom.xml
deleted file mode 100644
index 70b93d8ab4..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/pom.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
- 4.0.0
- slf4j-log4j
- 0.0.1-SNAPSHOT
- slf4j-log4j
- jar
-
-
- com.stackify.slf4j.guide
- slf4j-parent-module
- 1.0.0-SNAPSHOT
- ..
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.slf4j
- slf4j-log4j12
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
-
- 1.7.25
-
-
diff --git a/guest/slf4j/guide/slf4j-log4j/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java b/guest/slf4j/guide/slf4j-log4j/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
deleted file mode 100644
index 14f4439545..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class SimpleController {
-
- Logger logger = LoggerFactory.getLogger(SimpleController.class);
-
- @GetMapping("/slf4j-guide-request")
- public String processList(List list) {
- logger.info("Client requested process the following list: {}", list);
- try {
- logger.debug("Starting process");
- // ...processing list here...
- Thread.sleep(500);
- } catch (RuntimeException | InterruptedException e) {
- logger.error("There was an issue processing the list.", e);
- } finally {
- logger.info("Finished processing");
- }
- return "done";
- }
-
- @GetMapping("/slf4j-guide-mdc-request")
- public String clientMDCRequest(@RequestHeader String clientId) throws InterruptedException {
- MDC.put("clientId", clientId);
- logger.info("Client {} has made a request", clientId);
- logger.info("Starting request");
- Thread.sleep(500);
- logger.info("Finished request");
- MDC.clear();
- return "finished";
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j/src/main/resources/log4j.xml b/guest/slf4j/guide/slf4j-log4j/src/main/resources/log4j.xml
deleted file mode 100644
index ea432bff77..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/src/main/resources/log4j.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java b/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
deleted file mode 100644
index 991a1e2686..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import static org.powermock.api.mockito.PowerMockito.doNothing;
-import static org.powermock.api.mockito.PowerMockito.spy;
-
-import java.util.Collections;
-
-import org.apache.log4j.Level;
-import org.apache.log4j.spi.LoggingEvent;
-import org.assertj.core.api.Condition;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-import org.slf4j.MDC;
-
-import com.stackify.slf4j.guide.utils.ListAppender;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(MDC.class)
-public class SimpleControllerIntegrationTest {
-
- private SimpleController controller = new SimpleController();
-
- @Before
- public void clearLogList() {
- ListAppender.clearEventList();
- }
-
- @Test
- public void whenSimpleRequestMade_thenAllRegularMessagesLogged() {
- String output = controller.processList(Collections.emptyList());
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .haveAtLeastOne(eventContains("Client requested process the following list: []", Level.INFO))
- .haveAtLeastOne(eventContains("Starting process", Level.DEBUG))
- .haveAtLeastOne(eventContains("Finished processing", Level.INFO))
- .haveExactly(0, eventOfLevel(Level.ERROR));
- errorCollector.assertThat(output)
- .isEqualTo("done");
- errorCollector.assertAll();
- }
-
- @Test
- public void givenClientId_whenMDCRequestMade_thenMessagesWithClientIdLogged() throws Exception {
- // We avoid cleaning the context so tht we can check it afterwards
- spy(MDC.class);
- doNothing().when(MDC.class);
- MDC.clear();
- String clientId = "id-1234";
-
- String output = controller.clientMDCRequest(clientId);
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .allMatch(entry -> {
- return clientId.equals(entry.getMDC("clientId"));
- })
- .haveAtLeastOne(eventContains("Client id-1234 has made a request", Level.INFO))
- .haveAtLeastOne(eventContains("Starting request", Level.INFO))
- .haveAtLeastOne(eventContains("Finished request", Level.INFO));
- errorCollector.assertThat(output)
- .isEqualTo("finished");
- errorCollector.assertAll();
-
- }
-
- private Condition eventOfLevel(Level level) {
- return eventContains(null, level);
- }
-
- private Condition eventContains(String substring, Level level) {
-
- return new Condition(entry -> (substring == null || (entry.getRenderedMessage() != null && entry.getRenderedMessage()
- .contains(substring))) && (level == null || level.equals(entry.getLevel())), String.format("entry with message '%s', level %s", substring, level));
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/utils/ListAppender.java b/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/utils/ListAppender.java
deleted file mode 100644
index 4ce9e73d6d..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/src/test/java/com/stackify/slf4j/guide/utils/ListAppender.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.stackify.slf4j.guide.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.AppenderSkeleton;
-import org.apache.log4j.spi.LoggingEvent;
-
-public class ListAppender extends AppenderSkeleton {
- public static List events = new ArrayList();
-
- @Override
- public void close() {
- }
-
- @Override
- public boolean requiresLayout() {
- return false;
- }
-
- @Override
- protected void append(LoggingEvent event) {
- events.add(event);
- }
-
- public static List getEvents() {
- return events;
- }
-
- public static void clearEventList() {
- events.clear();
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j/src/test/resources/log4j.xml b/guest/slf4j/guide/slf4j-log4j/src/test/resources/log4j.xml
deleted file mode 100644
index 10443e5eab..0000000000
--- a/guest/slf4j/guide/slf4j-log4j/src/test/resources/log4j.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-log4j2/pom.xml b/guest/slf4j/guide/slf4j-log4j2/pom.xml
deleted file mode 100644
index 93a8d9e974..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-
-
- 4.0.0
- slf4j-log4j2
- 0.0.1-SNAPSHOT
- slf4j-log4j2
- jar
-
-
- com.stackify.slf4j.guide
- slf4j-parent-module
- 1.0.0-SNAPSHOT
- ..
-
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
- org.springframework.boot
- spring-boot-starter-log4j2
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
- org.apache.logging.log4j
- log4j-core
- ${log4j.version}
- test-jar
-
-
- org.apache.logging.log4j
- log4j-api
- ${log4j.version}
- test-jar
-
-
-
-
- 2.11.0
-
-
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/Application.java b/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/Application.java
deleted file mode 100644
index 01ccf519b3..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/Application.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.stackify.slf4j.guide;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class Application {
-
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java b/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
deleted file mode 100644
index 14f4439545..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class SimpleController {
-
- Logger logger = LoggerFactory.getLogger(SimpleController.class);
-
- @GetMapping("/slf4j-guide-request")
- public String processList(List list) {
- logger.info("Client requested process the following list: {}", list);
- try {
- logger.debug("Starting process");
- // ...processing list here...
- Thread.sleep(500);
- } catch (RuntimeException | InterruptedException e) {
- logger.error("There was an issue processing the list.", e);
- } finally {
- logger.info("Finished processing");
- }
- return "done";
- }
-
- @GetMapping("/slf4j-guide-mdc-request")
- public String clientMDCRequest(@RequestHeader String clientId) throws InterruptedException {
- MDC.put("clientId", clientId);
- logger.info("Client {} has made a request", clientId);
- logger.info("Starting request");
- Thread.sleep(500);
- logger.info("Finished request");
- MDC.clear();
- return "finished";
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/main/resources/application.properties b/guest/slf4j/guide/slf4j-log4j2/src/main/resources/application.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/main/resources/log4j2-spring.xml b/guest/slf4j/guide/slf4j-log4j2/src/main/resources/log4j2-spring.xml
deleted file mode 100644
index 7d1494c7a6..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/src/main/resources/log4j2-spring.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- ????
- %5p
- yyyy-MM-dd HH:mm:ss.SSS
- %clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta}
- %clr{---}{faint} %clr{%X{clientId}}{red}%clr{@%15.15t}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java b/guest/slf4j/guide/slf4j-log4j2/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
deleted file mode 100644
index f41c857533..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import java.util.Collections;
-
-import org.apache.logging.log4j.Level;
-import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.junit.LoggerContextRule;
-import org.apache.logging.log4j.test.appender.ListAppender;
-import org.assertj.core.api.Condition;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-
-public class SimpleControllerIntegrationTest {
-
- private static ListAppender appender;
- private SimpleController controller = new SimpleController();
-
- @ClassRule
- public static LoggerContextRule init = new LoggerContextRule("log4j2-test.xml");
-
- @BeforeClass
- public static void setupLogging() {
- appender = init.getListAppender("ListAppender");
- }
-
- @Before
- public void clearAppender() {
- appender.clear();
- }
-
- @Test
- public void whenSimpleRequestMade_thenAllRegularMessagesLogged() {
- String output = controller.processList(Collections.emptyList());
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(appender.getEvents())
- .haveAtLeastOne(eventContains("Client requested process the following list: []", Level.INFO))
- .haveAtLeastOne(eventContains("Starting process", Level.DEBUG))
- .haveAtLeastOne(eventContains("Finished processing", Level.INFO))
- .haveExactly(0, eventOfLevel(Level.ERROR));
- errorCollector.assertThat(output)
- .isEqualTo("done");
- errorCollector.assertAll();
- }
-
- @Test
- public void givenClientId_whenMDCRequestMade_thenMessagesWithClientIdLogged() throws Exception {
- String clientId = "id-1234";
-
- String output = controller.clientMDCRequest(clientId);
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(appender.getEvents())
- .allMatch(entry -> {
- return clientId.equals(entry.getContextData()
- .getValue("clientId"));
- })
- .haveAtLeastOne(eventContains("Client id-1234 has made a request", Level.INFO))
- .haveAtLeastOne(eventContains("Starting request", Level.INFO))
- .haveAtLeastOne(eventContains("Finished request", Level.INFO));
- errorCollector.assertThat(output)
- .isEqualTo("finished");
- errorCollector.assertAll();
- }
-
- private Condition eventOfLevel(Level level) {
- return eventContains(null, level);
- }
-
- private Condition eventContains(String substring, Level level) {
-
- return new Condition(entry -> (substring == null || (entry.getMessage()
- .getFormattedMessage() != null && entry.getMessage()
- .getFormattedMessage()
- .contains(substring)))
- && (level == null || level.equals(entry.getLevel())), String.format("entry with message '%s', level %s", substring, level));
- }
-}
diff --git a/guest/slf4j/guide/slf4j-log4j2/src/test/resources/log4j2-test.xml b/guest/slf4j/guide/slf4j-log4j2/src/test/resources/log4j2-test.xml
deleted file mode 100644
index 2ca386f7f6..0000000000
--- a/guest/slf4j/guide/slf4j-log4j2/src/test/resources/log4j2-test.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-logback/pom.xml b/guest/slf4j/guide/slf4j-logback/pom.xml
deleted file mode 100644
index 74f4470bad..0000000000
--- a/guest/slf4j/guide/slf4j-logback/pom.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
- 4.0.0
- slf4j-logback
- 0.0.1-SNAPSHOT
- slf4j-logback
- jar
-
-
- com.stackify.slf4j.guide
- slf4j-parent-module
- 1.0.0-SNAPSHOT
- ..
-
-
-
-
- org.slf4j
- slf4j-ext
-
-
- ch.qos.cal10n
- cal10n-api
- ${cal10n.version}
-
-
-
-
- 0.8.1
-
-
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java b/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
deleted file mode 100644
index 1fab675c94..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/controllers/SimpleController.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.UUID;
-import java.util.concurrent.ThreadLocalRandom;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.MDC;
-import org.slf4j.Marker;
-import org.slf4j.MarkerFactory;
-import org.slf4j.cal10n.LocLogger;
-import org.slf4j.cal10n.LocLoggerFactory;
-import org.slf4j.ext.EventData;
-import org.slf4j.ext.EventLogger;
-import org.slf4j.profiler.Profiler;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.stackify.slf4j.guide.l10n.Messages;
-
-import ch.qos.cal10n.IMessageConveyor;
-import ch.qos.cal10n.MessageConveyor;
-
-@RestController
-public class SimpleController {
-
- Logger logger = LoggerFactory.getLogger(SimpleController.class);
-
- @GetMapping("/slf4j-guide-request")
- public String processList(List list) {
- logger.info("Client requested process the following list: {}", list);
- try {
- logger.debug("Starting process");
- // ...processing list here...
- Thread.sleep(500);
- } catch (RuntimeException | InterruptedException e) {
- logger.error("There was an issue processing the list.", e);
- } finally {
- logger.info("Finished processing");
- }
- return "done";
- }
-
- @GetMapping("/slf4j-guide-mdc-request")
- public String clientMDCRequest(@RequestHeader String clientId) throws InterruptedException {
- MDC.put("clientId", clientId);
- logger.info("Client {} has made a request", clientId);
- logger.info("Starting request");
- Thread.sleep(500);
- logger.info("Finished request");
- MDC.clear();
- return "finished";
- }
-
- @GetMapping("/slf4j-guide-marker-request")
- public String clientMarkerRequest() throws InterruptedException {
- logger.info("client has made a request");
- Marker myMarker = MarkerFactory.getMarker("MYMARKER");
- logger.info(myMarker, "Starting request");
- Thread.sleep(500);
- logger.debug(myMarker, "Finished request");
- return "finished";
- }
-
- @GetMapping("/slf4j-guide-profiler-request")
- public String clientProfilerRequest() {
- logger.info("client has made a request");
- Profiler myProfiler = new Profiler("MYPROFILER");
- // Associate the logger to handle the output( for testing purposes here)
- myProfiler.setLogger(logger);
-
- myProfiler.start("List generation process");
- List list = generateList();
-
- myProfiler.start("List sorting process");
- Collections.sort(list);
-
- // Use the log() method instead of print() to use the logger (for testing purposes here)
- myProfiler.stop()
- .log();
- return "finished";
- }
-
- private List generateList() {
- List generated = new ArrayList<>();
- for (int i = 0; i < 5000; i++) {
- generated.add(ThreadLocalRandom.current()
- .nextInt(2000));
- }
- return generated;
- }
-
- @GetMapping("/slf4j-guide-event-request")
- public String clientEventRequest(@RequestParam("sender") String sender, @RequestParam("receiver") String receiver) {
- logger.info("sending from {} to {}", sender, receiver);
-
- // ...sending process...
-
- EventData data = new EventData();
- data.setEventDateTime(new Date());
- data.setEventType("sending");
- String confirm = UUID.randomUUID()
- .toString();
- data.setEventId(confirm);
- data.put("from", sender);
- data.put("to", receiver);
- EventLogger.logEvent(data);
-
- return "finished";
- }
-
- @GetMapping("/slf4j-guide-locale-request")
- public String clientLocaleRequest(@RequestHeader("Accept-Language") String localeHeader) {
- List list = Locale.LanguageRange.parse(localeHeader);
- Locale locale = Locale.lookup(list, Arrays.asList(Locale.getAvailableLocales()));
- IMessageConveyor messageConveyor = new MessageConveyor(locale);
- LocLoggerFactory llFactory = new LocLoggerFactory(messageConveyor);
- LocLogger locLogger = llFactory.getLocLogger(this.getClass());
- locLogger.info(Messages.CLIENT_REQUEST, "parametrizedClientId", localeHeader);
- locLogger.debug(Messages.REQUEST_STARTED);
- locLogger.info(Messages.REQUEST_FINISHED);
- return "finished";
- }
-
-}
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/l10n/Messages.java b/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/l10n/Messages.java
deleted file mode 100644
index e4aacaf3be..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/l10n/Messages.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.stackify.slf4j.guide.l10n;
-
-import ch.qos.cal10n.BaseName;
-import ch.qos.cal10n.Locale;
-import ch.qos.cal10n.LocaleData;
-
-@BaseName("messages")
-@LocaleData({ @Locale("en_US"), @Locale("es_ES") })
-public enum Messages {
- CLIENT_REQUEST, REQUEST_STARTED, REQUEST_FINISHED
-}
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/xlogger/XLoggerController.java b/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/xlogger/XLoggerController.java
deleted file mode 100644
index 8690c0ebc9..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/java/com/stackify/slf4j/guide/xlogger/XLoggerController.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.stackify.slf4j.guide.xlogger;
-
-import org.slf4j.ext.XLogger;
-import org.slf4j.ext.XLoggerFactory;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class XLoggerController {
-
- private XLogger logger = XLoggerFactory.getXLogger(XLoggerController.class);
-
- @GetMapping("/slf4j-guide-xlogger-request")
- public Integer clientXLoggerRequest(@RequestParam("queryParam") Integer queryParam) {
- logger.info("Starting process");
- logger.entry(queryParam);
- Integer rest = 0;
- try {
- rest = queryParam % 3;
- } catch (RuntimeException anyException) {
- logger.catching(anyException);
- }
- logger.exit(rest);
- return rest;
- }
-
-}
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/resources/application.properties b/guest/slf4j/guide/slf4j-logback/src/main/resources/application.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/resources/logback-spring.xml b/guest/slf4j/guide/slf4j-logback/src/main/resources/logback-spring.xml
deleted file mode 100644
index 112e79c340..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/resources/logback-spring.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
- %marker %d{yyyy-MM-dd HH:mm:ss.SSS} -%5p %X{clientId}@%15.15t %-40.40logger{39} : %m%n
-
-
-
-
-
-
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_en_US.properties b/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_en_US.properties
deleted file mode 100644
index a35dd60da3..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_en_US.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-CLIENT_REQUEST=Client {0} has made a request using locale {1}
-REQUEST_STARTED=Request started
-REQUEST_FINISHED=Request finished
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_es_ES.properties b/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_es_ES.properties
deleted file mode 100644
index 6cdab09236..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/main/resources/messages_es_ES.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-CLIENT_REQUEST=El cliente {0} ha realizado una solicitud usando locale {1}
-REQUEST_STARTED=Solicitud iniciada
-REQUEST_FINISHED=Solicitud finalizada
\ No newline at end of file
diff --git a/guest/slf4j/guide/slf4j-logback/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java b/guest/slf4j/guide/slf4j-logback/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
deleted file mode 100644
index b870cc9ebd..0000000000
--- a/guest/slf4j/guide/slf4j-logback/src/test/java/com/stackify/slf4j/guide/controllers/SimpleControllerIntegrationTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package com.stackify.slf4j.guide.controllers;
-
-import static org.powermock.api.mockito.PowerMockito.doNothing;
-import static org.powermock.api.mockito.PowerMockito.spy;
-
-import java.util.Collections;
-
-import org.assertj.core.api.Condition;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-import org.slf4j.MDC;
-
-import com.stackify.slf4j.guide.utils.ListAppender;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(MDC.class)
-public class SimpleControllerIntegrationTest {
-
- SimpleController controller = new SimpleController();
-
- @Before
- public void clearLogList() {
- ListAppender.clearEventList();
- }
-
- @Test
- public void whenSimpleRequestMade_thenAllRegularMessagesLogged() {
- String output = controller.processList(Collections.emptyList());
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .haveAtLeastOne(eventContains("Client requested process the following list: []", Level.INFO))
- .haveAtLeastOne(eventContains("Starting process", Level.DEBUG))
- .haveAtLeastOne(eventContains("Finished processing", Level.INFO))
- .haveExactly(0, eventOfLevel(Level.ERROR));
- errorCollector.assertThat(output)
- .isEqualTo("done");
- errorCollector.assertAll();
- }
-
- @Test
- public void givenClientId_whenMDCRequestMade_thenMessagesWithClientIdLogged() throws Exception {
- // We avoid cleaning the context so tht we can check it afterwards
- spy(MDC.class);
- doNothing().when(MDC.class);
- MDC.clear();
- String clientId = "id-1234";
-
- String output = controller.clientMDCRequest(clientId);
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .allMatch(entry -> {
- return clientId.equals(entry.getMDCPropertyMap()
- .get("clientId"));
- })
- .haveAtLeastOne(eventContains("Client id-1234 has made a request", Level.INFO))
- .haveAtLeastOne(eventContains("Starting request", Level.INFO))
- .haveAtLeastOne(eventContains("Finished request", Level.INFO));
- errorCollector.assertThat(output)
- .isEqualTo("finished");
- errorCollector.assertAll();
- }
-
- @Test
- public void whenMarkerRequestMade_thenMessagesWithMarkerLogged() throws Exception {
- String output = controller.clientMarkerRequest();
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .haveAtLeastOne(eventContains("client has made a request", Level.INFO))
- .haveAtLeastOne(eventContains("Starting request", Level.INFO, "MYMARKER"))
- .haveAtLeastOne(eventContains("Finished request", Level.DEBUG, "MYMARKER"))
- .haveExactly(2, eventContains(null, null, "MYMARKER"));
- errorCollector.assertThat(output)
- .isEqualTo("finished");
- errorCollector.assertAll();
- }
-
- @Test
- public void whenProfilerRequestMade_thenMessagesWithPerformanceLogged() throws Exception {
- String output = controller.clientProfilerRequest();
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .haveAtLeastOne(eventContains("client has made a request", Level.INFO))
- .haveAtLeastOne(eventContains("Profiler [MYPROFILER]", Level.DEBUG));
- errorCollector.assertThat(output)
- .isEqualTo("finished");
- errorCollector.assertAll();
- }
-
- @Test
- public void whenEventRequestMade_thenMessagesWithEventLogged() throws Exception {
- String sender = "sender";
- String receiver = "receiver";
- String output = controller.clientEventRequest(sender, receiver);
-
- SoftAssertions errorCollector = new SoftAssertions();
- errorCollector.assertThat(ListAppender.getEvents())
- .haveAtLeastOne(eventContains("sending from sender to receiver", Level.INFO))
- .haveAtLeastOne(eventContains("