diff --git a/.gitignore b/.gitignore
index 2edea19340..349efbcb67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ bin/
*.class
# Package Files #
+*.jar
*.war
*.ear
@@ -29,7 +30,7 @@ out/
.DS_Store
# Maven
-log/
+log/*
target/
# Gradle
@@ -82,4 +83,11 @@ jta/transaction-logs/
software-security/sql-injection-samples/derby.log
spring-soap/src/main/java/com/baeldung/springsoap/gen/
/report-*.json
-transaction.log
\ No newline at end of file
+transaction.log
+*-shell.log
+
+apache-cxf/cxf-aegis/baeldung.xml
+apache-fop/src/test/resources/input.xml
+apache-fop/src/test/resources/output_herold.pdf
+apache-fop/src/test/resources/output_html2fo.pdf
+apache-fop/src/test/resources/output_jtidy.pdf
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 5e86714a89..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-language: java
-
-before_install:
- - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc
-
-install: skip
-script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true
-
-sudo: required
-
-jdk:
- - oraclejdk8
-
-addons:
- apt:
- packages:
- - oracle-java8-installer
-
-cache:
- directories:
- - .autoconf
- - $HOME/.m2
-
-
diff --git a/JGit/README.md b/JGit/README.md
deleted file mode 100644
index 5c65f1101b..0000000000
--- a/JGit/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Relevant articles:
-
-- [A Guide to JGit](http://www.baeldung.com/jgit)
diff --git a/README.md b/README.md
index 7f78cf1515..4cad075cc3 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,16 @@
-The "REST with Spring" Classes
+The Courses
==============================
-Here's the Master Class of REST With Spring (along with the newly announced Boot 2 material):
-**[>> THE REST WITH SPRING - MASTER CLASS](http://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
-And here's the Master Class of Learn Spring Security:
-**[>> LEARN SPRING SECURITY - MASTER CLASS](http://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
+Here's the new "Learn Spring" course:
+**[>> LEARN SPRING - THE MASTER CLASS](https://www.baeldung.com/learn-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=ls#master-class)**
+
+Here's the Master Class of "REST With Spring" (along with the new announced Boot 2 material):
+**[>> THE REST WITH SPRING - MASTER CLASS](https://www.baeldung.com/rest-with-spring-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=rws#master-class)**
+
+And here's the Master Class of "Learn Spring Security":
+**[>> LEARN SPRING SECURITY - MASTER CLASS](https://www.baeldung.com/learn-spring-security-course?utm_source=github&utm_medium=social&utm_content=tutorials&utm_campaign=lss#master-class)**
@@ -15,7 +19,7 @@ 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 following technologies are in focus: `core Java`, `Jackson`, `HttpClient`, `Guava`.
+In additional to Spring, the modules here are covering a number of aspects in Java.
Building the project
@@ -32,8 +36,15 @@ Running a Spring Boot module
====================
To run a Spring Boot module run the command: `mvn spring-boot:run` in the module directory
-###Running Tests
+Working with the IDE
+====================
+This repo contains a large number of modules.
+When you're working with an individual module, there's no need to import all of them (or build all of them) - you can simply import that particular module in either Eclipse or IntelliJ.
+
+
+Running Tests
+=============
The command `mvn clean install` will run the unit tests in a module.
To run the integration tests, use the command `mvn clean install -Pintegration-lite-first`
diff --git a/Twitter4J/README.md b/Twitter4J/README.md
deleted file mode 100644
index 3057c1c4b2..0000000000
--- a/Twitter4J/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant articles
-
-- [Introduction to Twitter4J](http://www.baeldung.com/twitter4j)
diff --git a/akka-http/README.md b/akka-http/README.md
index 3831b5079f..ebe6581ff6 100644
--- a/akka-http/README.md
+++ b/akka-http/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Akka HTTP
+
+This module contains articles about Akka HTTP.
+
+### Relevant articles:
- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http)
diff --git a/akka-streams/README.md b/akka-streams/README.md
index 7f2751422b..a59b7fde5c 100644
--- a/akka-streams/README.md
+++ b/akka-streams/README.md
@@ -1,3 +1,7 @@
+## Akka Streams
+
+This module contains articles about Akka Streams.
+
### Relevant articles
-- [Guide to Akka Streams](http://www.baeldung.com/akka-streams)
+- [Guide to Akka Streams](https://www.baeldung.com/akka-streams)
diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md
index 39f8d59eee..1c9e831ac2 100644
--- a/algorithms-genetic/README.md
+++ b/algorithms-genetic/README.md
@@ -1,6 +1,10 @@
-## Relevant articles:
+## Genetic Algorithms
-- [Introduction to Jenetics Library](http://www.baeldung.com/jenetics)
-- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization)
+This module contains articles about genetic algorithms.
+
+### Relevant articles:
+
+- [Introduction to Jenetics Library](https://www.baeldung.com/jenetics)
+- [Ant Colony Optimization](https://www.baeldung.com/java-ant-colony-optimization)
- [Design a Genetic Algorithm in Java](https://www.baeldung.com/java-genetic-algorithm)
- [The Traveling Salesman Problem in Java](https://www.baeldung.com/java-simulated-annealing-for-traveling-salesman)
diff --git a/algorithms-miscellaneous-1/.gitignore b/algorithms-miscellaneous-1/.gitignore
deleted file mode 100644
index 30b2b7442c..0000000000
--- a/algorithms-miscellaneous-1/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/target/
-.settings/
-.classpath
-.project
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index 479c2792f6..6a25f8cac8 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -1,18 +1,15 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
-- [Validating Input With Finite Automata in Java](http://www.baeldung.com/java-finite-automata)
-- [Example of Hill Climbing Algorithm](http://www.baeldung.com/java-hill-climbing-algorithm)
-- [Monte Carlo Tree Search for Tic-Tac-Toe Game](http://www.baeldung.com/java-monte-carlo-tree-search)
-- [Binary Search Algorithm in Java](http://www.baeldung.com/java-binary-search)
-- [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm)
-- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance)
-- [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element)
-- [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm)
-- [String Search Algorithms for Large Texts](http://www.baeldung.com/java-full-text-search-algorithms)
-- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
-- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element)
-- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial)
-- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
-- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
-- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
-- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm)
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
+
+- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata)
+- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm)
+- [Monte Carlo Tree Search for Tic-Tac-Toe Game](https://www.baeldung.com/java-monte-carlo-tree-search)
+- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search)
+- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm)
+- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance)
+- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element)
+- More articles: [[next -->]](/../algorithms-miscellaneous-2)
diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md
index 462644dddb..7560fc4fe7 100644
--- a/algorithms-miscellaneous-2/README.md
+++ b/algorithms-miscellaneous-2/README.md
@@ -1,19 +1,16 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
-- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra)
-- [Introduction to Cobertura](http://www.baeldung.com/cobertura)
-- [Test a Linked List for Cyclicity](http://www.baeldung.com/java-linked-list-cyclicity)
-- [Introduction to JGraphT](http://www.baeldung.com/jgrapht)
-- [A Maze Solver in Java](http://www.baeldung.com/java-solve-maze)
-- [Create a Sudoku Solver in Java](http://www.baeldung.com/java-sudoku)
-- [Displaying Money Amounts in Words](http://www.baeldung.com/java-money-into-words)
-- [A Collaborative Filtering Recommendation System in Java](http://www.baeldung.com/java-collaborative-filtering-recommendations)
-- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap)
-- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points)
-- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines)
-- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred)
-- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
-- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
-- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
-- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
-- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
+
+- [Dijkstra Shortest Path Algorithm in Java](https://www.baeldung.com/java-dijkstra)
+- [Introduction to Cobertura](https://www.baeldung.com/cobertura)
+- [Test a Linked List for Cyclicity](https://www.baeldung.com/java-linked-list-cyclicity)
+- [Introduction to JGraphT](https://www.baeldung.com/jgrapht)
+- [A Maze Solver in Java](https://www.baeldung.com/java-solve-maze)
+- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku)
+- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words)
+- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-1) [[next -->]](/../algorithms-miscellaneous-3)
diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md
index cd3711d573..a1456c6b20 100644
--- a/algorithms-miscellaneous-3/README.md
+++ b/algorithms-miscellaneous-3/README.md
@@ -1,9 +1,19 @@
-## Relevant articles:
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/algorithms-sorting) and
+[genetic algorithms](/algorithms-genetic), have their own dedicated modules.
+
+## Relevant Articles:
- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
- [Implementing Simple State Machines with Java Enums](https://www.baeldung.com/java-enum-simple-state-machine)
-- [Converting Between Roman and Arabic Numerals in Java](http://www.baeldung.com/java-convert-roman-arabic)
-- [Practical Java Examples of the Big O Notation](http://www.baeldung.com/java-algorithm-complexity)
+- [Converting Between Roman and Arabic Numerals in Java](https://www.baeldung.com/java-convert-roman-arabic)
+- [Practical Java Examples of the Big O Notation](https://www.baeldung.com/java-algorithm-complexity)
- [Checking If a List Is Sorted in Java](https://www.baeldung.com/java-check-if-list-sorted)
- [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle)
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
+- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
+- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
+- [Interpolation Search in Java](https://www.baeldung.com/java-interpolation-search)
+- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
+- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-miscellaneous-3/pom.xml
index 3cebdd09ac..67923d37d7 100644
--- a/algorithms-miscellaneous-3/pom.xml
+++ b/algorithms-miscellaneous-3/pom.xml
@@ -1,5 +1,5 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
algorithms-miscellaneous-3
0.0.1-SNAPSHOT
@@ -18,17 +18,56 @@
${org.assertj.core.version}
test
-
+
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
-
+
- com.google.guava
- guava
- ${guava.version}
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ com.squareup.retrofit2
+ retrofit
+ ${retrofit.version}
+
+
+ com.squareup.retrofit2
+ converter-jackson
+ ${retrofit.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ 3.8.1
+
+
+
+ pl.pragmatists
+ JUnitParams
+ 1.1.0
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
@@ -48,5 +87,8 @@
3.9.0
4.3
28.0-jre
+ 2.6.0
+ 1.19
+ 1.19
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
new file mode 100644
index 0000000000..9d301f9578
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithm.java
@@ -0,0 +1,54 @@
+package com.baeldung.algorithms.breadthfirstsearch;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+public class BreadthFirstSearchAlgorithm {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BreadthFirstSearchAlgorithm.class);
+
+ public static Optional> search(T value, Tree root) {
+ Queue> queue = new ArrayDeque<>();
+ queue.add(root);
+
+ Tree currentNode;
+ while (!queue.isEmpty()) {
+ currentNode = queue.remove();
+ LOGGER.info("Visited node with value: {}", currentNode.getValue());
+
+ if (currentNode.getValue().equals(value)) {
+ return Optional.of(currentNode);
+ } else {
+ queue.addAll(currentNode.getChildren());
+ }
+ }
+
+ return Optional.empty();
+ }
+
+ public static Optional> search(T value, Node start) {
+ Queue> queue = new ArrayDeque<>();
+ queue.add(start);
+
+ Node currentNode;
+ Set> alreadyVisited = new HashSet<>();
+
+ while (!queue.isEmpty()) {
+ currentNode = queue.remove();
+ LOGGER.info("Visited node with value: {}", currentNode.getValue());
+
+ if (currentNode.getValue().equals(value)) {
+ return Optional.of(currentNode);
+ } else {
+ alreadyVisited.add(currentNode);
+ queue.addAll(currentNode.getNeighbors());
+ queue.removeAll(alreadyVisited);
+ }
+ }
+
+ return Optional.empty();
+ }
+
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java
new file mode 100644
index 0000000000..54a589ae26
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Node.java
@@ -0,0 +1,31 @@
+package com.baeldung.algorithms.breadthfirstsearch;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Node {
+
+ private T value;
+ private Set> neighbors;
+
+ public Node(T value) {
+ this.value = value;
+ this.neighbors = new HashSet<>();
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public Set> getNeighbors() {
+ return Collections.unmodifiableSet(neighbors);
+ }
+
+ public void connect(Node node) {
+ if (this == node) throw new IllegalArgumentException("Can't connect node to itself");
+ this.neighbors.add(node);
+ node.neighbors.add(this);
+ }
+
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java
new file mode 100644
index 0000000000..842d2837ff
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/breadthfirstsearch/Tree.java
@@ -0,0 +1,34 @@
+package com.baeldung.algorithms.breadthfirstsearch;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class Tree {
+
+ private T value;
+ private List> children;
+
+ private Tree(T value) {
+ this.value = value;
+ this.children = new ArrayList<>();
+ }
+
+ public static Tree of(T value) {
+ return new Tree<>(value);
+ }
+
+ public T getValue() {
+ return value;
+ }
+
+ public List> getChildren() {
+ return Collections.unmodifiableList(children);
+ }
+
+ public Tree addChild(T value) {
+ Tree newChild = new Tree<>(value);
+ children.add(newChild);
+ return newChild;
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java
new file mode 100644
index 0000000000..91423eeaa8
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java
@@ -0,0 +1,35 @@
+package com.baeldung.algorithms.interpolationsearch;
+
+public class InterpolationSearch {
+
+ public static int interpolationSearch(int[] data, int item) {
+
+ int highEnd = (data.length - 1);
+ int lowEnd = 0;
+
+ while (item >= data[lowEnd] && item <= data[highEnd] && lowEnd <= highEnd) {
+
+ int probe = lowEnd + (highEnd - lowEnd) * (item - data[lowEnd]) / (data[highEnd] - data[lowEnd]);
+
+ if (highEnd == lowEnd) {
+ if (data[lowEnd] == item) {
+ return lowEnd;
+ } else {
+ return -1;
+ }
+ }
+
+ if (data[probe] == item) {
+ return probe;
+ }
+
+ if (data[probe] < item) {
+ lowEnd = probe + 1;
+ } else {
+ highEnd = probe - 1;
+ }
+ }
+ return -1;
+ }
+
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java
new file mode 100644
index 0000000000..523d5b56a5
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Centroid.java
@@ -0,0 +1,45 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Encapsulates all coordinates for a particular cluster centroid.
+ */
+public class Centroid {
+
+ /**
+ * The centroid coordinates.
+ */
+ private final Map coordinates;
+
+ public Centroid(Map coordinates) {
+ this.coordinates = coordinates;
+ }
+
+ public Map getCoordinates() {
+ return coordinates;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Centroid centroid = (Centroid) o;
+ return Objects.equals(getCoordinates(), centroid.getCoordinates());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getCoordinates());
+ }
+
+ @Override
+ public String toString() {
+ return "Centroid " + coordinates;
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java
new file mode 100644
index 0000000000..30723cb6b3
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Distance.java
@@ -0,0 +1,20 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.Map;
+
+/**
+ * Defines a contract to calculate distance between two feature vectors. The less the
+ * calculated distance, the more two items are similar to each other.
+ */
+public interface Distance {
+
+ /**
+ * Calculates the distance between two feature vectors.
+ *
+ * @param f1 The first set of features.
+ * @param f2 The second set of features.
+ * @return Calculated distance.
+ * @throws IllegalArgumentException If the given feature vectors are invalid.
+ */
+ double calculate(Map f1, Map f2);
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java
new file mode 100644
index 0000000000..3228876051
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Errors.java
@@ -0,0 +1,23 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates methods to calculates errors between centroid and the cluster members.
+ */
+public class Errors {
+
+ public static double sse(Map> clustered, Distance distance) {
+ double sum = 0;
+ for (Map.Entry> entry : clustered.entrySet()) {
+ Centroid centroid = entry.getKey();
+ for (Record record : entry.getValue()) {
+ double d = distance.calculate(centroid.getCoordinates(), record.getFeatures());
+ sum += Math.pow(d, 2);
+ }
+ }
+
+ return sum;
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java
new file mode 100644
index 0000000000..193d9afed1
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/EuclideanDistance.java
@@ -0,0 +1,26 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.Map;
+
+/**
+ * Calculates the distance between two items using the Euclidean formula.
+ */
+public class EuclideanDistance implements Distance {
+
+ @Override
+ public double calculate(Map f1, Map f2) {
+ if (f1 == null || f2 == null) {
+ throw new IllegalArgumentException("Feature vectors can't be null");
+ }
+
+ double sum = 0;
+ for (String key : f1.keySet()) {
+ Double v1 = f1.get(key);
+ Double v2 = f2.get(key);
+
+ if (v1 != null && v2 != null) sum += Math.pow(v1 - v2, 2);
+ }
+
+ return Math.sqrt(sum);
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java
new file mode 100644
index 0000000000..1fb8541ff9
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/KMeans.java
@@ -0,0 +1,236 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+
+/**
+ * Encapsulates an implementation of KMeans clustering algorithm.
+ *
+ * @author Ali Dehghani
+ */
+public class KMeans {
+
+ private KMeans() {
+ throw new IllegalAccessError("You shouldn't call this constructor");
+ }
+
+ /**
+ * Will be used to generate random numbers.
+ */
+ private static final Random random = new Random();
+
+ /**
+ * Performs the K-Means clustering algorithm on the given dataset.
+ *
+ * @param records The dataset.
+ * @param k Number of Clusters.
+ * @param distance To calculate the distance between two items.
+ * @param maxIterations Upper bound for the number of iterations.
+ * @return K clusters along with their features.
+ */
+ public static Map> fit(List records, int k, Distance distance, int maxIterations) {
+ applyPreconditions(records, k, distance, maxIterations);
+
+ List centroids = randomCentroids(records, k);
+ Map> clusters = new HashMap<>();
+ Map> lastState = new HashMap<>();
+
+ // iterate for a pre-defined number of times
+ for (int i = 0; i < maxIterations; i++) {
+ boolean isLastIteration = i == maxIterations - 1;
+
+ // in each iteration we should find the nearest centroid for each record
+ for (Record record : records) {
+ Centroid centroid = nearestCentroid(record, centroids, distance);
+ assignToCluster(clusters, record, centroid);
+ }
+
+ // if the assignment does not change, then the algorithm terminates
+ boolean shouldTerminate = isLastIteration || clusters.equals(lastState);
+ lastState = clusters;
+ if (shouldTerminate) {
+ break;
+ }
+
+ // at the end of each iteration we should relocate the centroids
+ centroids = relocateCentroids(clusters);
+ clusters = new HashMap<>();
+ }
+
+ return lastState;
+ }
+
+ /**
+ * Move all cluster centroids to the average of all assigned features.
+ *
+ * @param clusters The current cluster configuration.
+ * @return Collection of new and relocated centroids.
+ */
+ private static List relocateCentroids(Map> clusters) {
+ return clusters
+ .entrySet()
+ .stream()
+ .map(e -> average(e.getKey(), e.getValue()))
+ .collect(toList());
+ }
+
+ /**
+ * Moves the given centroid to the average position of all assigned features. If
+ * the centroid has no feature in its cluster, then there would be no need for a
+ * relocation. Otherwise, for each entry we calculate the average of all records
+ * first by summing all the entries and then dividing the final summation value by
+ * the number of records.
+ *
+ * @param centroid The centroid to move.
+ * @param records The assigned features.
+ * @return The moved centroid.
+ */
+ private static Centroid average(Centroid centroid, List records) {
+ // if this cluster is empty, then we shouldn't move the centroid
+ if (records == null || records.isEmpty()) {
+ return centroid;
+ }
+
+ // Since some records don't have all possible attributes, we initialize
+ // average coordinates equal to current centroid coordinates
+ Map average = centroid.getCoordinates();
+
+ // The average function works correctly if we clear all coordinates corresponding
+ // to present record attributes
+ records
+ .stream()
+ .flatMap(e -> e
+ .getFeatures()
+ .keySet()
+ .stream())
+ .forEach(k -> average.put(k, 0.0));
+
+ for (Record record : records) {
+ record
+ .getFeatures()
+ .forEach((k, v) -> average.compute(k, (k1, currentValue) -> v + currentValue));
+ }
+
+ average.forEach((k, v) -> average.put(k, v / records.size()));
+
+ return new Centroid(average);
+ }
+
+ /**
+ * Assigns a feature vector to the given centroid. If this is the first assignment for this centroid,
+ * first we should create the list.
+ *
+ * @param clusters The current cluster configuration.
+ * @param record The feature vector.
+ * @param centroid The centroid.
+ */
+ private static void assignToCluster(Map> clusters, Record record, Centroid centroid) {
+ clusters.compute(centroid, (key, list) -> {
+ if (list == null) {
+ list = new ArrayList<>();
+ }
+
+ list.add(record);
+ return list;
+ });
+ }
+
+ /**
+ * With the help of the given distance calculator, iterates through centroids and finds the
+ * nearest one to the given record.
+ *
+ * @param record The feature vector to find a centroid for.
+ * @param centroids Collection of all centroids.
+ * @param distance To calculate the distance between two items.
+ * @return The nearest centroid to the given feature vector.
+ */
+ private static Centroid nearestCentroid(Record record, List centroids, Distance distance) {
+ double minimumDistance = Double.MAX_VALUE;
+ Centroid nearest = null;
+
+ for (Centroid centroid : centroids) {
+ double currentDistance = distance.calculate(record.getFeatures(), centroid.getCoordinates());
+
+ if (currentDistance < minimumDistance) {
+ minimumDistance = currentDistance;
+ nearest = centroid;
+ }
+ }
+
+ return nearest;
+ }
+
+ /**
+ * Generates k random centroids. Before kicking-off the centroid generation process,
+ * first we calculate the possible value range for each attribute. Then when
+ * we're going to generate the centroids, we generate random coordinates in
+ * the [min, max] range for each attribute.
+ *
+ * @param records The dataset which helps to calculate the [min, max] range for
+ * each attribute.
+ * @param k Number of clusters.
+ * @return Collections of randomly generated centroids.
+ */
+ private static List randomCentroids(List records, int k) {
+ List centroids = new ArrayList<>();
+ Map maxs = new HashMap<>();
+ Map mins = new HashMap<>();
+
+ for (Record record : records) {
+ record
+ .getFeatures()
+ .forEach((key, value) -> {
+ // compares the value with the current max and choose the bigger value between them
+ maxs.compute(key, (k1, max) -> max == null || value > max ? value : max);
+
+ // compare the value with the current min and choose the smaller value between them
+ mins.compute(key, (k1, min) -> min == null || value < min ? value : min);
+ });
+ }
+
+ Set attributes = records
+ .stream()
+ .flatMap(e -> e
+ .getFeatures()
+ .keySet()
+ .stream())
+ .collect(toSet());
+ for (int i = 0; i < k; i++) {
+ Map coordinates = new HashMap<>();
+ for (String attribute : attributes) {
+ double max = maxs.get(attribute);
+ double min = mins.get(attribute);
+ coordinates.put(attribute, random.nextDouble() * (max - min) + min);
+ }
+
+ centroids.add(new Centroid(coordinates));
+ }
+
+ return centroids;
+ }
+
+ private static void applyPreconditions(List records, int k, Distance distance, int maxIterations) {
+ if (records == null || records.isEmpty()) {
+ throw new IllegalArgumentException("The dataset can't be empty");
+ }
+
+ if (k <= 1) {
+ throw new IllegalArgumentException("It doesn't make sense to have less than or equal to 1 cluster");
+ }
+
+ if (distance == null) {
+ throw new IllegalArgumentException("The distance calculator is required");
+ }
+
+ if (maxIterations <= 0) {
+ throw new IllegalArgumentException("Max iterations should be a positive number");
+ }
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java
new file mode 100644
index 0000000000..4694a845af
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFm.java
@@ -0,0 +1,144 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import okhttp3.OkHttpClient;
+import retrofit2.Retrofit;
+import retrofit2.converter.jackson.JacksonConverterFactory;
+
+import static java.util.stream.Collectors.toSet;
+
+public class LastFm {
+
+ private static OkHttpClient okHttp = new OkHttpClient.Builder()
+ .addInterceptor(new LastFmService.Authenticator("put your API key here"))
+ .build();
+
+ private static Retrofit retrofit = new Retrofit.Builder()
+ .client(okHttp)
+ .addConverterFactory(JacksonConverterFactory.create())
+ .baseUrl("http://ws.audioscrobbler.com/")
+ .build();
+
+ private static LastFmService lastFm = retrofit.create(LastFmService.class);
+
+ private static ObjectMapper mapper = new ObjectMapper();
+
+ public static void main(String[] args) throws IOException {
+ List artists = getTop100Artists();
+ Set tags = getTop100Tags();
+ List records = datasetWithTaggedArtists(artists, tags);
+
+ Map> clusters = KMeans.fit(records, 7, new EuclideanDistance(), 1000);
+ // Print the cluster configuration
+ clusters.forEach((key, value) -> {
+ System.out.println("------------------------------ CLUSTER -----------------------------------");
+
+ System.out.println(sortedCentroid(key));
+ String members = String.join(", ", value
+ .stream()
+ .map(Record::getDescription)
+ .collect(toSet()));
+ System.out.print(members);
+
+ System.out.println();
+ System.out.println();
+ });
+
+ Map json = convertToD3CompatibleMap(clusters);
+ System.out.println(mapper.writeValueAsString(json));
+ }
+
+ private static Map convertToD3CompatibleMap(Map> clusters) {
+ Map json = new HashMap<>();
+ json.put("name", "Musicians");
+ List> children = new ArrayList<>();
+ clusters.forEach((key, value) -> {
+ Map child = new HashMap<>();
+ child.put("name", dominantGenre(sortedCentroid(key)));
+ List> nested = new ArrayList<>();
+ for (Record record : value) {
+ nested.add(Collections.singletonMap("name", record.getDescription()));
+ }
+ child.put("children", nested);
+
+ children.add(child);
+ });
+ json.put("children", children);
+ return json;
+ }
+
+ private static String dominantGenre(Centroid centroid) {
+ return centroid
+ .getCoordinates()
+ .keySet()
+ .stream()
+ .limit(2)
+ .collect(Collectors.joining(", "));
+ }
+
+ private static Centroid sortedCentroid(Centroid key) {
+ List> entries = new ArrayList<>(key
+ .getCoordinates()
+ .entrySet());
+ entries.sort((e1, e2) -> e2
+ .getValue()
+ .compareTo(e1.getValue()));
+
+ Map sorted = new LinkedHashMap<>();
+ for (Map.Entry entry : entries) {
+ sorted.put(entry.getKey(), entry.getValue());
+ }
+
+ return new Centroid(sorted);
+ }
+
+ private static List datasetWithTaggedArtists(List artists, Set topTags) throws IOException {
+ List records = new ArrayList<>();
+ for (String artist : artists) {
+ Map tags = lastFm
+ .topTagsFor(artist)
+ .execute()
+ .body()
+ .all();
+
+ // Only keep popular tags.
+ tags
+ .entrySet()
+ .removeIf(e -> !topTags.contains(e.getKey()));
+
+ records.add(new Record(artist, tags));
+ }
+ return records;
+ }
+
+ private static Set getTop100Tags() throws IOException {
+ return lastFm
+ .topTags()
+ .execute()
+ .body()
+ .all();
+ }
+
+ private static List getTop100Artists() throws IOException {
+ List artists = new ArrayList<>();
+ for (int i = 1; i <= 2; i++) {
+ artists.addAll(lastFm
+ .topArtists(i)
+ .execute()
+ .body()
+ .all());
+ }
+
+ return artists;
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java
new file mode 100644
index 0000000000..db57deb888
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/LastFmService.java
@@ -0,0 +1,118 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import okhttp3.HttpUrl;
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Query;
+
+import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
+import static java.util.stream.Collectors.toList;
+
+public interface LastFmService {
+
+ @GET("/2.0/?method=chart.gettopartists&format=json&limit=50")
+ Call topArtists(@Query("page") int page);
+
+ @GET("/2.0/?method=artist.gettoptags&format=json&limit=20&autocorrect=1")
+ Call topTagsFor(@Query("artist") String artist);
+
+ @GET("/2.0/?method=chart.gettoptags&format=json&limit=100")
+ Call topTags();
+
+ /**
+ * HTTP interceptor to intercept all HTTP requests and add the API key to them.
+ */
+ class Authenticator implements Interceptor {
+
+ private final String apiKey;
+
+ Authenticator(String apiKey) {
+ this.apiKey = apiKey;
+ }
+
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ HttpUrl url = chain
+ .request()
+ .url()
+ .newBuilder()
+ .addQueryParameter("api_key", apiKey)
+ .build();
+ Request request = chain
+ .request()
+ .newBuilder()
+ .url(url)
+ .build();
+
+ return chain.proceed(request);
+ }
+ }
+
+ @JsonAutoDetect(fieldVisibility = ANY)
+ class TopTags {
+
+ private Map tags;
+
+ @SuppressWarnings("unchecked")
+ public Set all() {
+ List> topTags = (List>) tags.get("tag");
+ return topTags
+ .stream()
+ .map(e -> ((String) e.get("name")))
+ .collect(Collectors.toSet());
+ }
+ }
+
+ @JsonAutoDetect(fieldVisibility = ANY)
+ class Tags {
+
+ @JsonProperty("toptags") private Map topTags;
+
+ @SuppressWarnings("unchecked")
+ public Map all() {
+ try {
+ Map all = new HashMap<>();
+ List> tags = (List>) topTags.get("tag");
+ for (Map tag : tags) {
+ all.put(((String) tag.get("name")), ((Integer) tag.get("count")).doubleValue());
+ }
+
+ return all;
+ } catch (Exception e) {
+ return Collections.emptyMap();
+ }
+ }
+ }
+
+ @JsonAutoDetect(fieldVisibility = ANY)
+ class Artists {
+
+ private Map artists;
+
+ @SuppressWarnings("unchecked")
+ public List all() {
+ try {
+ List> artists = (List>) this.artists.get("artist");
+ return artists
+ .stream()
+ .map(e -> ((String) e.get("name")))
+ .collect(toList());
+ } catch (Exception e) {
+ return Collections.emptyList();
+ }
+ }
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java
new file mode 100644
index 0000000000..d2a7b61c62
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/kmeans/Record.java
@@ -0,0 +1,65 @@
+package com.baeldung.algorithms.kmeans;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Encapsulates all feature values for a few attributes. Optionally each record
+ * can be described with the {@link #description} field.
+ */
+public class Record {
+
+ /**
+ * The record description. For example, this can be the artist name for the famous musician
+ * example.
+ */
+ private final String description;
+
+ /**
+ * Encapsulates all attributes and their corresponding values, i.e. features.
+ */
+ private final Map features;
+
+ public Record(String description, Map features) {
+ this.description = description;
+ this.features = features;
+ }
+
+ public Record(Map features) {
+ this("", features);
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public Map getFeatures() {
+ return features;
+ }
+
+ @Override
+ public String toString() {
+ String prefix = description == null || description
+ .trim()
+ .isEmpty() ? "Record" : description;
+
+ return prefix + ": " + features;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Record record = (Record) o;
+ return Objects.equals(getDescription(), record.getDescription()) && Objects.equals(getFeatures(), record.getFeatures());
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getDescription(), getFeatures());
+ }
+}
diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
new file mode 100644
index 0000000000..156766f382
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamples.java
@@ -0,0 +1,61 @@
+package com.baeldung.algorithms.printtriangles;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class PrintTriangleExamples {
+
+ public static String printARightTriangle(int N) {
+ StringBuilder result = new StringBuilder();
+ for (int r = 1; r <= N; r++) {
+ for (int j = 1; j <= r; j++) {
+ result.append("*");
+ }
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static String printAnIsoscelesTriangle(int N) {
+ StringBuilder result = new StringBuilder();
+ for (int r = 1; r <= N; r++) {
+ for (int sp = 1; sp <= N - r; sp++) {
+ result.append(" ");
+ }
+ for (int c = 1; c <= (r * 2) - 1; c++) {
+ result.append("*");
+ }
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static String printAnIsoscelesTriangleUsingStringUtils(int N) {
+ StringBuilder result = new StringBuilder();
+
+ for (int r = 1; r <= N; r++) {
+ result.append(StringUtils.repeat(' ', N - r));
+ result.append(StringUtils.repeat('*', 2 * r - 1));
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static String printAnIsoscelesTriangleUsingSubstring(int N) {
+ StringBuilder result = new StringBuilder();
+ String helperString = StringUtils.repeat(' ', N - 1) + StringUtils.repeat('*', N * 2 - 1);
+
+ for (int r = 0; r < N; r++) {
+ result.append(helperString.substring(r, N + 2 * r));
+ result.append(System.lineSeparator());
+ }
+ return result.toString();
+ }
+
+ public static void main(String[] args) {
+ System.out.println(printARightTriangle(5));
+ System.out.println(printAnIsoscelesTriangle(5));
+ System.out.println(printAnIsoscelesTriangleUsingStringUtils(5));
+ System.out.println(printAnIsoscelesTriangleUsingSubstring(5));
+ }
+
+}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json b/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json
new file mode 100644
index 0000000000..6cee0d1de2
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/resources/kmeans/artists.json
@@ -0,0 +1,3384 @@
+[
+ {
+ "description": "Billie Eilish",
+ "features": {
+ "singer-songwriter": 3.0,
+ "american": 23.0,
+ "british": 3.0,
+ "experimental": 3.0,
+ "rnb": 3.0,
+ "female vocalists": 49.0,
+ "indie": 58.0,
+ "chillout": 12.0,
+ "ambient": 3.0,
+ "pop": 100.0,
+ "synthpop": 3.0,
+ "electronic": 58.0,
+ "indie pop": 83.0,
+ "seen live": 18.0,
+ "alternative": 40.0,
+ "female vocalist": 9.0
+ }
+ },
+ {
+ "description": "Ed Sheeran",
+ "features": {
+ "indie": 12.0,
+ "singer-songwriter": 78.0,
+ "male vocalists": 13.0,
+ "soul": 3.0,
+ "chillout": 2.0,
+ "Mellow": 2.0,
+ "british": 82.0,
+ "pop": 23.0,
+ "rock": 4.0,
+ "rap": 2.0,
+ "indie pop": 3.0,
+ "seen live": 21.0,
+ "Hip-Hop": 4.0,
+ "acoustic": 100.0,
+ "alternative": 8.0,
+ "guitar": 2.0,
+ "00s": 2.0,
+ "Soundtrack": 1.0,
+ "Love": 2.0,
+ "folk": 12.0
+ }
+ },
+ {
+ "description": "Lil Nas X",
+ "features": {
+ "country": 54.0,
+ "male vocalists": 8.0,
+ "american": 24.0,
+ "rock": 16.0,
+ "pop": 8.0,
+ "hip hop": 47.0,
+ "rap": 62.0,
+ "Hip-Hop": 100.0,
+ "alternative": 24.0
+ }
+ },
+ {
+ "description": "Queen",
+ "features": {
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "british": 17.0,
+ "classic rock": 100.0,
+ "rock": 81.0,
+ "pop": 7.0,
+ "heavy metal": 2.0,
+ "oldies": 2.0,
+ "seen live": 2.0,
+ "alternative": 4.0,
+ "metal": 2.0,
+ "Progressive rock": 6.0,
+ "alternative rock": 1.0,
+ "hard rock": 38.0,
+ "70s": 8.0,
+ "80s": 41.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Ariana Grande",
+ "features": {
+ "american": 13.0,
+ "beautiful": 2.0,
+ "dance": 11.0,
+ "House": 2.0,
+ "Soundtrack": 3.0,
+ "chillout": 3.0,
+ "pop": 100.0,
+ "rock": 2.0,
+ "electronic": 3.0,
+ "seen live": 3.0,
+ "female vocalist": 3.0,
+ "singer-songwriter": 5.0,
+ "rnb": 51.0,
+ "female vocalists": 54.0,
+ "soul": 10.0,
+ "synthpop": 2.0,
+ "hip hop": 3.0,
+ "Hip-Hop": 3.0
+ }
+ },
+ {
+ "description": "Post Malone",
+ "features": {
+ "american": 8.0,
+ "rap": 72.0,
+ "rnb": 14.0,
+ "pop": 8.0,
+ "synthpop": 3.0,
+ "hip hop": 35.0,
+ "seen live": 19.0,
+ "Hip-Hop": 100.0
+ }
+ },
+ {
+ "description": "Drake",
+ "features": {
+ "indie": 4.0,
+ "male vocalists": 5.0,
+ "soul": 2.0,
+ "pop": 6.0,
+ "hip hop": 37.0,
+ "rap": 72.0,
+ "seen live": 8.0,
+ "Hip-Hop": 100.0,
+ "rnb": 50.0,
+ "00s": 1.0
+ }
+ },
+ {
+ "description": "Kanye West",
+ "features": {
+ "indie": 2.0,
+ "male vocalists": 3.0,
+ "soul": 4.0,
+ "american": 6.0,
+ "experimental": 2.0,
+ "pop": 6.0,
+ "rock": 2.0,
+ "electronica": 1.0,
+ "hip hop": 40.0,
+ "electronic": 3.0,
+ "dance": 2.0,
+ "rap": 69.0,
+ "seen live": 22.0,
+ "Hip-Hop": 100.0,
+ "rnb": 31.0,
+ "alternative": 3.0,
+ "00s": 3.0
+ }
+ },
+ {
+ "description": "The Beatles",
+ "features": {
+ "indie": 3.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "singer-songwriter": 2.0,
+ "Psychedelic Rock": 6.0,
+ "british": 58.0,
+ "experimental": 2.0,
+ "classic rock": 100.0,
+ "rock": 71.0,
+ "pop": 41.0,
+ "psychedelic": 13.0,
+ "indie rock": 2.0,
+ "oldies": 10.0,
+ "britpop": 4.0,
+ "alternative": 4.0,
+ "Progressive rock": 2.0,
+ "alternative rock": 1.0,
+ "Love": 2.0,
+ "folk": 1.0,
+ "60s": 56.0,
+ "70s": 3.0
+ }
+ },
+ {
+ "description": "Taylor Swift",
+ "features": {
+ "country": 100.0,
+ "singer-songwriter": 42.0,
+ "chillout": 2.0,
+ "american": 8.0,
+ "pop": 71.0,
+ "rock": 2.0,
+ "beautiful": 2.0,
+ "synthpop": 2.0,
+ "seen live": 4.0,
+ "acoustic": 31.0,
+ "female vocalist": 3.0,
+ "00s": 3.0,
+ "female vocalists": 60.0,
+ "Love": 3.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "Radiohead",
+ "features": {
+ "indie": 59.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "chillout": 2.0,
+ "british": 22.0,
+ "experimental": 14.0,
+ "ambient": 2.0,
+ "classic rock": 1.0,
+ "rock": 73.0,
+ "electronica": 5.0,
+ "psychedelic": 3.0,
+ "pop": 2.0,
+ "beautiful": 1.0,
+ "post-rock": 3.0,
+ "indie rock": 15.0,
+ "electronic": 48.0,
+ "trip-hop": 1.0,
+ "britpop": 17.0,
+ "indie pop": 1.0,
+ "seen live": 27.0,
+ "alternative": 100.0,
+ "Progressive rock": 6.0,
+ "alternative rock": 81.0,
+ "00s": 2.0,
+ "idm": 1.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Beyoncé",
+ "features": {
+ "singer-songwriter": 3.0,
+ "jazz": 2.0,
+ "american": 9.0,
+ "beautiful": 2.0,
+ "dance": 13.0,
+ "rap": 2.0,
+ "rnb": 100.0,
+ "female vocalists": 70.0,
+ "Love": 3.0,
+ "soul": 56.0,
+ "pop": 91.0,
+ "hip hop": 5.0,
+ "electronic": 2.0,
+ "seen live": 6.0,
+ "Hip-Hop": 45.0,
+ "alternative": 1.0,
+ "female vocalist": 4.0,
+ "00s": 3.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Shawn Mendes",
+ "features": {
+ "male vocalists": 28.0,
+ "singer-songwriter": 13.0,
+ "british": 7.0,
+ "rnb": 7.0,
+ "acoustic": 37.0,
+ "metal": 4.0,
+ "folk": 37.0,
+ "indie": 10.0,
+ "soul": 4.0,
+ "pop": 100.0,
+ "seen live": 13.0,
+ "alternative": 4.0,
+ "alternative rock": 4.0
+ }
+ },
+ {
+ "description": "David Bowie",
+ "features": {
+ "singer-songwriter": 11.0,
+ "male vocalists": 4.0,
+ "Psychedelic Rock": 2.0,
+ "british": 23.0,
+ "experimental": 9.0,
+ "classic rock": 86.0,
+ "psychedelic": 3.0,
+ "electronica": 2.0,
+ "indie rock": 2.0,
+ "dance": 2.0,
+ "post-punk": 2.0,
+ "punk": 2.0,
+ "hard rock": 3.0,
+ "folk": 2.0,
+ "70s": 15.0,
+ "90s": 4.0,
+ "indie": 6.0,
+ "favorites": 2.0,
+ "soul": 2.0,
+ "ambient": 2.0,
+ "rock": 100.0,
+ "pop": 19.0,
+ "new wave": 7.0,
+ "electronic": 4.0,
+ "oldies": 2.0,
+ "britpop": 2.0,
+ "seen live": 11.0,
+ "alternative": 43.0,
+ "Progressive rock": 4.0,
+ "alternative rock": 6.0,
+ "industrial": 2.0,
+ "00s": 2.0,
+ "60s": 3.0,
+ "80s": 48.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Kendrick Lamar",
+ "features": {
+ "male vocalists": 2.0,
+ "american": 7.0,
+ "hip hop": 17.0,
+ "rap": 70.0,
+ "seen live": 38.0,
+ "Hip-Hop": 100.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Rihanna",
+ "features": {
+ "american": 4.0,
+ "beautiful": 2.0,
+ "dance": 56.0,
+ "rap": 2.0,
+ "rnb": 89.0,
+ "House": 1.0,
+ "female vocalists": 63.0,
+ "Love": 2.0,
+ "soul": 4.0,
+ "pop": 100.0,
+ "rock": 2.0,
+ "hip hop": 6.0,
+ "electronic": 3.0,
+ "seen live": 7.0,
+ "Hip-Hop": 41.0,
+ "alternative": 1.0,
+ "female vocalist": 4.0,
+ "00s": 3.0,
+ "reggae": 6.0
+ }
+ },
+ {
+ "description": "Arctic Monkeys",
+ "features": {
+ "indie": 98.0,
+ "male vocalists": 2.0,
+ "Psychedelic Rock": 1.0,
+ "british": 75.0,
+ "rock": 63.0,
+ "pop": 2.0,
+ "punk rock": 1.0,
+ "indie rock": 100.0,
+ "britpop": 16.0,
+ "indie pop": 2.0,
+ "seen live": 45.0,
+ "alternative": 60.0,
+ "post-punk": 3.0,
+ "alternative rock": 19.0,
+ "00s": 3.0,
+ "punk": 2.0
+ }
+ },
+ {
+ "description": "Tyler, the Creator",
+ "features": {
+ "experimental": 4.0,
+ "american": 4.0,
+ "hip hop": 12.0,
+ "rap": 55.0,
+ "seen live": 15.0,
+ "Hip-Hop": 100.0,
+ "alternative": 2.0
+ }
+ },
+ {
+ "description": "Lana Del Rey",
+ "features": {
+ "singer-songwriter": 10.0,
+ "jazz": 2.0,
+ "american": 14.0,
+ "beautiful": 2.0,
+ "indie rock": 2.0,
+ "female vocalists": 100.0,
+ "folk": 2.0,
+ "indie": 93.0,
+ "soul": 3.0,
+ "chillout": 3.0,
+ "blues": 2.0,
+ "pop": 80.0,
+ "rock": 2.0,
+ "electronic": 2.0,
+ "trip-hop": 10.0,
+ "indie pop": 88.0,
+ "seen live": 12.0,
+ "alternative": 67.0,
+ "female vocalist": 4.0,
+ "alternative rock": 2.0
+ }
+ },
+ {
+ "description": "Katy Perry",
+ "features": {
+ "indie": 25.0,
+ "singer-songwriter": 4.0,
+ "american": 9.0,
+ "pop": 100.0,
+ "rock": 24.0,
+ "beautiful": 2.0,
+ "indie rock": 1.0,
+ "electronic": 4.0,
+ "dance": 9.0,
+ "indie pop": 1.0,
+ "seen live": 7.0,
+ "rnb": 1.0,
+ "alternative": 3.0,
+ "female vocalist": 5.0,
+ "00s": 3.0,
+ "female vocalists": 62.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Lady Gaga",
+ "features": {
+ "singer-songwriter": 4.0,
+ "american": 7.0,
+ "pop": 100.0,
+ "electronica": 3.0,
+ "rock": 2.0,
+ "electro": 2.0,
+ "synthpop": 2.0,
+ "electronic": 53.0,
+ "dance": 73.0,
+ "seen live": 8.0,
+ "techno": 1.0,
+ "rnb": 1.0,
+ "alternative": 1.0,
+ "female vocalist": 21.0,
+ "00s": 3.0,
+ "female vocalists": 43.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Tame Impala",
+ "features": {
+ "indie": 21.0,
+ "male vocalists": 1.0,
+ "Psychedelic Rock": 100.0,
+ "experimental": 4.0,
+ "psychedelic": 92.0,
+ "rock": 41.0,
+ "indie rock": 60.0,
+ "electronic": 3.0,
+ "indie pop": 2.0,
+ "seen live": 53.0,
+ "alternative": 7.0,
+ "Progressive rock": 3.0,
+ "alternative rock": 3.0,
+ "00s": 3.0
+ }
+ },
+ {
+ "description": "Calvin Harris",
+ "features": {
+ "indie": 8.0,
+ "male vocalists": 3.0,
+ "singer-songwriter": 1.0,
+ "british": 15.0,
+ "electronica": 34.0,
+ "pop": 8.0,
+ "electro": 53.0,
+ "synthpop": 4.0,
+ "electronic": 100.0,
+ "dance": 75.0,
+ "indie pop": 2.0,
+ "seen live": 36.0,
+ "techno": 1.0,
+ "alternative": 1.0,
+ "House": 9.0,
+ "00s": 3.0,
+ "80s": 1.0
+ }
+ },
+ {
+ "description": "Red Hot Chili Peppers",
+ "features": {
+ "indie": 5.0,
+ "favorites": 1.0,
+ "male vocalists": 1.0,
+ "american": 5.0,
+ "classic rock": 3.0,
+ "rock": 100.0,
+ "pop": 2.0,
+ "punk rock": 2.0,
+ "indie rock": 2.0,
+ "seen live": 23.0,
+ "Grunge": 2.0,
+ "alternative": 54.0,
+ "metal": 2.0,
+ "alternative rock": 59.0,
+ "00s": 2.0,
+ "punk": 6.0,
+ "hard rock": 2.0,
+ "80s": 2.0,
+ "funk": 50.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Coldplay",
+ "features": {
+ "indie": 55.0,
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "singer-songwriter": 2.0,
+ "emo": 2.0,
+ "Mellow": 3.0,
+ "chillout": 3.0,
+ "british": 28.0,
+ "classic rock": 2.0,
+ "rock": 100.0,
+ "pop": 18.0,
+ "piano": 3.0,
+ "indie rock": 11.0,
+ "electronic": 2.0,
+ "britpop": 81.0,
+ "indie pop": 2.0,
+ "seen live": 22.0,
+ "alternative": 87.0,
+ "acoustic": 2.0,
+ "alternative rock": 68.0,
+ "00s": 2.0,
+ "Love": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Miley Cyrus",
+ "features": {
+ "country": 3.0,
+ "singer-songwriter": 1.0,
+ "american": 12.0,
+ "beautiful": 2.0,
+ "grindcore": 1.0,
+ "dance": 42.0,
+ "rnb": 4.0,
+ "Soundtrack": 2.0,
+ "female vocalists": 55.0,
+ "Love": 2.0,
+ "death metal": 2.0,
+ "pop": 100.0,
+ "rock": 8.0,
+ "electronic": 5.0,
+ "seen live": 3.0,
+ "Hip-Hop": 4.0,
+ "alternative": 2.0,
+ "female vocalist": 4.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "Mark Ronson",
+ "features": {
+ "singer-songwriter": 1.0,
+ "jazz": 7.0,
+ "british": 68.0,
+ "experimental": 2.0,
+ "american": 1.0,
+ "cover": 4.0,
+ "electronica": 2.0,
+ "dance": 5.0,
+ "rap": 4.0,
+ "rnb": 2.0,
+ "House": 1.0,
+ "indie": 3.0,
+ "soul": 17.0,
+ "chillout": 2.0,
+ "pop": 68.0,
+ "rock": 3.0,
+ "electro": 2.0,
+ "hip hop": 11.0,
+ "electronic": 9.0,
+ "trip-hop": 1.0,
+ "britpop": 4.0,
+ "seen live": 31.0,
+ "Hip-Hop": 57.0,
+ "alternative": 9.0,
+ "00s": 7.0,
+ "funk": 100.0
+ }
+ },
+ {
+ "description": "Imagine Dragons",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 6.0,
+ "american": 12.0,
+ "rock": 64.0,
+ "pop": 10.0,
+ "indie rock": 96.0,
+ "electronic": 4.0,
+ "new wave": 2.0,
+ "indie pop": 57.0,
+ "seen live": 29.0,
+ "alternative": 86.0,
+ "alternative rock": 21.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "The Weeknd",
+ "features": {
+ "indie": 6.0,
+ "male vocalists": 5.0,
+ "soul": 9.0,
+ "chillout": 2.0,
+ "Mellow": 2.0,
+ "experimental": 6.0,
+ "ambient": 3.0,
+ "pop": 10.0,
+ "electronica": 5.0,
+ "electro": 1.0,
+ "downtempo": 7.0,
+ "hip hop": 2.0,
+ "electronic": 78.0,
+ "trip-hop": 3.0,
+ "rap": 2.0,
+ "indie pop": 2.0,
+ "seen live": 16.0,
+ "Hip-Hop": 8.0,
+ "rnb": 100.0,
+ "alternative": 5.0
+ }
+ },
+ {
+ "description": "Eminem",
+ "features": {
+ "male vocalists": 3.0,
+ "singer-songwriter": 2.0,
+ "emo": 1.0,
+ "american": 6.0,
+ "pop": 16.0,
+ "rock": 3.0,
+ "hip hop": 33.0,
+ "dance": 1.0,
+ "rap": 100.0,
+ "seen live": 4.0,
+ "Hip-Hop": 79.0,
+ "alternative": 3.0,
+ "00s": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Nirvana",
+ "features": {
+ "indie": 4.0,
+ "favorites": 1.0,
+ "male vocalists": 2.0,
+ "Grunge": 100.0,
+ "alternative": 35.0,
+ "metal": 3.0,
+ "american": 4.0,
+ "classic rock": 2.0,
+ "rock": 52.0,
+ "alternative rock": 34.0,
+ "punk rock": 3.0,
+ "punk": 7.0,
+ "indie rock": 2.0,
+ "hard rock": 3.0,
+ "90s": 28.0
+ }
+ },
+ {
+ "description": "Fleetwood Mac",
+ "features": {
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "singer-songwriter": 2.0,
+ "british": 10.0,
+ "american": 3.0,
+ "classic rock": 100.0,
+ "blues": 41.0,
+ "rock": 67.0,
+ "pop": 33.0,
+ "oldies": 3.0,
+ "seen live": 7.0,
+ "alternative": 1.0,
+ "acoustic": 1.0,
+ "female vocalist": 2.0,
+ "guitar": 1.0,
+ "Progressive rock": 2.0,
+ "female vocalists": 10.0,
+ "folk": 2.0,
+ "60s": 5.0,
+ "70s": 48.0,
+ "80s": 12.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Childish Gambino",
+ "features": {
+ "indie": 35.0,
+ "male vocalists": 1.0,
+ "soul": 5.0,
+ "american": 8.0,
+ "experimental": 3.0,
+ "pop": 3.0,
+ "psychedelic": 2.0,
+ "hip hop": 31.0,
+ "electronic": 2.0,
+ "dance": 1.0,
+ "rap": 70.0,
+ "seen live": 37.0,
+ "Hip-Hop": 100.0,
+ "rnb": 6.0,
+ "alternative": 4.0,
+ "funk": 8.0
+ }
+ },
+ {
+ "description": "Pink Floyd",
+ "features": {
+ "favorites": 1.0,
+ "indie": 1.0,
+ "Psychedelic Rock": 72.0,
+ "british": 13.0,
+ "experimental": 6.0,
+ "ambient": 1.0,
+ "classic rock": 79.0,
+ "rock": 53.0,
+ "psychedelic": 44.0,
+ "oldies": 1.0,
+ "seen live": 3.0,
+ "alternative": 6.0,
+ "Progressive rock": 100.0,
+ "alternative rock": 2.0,
+ "hard rock": 2.0,
+ "60s": 5.0,
+ "70s": 8.0,
+ "80s": 3.0
+ }
+ },
+ {
+ "description": "The Killers",
+ "features": {
+ "indie": 100.0,
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "emo": 2.0,
+ "american": 9.0,
+ "british": 2.0,
+ "classic rock": 1.0,
+ "rock": 93.0,
+ "pop": 10.0,
+ "electronica": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 90.0,
+ "new wave": 4.0,
+ "electronic": 3.0,
+ "dance": 1.0,
+ "britpop": 4.0,
+ "indie pop": 4.0,
+ "seen live": 39.0,
+ "alternative": 75.0,
+ "post-punk": 3.0,
+ "alternative rock": 64.0,
+ "00s": 3.0,
+ "punk": 4.0
+ }
+ },
+ {
+ "description": "The Rolling Stones",
+ "features": {
+ "indie": 2.0,
+ "male vocalists": 1.0,
+ "Psychedelic Rock": 2.0,
+ "british": 43.0,
+ "classic rock": 100.0,
+ "blues": 31.0,
+ "rock": 80.0,
+ "psychedelic": 3.0,
+ "pop": 2.0,
+ "oldies": 3.0,
+ "seen live": 14.0,
+ "alternative": 4.0,
+ "guitar": 1.0,
+ "hard rock": 8.0,
+ "60s": 41.0,
+ "70s": 8.0,
+ "80s": 4.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Gorillaz",
+ "features": {
+ "indie": 46.0,
+ "favorites": 1.0,
+ "chillout": 3.0,
+ "british": 12.0,
+ "experimental": 6.0,
+ "rock": 58.0,
+ "electronica": 13.0,
+ "pop": 13.0,
+ "electro": 2.0,
+ "downtempo": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 4.0,
+ "hip hop": 7.0,
+ "electronic": 88.0,
+ "trip-hop": 20.0,
+ "dance": 4.0,
+ "britpop": 4.0,
+ "rap": 4.0,
+ "indie pop": 2.0,
+ "seen live": 5.0,
+ "Hip-Hop": 63.0,
+ "alternative": 100.0,
+ "metal": 2.0,
+ "alternative rock": 11.0,
+ "00s": 3.0,
+ "punk": 2.0,
+ "funk": 3.0
+ }
+ },
+ {
+ "description": "Frank Ocean",
+ "features": {
+ "indie": 3.0,
+ "male vocalists": 6.0,
+ "singer-songwriter": 4.0,
+ "soul": 93.0,
+ "american": 8.0,
+ "experimental": 2.0,
+ "pop": 6.0,
+ "electronica": 1.0,
+ "hip hop": 8.0,
+ "electronic": 3.0,
+ "rap": 4.0,
+ "seen live": 14.0,
+ "Hip-Hop": 82.0,
+ "rnb": 100.0,
+ "alternative": 3.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Panic! at the Disco",
+ "features": {
+ "male vocalists": 3.0,
+ "american": 8.0,
+ "electronica": 2.0,
+ "punk rock": 6.0,
+ "indie rock": 21.0,
+ "dance": 20.0,
+ "metal": 2.0,
+ "screamo": 2.0,
+ "punk": 21.0,
+ "Love": 2.0,
+ "indie": 68.0,
+ "favorites": 4.0,
+ "emo": 97.0,
+ "rock": 100.0,
+ "pop": 9.0,
+ "electronic": 4.0,
+ "indie pop": 2.0,
+ "seen live": 51.0,
+ "hardcore": 2.0,
+ "techno": 1.0,
+ "alternative": 99.0,
+ "alternative rock": 21.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "The Cure",
+ "features": {
+ "indie": 14.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "british": 16.0,
+ "classic rock": 3.0,
+ "rock": 52.0,
+ "pop": 6.0,
+ "psychedelic": 1.0,
+ "synthpop": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 3.0,
+ "new wave": 100.0,
+ "electronic": 2.0,
+ "britpop": 2.0,
+ "indie pop": 1.0,
+ "seen live": 24.0,
+ "alternative": 68.0,
+ "Gothic": 10.0,
+ "post-punk": 100.0,
+ "alternative rock": 23.0,
+ "punk": 4.0,
+ "Love": 2.0,
+ "70s": 2.0,
+ "80s": 65.0,
+ "90s": 3.0
+ }
+ },
+ {
+ "description": "Madonna",
+ "features": {
+ "singer-songwriter": 3.0,
+ "american": 8.0,
+ "pop": 100.0,
+ "rock": 5.0,
+ "electronica": 3.0,
+ "electronic": 29.0,
+ "dance": 50.0,
+ "seen live": 9.0,
+ "rnb": 1.0,
+ "alternative": 2.0,
+ "female vocalist": 4.0,
+ "00s": 4.0,
+ "female vocalists": 50.0,
+ "Love": 1.0,
+ "80s": 35.0,
+ "90s": 8.0
+ }
+ },
+ {
+ "description": "The Chainsmokers",
+ "features": {
+ "male vocalists": 6.0,
+ "american": 28.0,
+ "electronica": 3.0,
+ "dance": 33.0,
+ "House": 63.0,
+ "pop": 79.0,
+ "electro": 6.0,
+ "electronic": 100.0,
+ "seen live": 17.0,
+ "techno": 3.0,
+ "alternative": 3.0
+ }
+ },
+ {
+ "description": "Linkin Park",
+ "features": {
+ "favorites": 2.0,
+ "indie": 1.0,
+ "male vocalists": 3.0,
+ "emo": 3.0,
+ "american": 6.0,
+ "rock": 100.0,
+ "pop": 3.0,
+ "punk rock": 2.0,
+ "electronic": 4.0,
+ "rap": 3.0,
+ "seen live": 21.0,
+ "Hip-Hop": 2.0,
+ "alternative": 67.0,
+ "metal": 37.0,
+ "Nu Metal": 92.0,
+ "alternative rock": 74.0,
+ "00s": 2.0,
+ "punk": 4.0,
+ "hard rock": 5.0
+ }
+ },
+ {
+ "description": "Lorde",
+ "features": {
+ "indie": 72.0,
+ "singer-songwriter": 7.0,
+ "soul": 1.0,
+ "experimental": 2.0,
+ "pop": 100.0,
+ "electronica": 5.0,
+ "rock": 1.0,
+ "synthpop": 7.0,
+ "electronic": 81.0,
+ "trip-hop": 2.0,
+ "indie pop": 92.0,
+ "seen live": 20.0,
+ "alternative": 17.0,
+ "female vocalist": 4.0,
+ "female vocalists": 28.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "The Black Keys",
+ "features": {
+ "indie": 50.0,
+ "male vocalists": 2.0,
+ "soul": 2.0,
+ "Psychedelic Rock": 2.0,
+ "american": 8.0,
+ "blues": 68.0,
+ "classic rock": 2.0,
+ "rock": 63.0,
+ "psychedelic": 2.0,
+ "indie rock": 48.0,
+ "seen live": 37.0,
+ "alternative": 11.0,
+ "alternative rock": 7.0,
+ "00s": 3.0,
+ "hard rock": 2.0
+ }
+ },
+ {
+ "description": "Daft Punk",
+ "features": {
+ "indie": 2.0,
+ "chillout": 2.0,
+ "experimental": 2.0,
+ "electronica": 37.0,
+ "rock": 3.0,
+ "pop": 2.0,
+ "electro": 11.0,
+ "synthpop": 1.0,
+ "electronic": 100.0,
+ "dance": 54.0,
+ "french": 19.0,
+ "seen live": 7.0,
+ "techno": 36.0,
+ "alternative": 6.0,
+ "House": 54.0,
+ "trance": 2.0,
+ "00s": 2.0,
+ "Soundtrack": 2.0,
+ "funk": 4.0,
+ "90s": 3.0
+ }
+ },
+ {
+ "description": "Led Zeppelin",
+ "features": {
+ "favorites": 1.0,
+ "indie": 1.0,
+ "Psychedelic Rock": 3.0,
+ "british": 9.0,
+ "classic rock": 100.0,
+ "blues": 9.0,
+ "rock": 64.0,
+ "psychedelic": 4.0,
+ "heavy metal": 8.0,
+ "oldies": 1.0,
+ "metal": 4.0,
+ "alternative": 4.0,
+ "guitar": 2.0,
+ "Progressive rock": 33.0,
+ "alternative rock": 1.0,
+ "hard rock": 63.0,
+ "folk": 1.0,
+ "60s": 3.0,
+ "70s": 36.0,
+ "80s": 1.0
+ }
+ },
+ {
+ "description": "Marshmello",
+ "features": {
+ "emo": 10.0,
+ "pop": 28.0,
+ "electronic": 91.0,
+ "dance": 100.0,
+ "rap": 28.0,
+ "seen live": 19.0,
+ "rnb": 19.0,
+ "House": 10.0
+ }
+ },
+ {
+ "description": "Khalid",
+ "features": {
+ "indie": 7.0,
+ "male vocalists": 7.0,
+ "soul": 88.0,
+ "american": 19.0,
+ "pop": 100.0,
+ "synthpop": 7.0,
+ "electronic": 13.0,
+ "seen live": 25.0,
+ "rnb": 75.0,
+ "alternative": 63.0,
+ "folk": 7.0
+ }
+ },
+ {
+ "description": "David Guetta",
+ "features": {
+ "chillout": 1.0,
+ "electronica": 7.0,
+ "pop": 6.0,
+ "electro": 6.0,
+ "electronic": 76.0,
+ "dance": 82.0,
+ "french": 11.0,
+ "seen live": 9.0,
+ "techno": 39.0,
+ "House": 100.0,
+ "trance": 4.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "Billie Eilish",
+ "features": {
+ "singer-songwriter": 3.0,
+ "american": 23.0,
+ "british": 3.0,
+ "experimental": 3.0,
+ "rnb": 3.0,
+ "female vocalists": 49.0,
+ "indie": 58.0,
+ "chillout": 12.0,
+ "ambient": 3.0,
+ "pop": 100.0,
+ "synthpop": 3.0,
+ "electronic": 58.0,
+ "indie pop": 83.0,
+ "seen live": 18.0,
+ "alternative": 40.0,
+ "female vocalist": 9.0
+ }
+ },
+ {
+ "description": "Ed Sheeran",
+ "features": {
+ "indie": 12.0,
+ "singer-songwriter": 78.0,
+ "male vocalists": 13.0,
+ "soul": 3.0,
+ "chillout": 2.0,
+ "Mellow": 2.0,
+ "british": 82.0,
+ "pop": 23.0,
+ "rock": 4.0,
+ "rap": 2.0,
+ "indie pop": 3.0,
+ "seen live": 21.0,
+ "Hip-Hop": 4.0,
+ "acoustic": 100.0,
+ "alternative": 8.0,
+ "guitar": 2.0,
+ "00s": 2.0,
+ "Soundtrack": 1.0,
+ "Love": 2.0,
+ "folk": 12.0
+ }
+ },
+ {
+ "description": "Lil Nas X",
+ "features": {
+ "country": 54.0,
+ "male vocalists": 8.0,
+ "american": 24.0,
+ "rock": 16.0,
+ "pop": 8.0,
+ "hip hop": 47.0,
+ "rap": 62.0,
+ "Hip-Hop": 100.0,
+ "alternative": 24.0
+ }
+ },
+ {
+ "description": "Queen",
+ "features": {
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "british": 17.0,
+ "classic rock": 100.0,
+ "rock": 81.0,
+ "pop": 7.0,
+ "heavy metal": 2.0,
+ "oldies": 2.0,
+ "seen live": 2.0,
+ "alternative": 4.0,
+ "metal": 2.0,
+ "Progressive rock": 6.0,
+ "alternative rock": 1.0,
+ "hard rock": 38.0,
+ "70s": 8.0,
+ "80s": 41.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Ariana Grande",
+ "features": {
+ "american": 13.0,
+ "beautiful": 2.0,
+ "dance": 11.0,
+ "House": 2.0,
+ "Soundtrack": 3.0,
+ "chillout": 3.0,
+ "pop": 100.0,
+ "rock": 2.0,
+ "electronic": 3.0,
+ "seen live": 3.0,
+ "female vocalist": 3.0,
+ "singer-songwriter": 5.0,
+ "rnb": 51.0,
+ "female vocalists": 54.0,
+ "soul": 10.0,
+ "synthpop": 2.0,
+ "hip hop": 3.0,
+ "Hip-Hop": 3.0
+ }
+ },
+ {
+ "description": "Post Malone",
+ "features": {
+ "american": 8.0,
+ "rap": 72.0,
+ "rnb": 14.0,
+ "pop": 8.0,
+ "synthpop": 3.0,
+ "hip hop": 35.0,
+ "seen live": 19.0,
+ "Hip-Hop": 100.0
+ }
+ },
+ {
+ "description": "Drake",
+ "features": {
+ "indie": 4.0,
+ "male vocalists": 5.0,
+ "soul": 2.0,
+ "pop": 6.0,
+ "hip hop": 37.0,
+ "rap": 72.0,
+ "seen live": 8.0,
+ "Hip-Hop": 100.0,
+ "rnb": 50.0,
+ "00s": 1.0
+ }
+ },
+ {
+ "description": "Kanye West",
+ "features": {
+ "indie": 2.0,
+ "male vocalists": 3.0,
+ "soul": 4.0,
+ "american": 6.0,
+ "experimental": 2.0,
+ "pop": 6.0,
+ "rock": 2.0,
+ "electronica": 1.0,
+ "hip hop": 40.0,
+ "electronic": 3.0,
+ "dance": 2.0,
+ "rap": 69.0,
+ "seen live": 22.0,
+ "Hip-Hop": 100.0,
+ "rnb": 31.0,
+ "alternative": 3.0,
+ "00s": 3.0
+ }
+ },
+ {
+ "description": "The Beatles",
+ "features": {
+ "indie": 3.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "singer-songwriter": 2.0,
+ "Psychedelic Rock": 6.0,
+ "british": 58.0,
+ "experimental": 2.0,
+ "classic rock": 100.0,
+ "rock": 71.0,
+ "pop": 41.0,
+ "psychedelic": 13.0,
+ "indie rock": 2.0,
+ "oldies": 10.0,
+ "britpop": 4.0,
+ "alternative": 4.0,
+ "Progressive rock": 2.0,
+ "alternative rock": 1.0,
+ "Love": 2.0,
+ "folk": 1.0,
+ "60s": 56.0,
+ "70s": 3.0
+ }
+ },
+ {
+ "description": "Taylor Swift",
+ "features": {
+ "country": 100.0,
+ "singer-songwriter": 42.0,
+ "chillout": 2.0,
+ "american": 8.0,
+ "pop": 71.0,
+ "rock": 2.0,
+ "beautiful": 2.0,
+ "synthpop": 2.0,
+ "seen live": 4.0,
+ "acoustic": 31.0,
+ "female vocalist": 3.0,
+ "00s": 3.0,
+ "female vocalists": 60.0,
+ "Love": 3.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "Radiohead",
+ "features": {
+ "indie": 59.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "chillout": 2.0,
+ "british": 22.0,
+ "experimental": 14.0,
+ "ambient": 2.0,
+ "classic rock": 1.0,
+ "rock": 73.0,
+ "electronica": 5.0,
+ "psychedelic": 3.0,
+ "pop": 2.0,
+ "beautiful": 1.0,
+ "post-rock": 3.0,
+ "indie rock": 15.0,
+ "electronic": 48.0,
+ "trip-hop": 1.0,
+ "britpop": 17.0,
+ "indie pop": 1.0,
+ "seen live": 27.0,
+ "alternative": 100.0,
+ "Progressive rock": 6.0,
+ "alternative rock": 81.0,
+ "00s": 2.0,
+ "idm": 1.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Beyoncé",
+ "features": {
+ "singer-songwriter": 3.0,
+ "jazz": 2.0,
+ "american": 9.0,
+ "beautiful": 2.0,
+ "dance": 13.0,
+ "rap": 2.0,
+ "rnb": 100.0,
+ "female vocalists": 70.0,
+ "Love": 3.0,
+ "soul": 56.0,
+ "pop": 91.0,
+ "hip hop": 5.0,
+ "electronic": 2.0,
+ "seen live": 6.0,
+ "Hip-Hop": 45.0,
+ "alternative": 1.0,
+ "female vocalist": 4.0,
+ "00s": 3.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Shawn Mendes",
+ "features": {
+ "male vocalists": 28.0,
+ "singer-songwriter": 13.0,
+ "british": 7.0,
+ "rnb": 7.0,
+ "acoustic": 37.0,
+ "metal": 4.0,
+ "folk": 37.0,
+ "indie": 10.0,
+ "soul": 4.0,
+ "pop": 100.0,
+ "seen live": 13.0,
+ "alternative": 4.0,
+ "alternative rock": 4.0
+ }
+ },
+ {
+ "description": "David Bowie",
+ "features": {
+ "singer-songwriter": 11.0,
+ "male vocalists": 4.0,
+ "Psychedelic Rock": 2.0,
+ "british": 23.0,
+ "experimental": 9.0,
+ "classic rock": 86.0,
+ "psychedelic": 3.0,
+ "electronica": 2.0,
+ "indie rock": 2.0,
+ "dance": 2.0,
+ "post-punk": 2.0,
+ "punk": 2.0,
+ "hard rock": 3.0,
+ "folk": 2.0,
+ "70s": 15.0,
+ "90s": 4.0,
+ "indie": 6.0,
+ "favorites": 2.0,
+ "soul": 2.0,
+ "ambient": 2.0,
+ "rock": 100.0,
+ "pop": 19.0,
+ "new wave": 7.0,
+ "electronic": 4.0,
+ "oldies": 2.0,
+ "britpop": 2.0,
+ "seen live": 11.0,
+ "alternative": 43.0,
+ "Progressive rock": 4.0,
+ "alternative rock": 6.0,
+ "industrial": 2.0,
+ "00s": 2.0,
+ "60s": 3.0,
+ "80s": 48.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Kendrick Lamar",
+ "features": {
+ "male vocalists": 2.0,
+ "american": 7.0,
+ "hip hop": 17.0,
+ "rap": 70.0,
+ "seen live": 38.0,
+ "Hip-Hop": 100.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Rihanna",
+ "features": {
+ "american": 4.0,
+ "beautiful": 2.0,
+ "dance": 56.0,
+ "rap": 2.0,
+ "rnb": 89.0,
+ "House": 1.0,
+ "female vocalists": 63.0,
+ "Love": 2.0,
+ "soul": 4.0,
+ "pop": 100.0,
+ "rock": 2.0,
+ "hip hop": 6.0,
+ "electronic": 3.0,
+ "seen live": 7.0,
+ "Hip-Hop": 41.0,
+ "alternative": 1.0,
+ "female vocalist": 4.0,
+ "00s": 3.0,
+ "reggae": 6.0
+ }
+ },
+ {
+ "description": "Arctic Monkeys",
+ "features": {
+ "indie": 98.0,
+ "male vocalists": 2.0,
+ "Psychedelic Rock": 1.0,
+ "british": 75.0,
+ "rock": 63.0,
+ "pop": 2.0,
+ "punk rock": 1.0,
+ "indie rock": 100.0,
+ "britpop": 16.0,
+ "indie pop": 2.0,
+ "seen live": 45.0,
+ "alternative": 60.0,
+ "post-punk": 3.0,
+ "alternative rock": 19.0,
+ "00s": 3.0,
+ "punk": 2.0
+ }
+ },
+ {
+ "description": "Tyler, the Creator",
+ "features": {
+ "experimental": 4.0,
+ "american": 4.0,
+ "hip hop": 12.0,
+ "rap": 55.0,
+ "seen live": 15.0,
+ "Hip-Hop": 100.0,
+ "alternative": 2.0
+ }
+ },
+ {
+ "description": "Lana Del Rey",
+ "features": {
+ "singer-songwriter": 10.0,
+ "jazz": 2.0,
+ "american": 14.0,
+ "beautiful": 2.0,
+ "indie rock": 2.0,
+ "female vocalists": 100.0,
+ "folk": 2.0,
+ "indie": 93.0,
+ "soul": 3.0,
+ "chillout": 3.0,
+ "blues": 2.0,
+ "pop": 80.0,
+ "rock": 2.0,
+ "electronic": 2.0,
+ "trip-hop": 10.0,
+ "indie pop": 88.0,
+ "seen live": 12.0,
+ "alternative": 67.0,
+ "female vocalist": 4.0,
+ "alternative rock": 2.0
+ }
+ },
+ {
+ "description": "Katy Perry",
+ "features": {
+ "indie": 25.0,
+ "singer-songwriter": 4.0,
+ "american": 9.0,
+ "pop": 100.0,
+ "rock": 24.0,
+ "beautiful": 2.0,
+ "indie rock": 1.0,
+ "electronic": 4.0,
+ "dance": 9.0,
+ "indie pop": 1.0,
+ "seen live": 7.0,
+ "rnb": 1.0,
+ "alternative": 3.0,
+ "female vocalist": 5.0,
+ "00s": 3.0,
+ "female vocalists": 62.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Lady Gaga",
+ "features": {
+ "singer-songwriter": 4.0,
+ "american": 7.0,
+ "pop": 100.0,
+ "electronica": 3.0,
+ "rock": 2.0,
+ "electro": 2.0,
+ "synthpop": 2.0,
+ "electronic": 53.0,
+ "dance": 73.0,
+ "seen live": 8.0,
+ "techno": 1.0,
+ "rnb": 1.0,
+ "alternative": 1.0,
+ "female vocalist": 21.0,
+ "00s": 3.0,
+ "female vocalists": 43.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Tame Impala",
+ "features": {
+ "indie": 21.0,
+ "male vocalists": 1.0,
+ "Psychedelic Rock": 100.0,
+ "experimental": 4.0,
+ "psychedelic": 92.0,
+ "rock": 41.0,
+ "indie rock": 60.0,
+ "electronic": 3.0,
+ "indie pop": 2.0,
+ "seen live": 53.0,
+ "alternative": 7.0,
+ "Progressive rock": 3.0,
+ "alternative rock": 3.0,
+ "00s": 3.0
+ }
+ },
+ {
+ "description": "Calvin Harris",
+ "features": {
+ "indie": 8.0,
+ "male vocalists": 3.0,
+ "singer-songwriter": 1.0,
+ "british": 15.0,
+ "electronica": 34.0,
+ "pop": 8.0,
+ "electro": 53.0,
+ "synthpop": 4.0,
+ "electronic": 100.0,
+ "dance": 75.0,
+ "indie pop": 2.0,
+ "seen live": 36.0,
+ "techno": 1.0,
+ "alternative": 1.0,
+ "House": 9.0,
+ "00s": 3.0,
+ "80s": 1.0
+ }
+ },
+ {
+ "description": "Red Hot Chili Peppers",
+ "features": {
+ "indie": 5.0,
+ "favorites": 1.0,
+ "male vocalists": 1.0,
+ "american": 5.0,
+ "classic rock": 3.0,
+ "rock": 100.0,
+ "pop": 2.0,
+ "punk rock": 2.0,
+ "indie rock": 2.0,
+ "seen live": 23.0,
+ "Grunge": 2.0,
+ "alternative": 54.0,
+ "metal": 2.0,
+ "alternative rock": 59.0,
+ "00s": 2.0,
+ "punk": 6.0,
+ "hard rock": 2.0,
+ "80s": 2.0,
+ "funk": 50.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Coldplay",
+ "features": {
+ "indie": 55.0,
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "singer-songwriter": 2.0,
+ "emo": 2.0,
+ "Mellow": 3.0,
+ "chillout": 3.0,
+ "british": 28.0,
+ "classic rock": 2.0,
+ "rock": 100.0,
+ "pop": 18.0,
+ "piano": 3.0,
+ "indie rock": 11.0,
+ "electronic": 2.0,
+ "britpop": 81.0,
+ "indie pop": 2.0,
+ "seen live": 22.0,
+ "alternative": 87.0,
+ "acoustic": 2.0,
+ "alternative rock": 68.0,
+ "00s": 2.0,
+ "Love": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Miley Cyrus",
+ "features": {
+ "country": 3.0,
+ "singer-songwriter": 1.0,
+ "american": 12.0,
+ "beautiful": 2.0,
+ "grindcore": 1.0,
+ "dance": 42.0,
+ "rnb": 4.0,
+ "Soundtrack": 2.0,
+ "female vocalists": 55.0,
+ "Love": 2.0,
+ "death metal": 2.0,
+ "pop": 100.0,
+ "rock": 8.0,
+ "electronic": 5.0,
+ "seen live": 3.0,
+ "Hip-Hop": 4.0,
+ "alternative": 2.0,
+ "female vocalist": 4.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "Mark Ronson",
+ "features": {
+ "singer-songwriter": 1.0,
+ "jazz": 7.0,
+ "british": 68.0,
+ "experimental": 2.0,
+ "american": 1.0,
+ "cover": 4.0,
+ "electronica": 2.0,
+ "dance": 5.0,
+ "rap": 4.0,
+ "rnb": 2.0,
+ "House": 1.0,
+ "indie": 3.0,
+ "soul": 17.0,
+ "chillout": 2.0,
+ "pop": 68.0,
+ "rock": 3.0,
+ "electro": 2.0,
+ "hip hop": 11.0,
+ "electronic": 9.0,
+ "trip-hop": 1.0,
+ "britpop": 4.0,
+ "seen live": 31.0,
+ "Hip-Hop": 57.0,
+ "alternative": 9.0,
+ "00s": 7.0,
+ "funk": 100.0
+ }
+ },
+ {
+ "description": "Imagine Dragons",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 6.0,
+ "american": 12.0,
+ "rock": 64.0,
+ "pop": 10.0,
+ "indie rock": 96.0,
+ "electronic": 4.0,
+ "new wave": 2.0,
+ "indie pop": 57.0,
+ "seen live": 29.0,
+ "alternative": 86.0,
+ "alternative rock": 21.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "The Weeknd",
+ "features": {
+ "indie": 6.0,
+ "male vocalists": 5.0,
+ "soul": 9.0,
+ "chillout": 2.0,
+ "Mellow": 2.0,
+ "experimental": 6.0,
+ "ambient": 3.0,
+ "pop": 10.0,
+ "electronica": 5.0,
+ "electro": 1.0,
+ "downtempo": 7.0,
+ "hip hop": 2.0,
+ "electronic": 78.0,
+ "trip-hop": 3.0,
+ "rap": 2.0,
+ "indie pop": 2.0,
+ "seen live": 16.0,
+ "Hip-Hop": 8.0,
+ "rnb": 100.0,
+ "alternative": 5.0
+ }
+ },
+ {
+ "description": "Eminem",
+ "features": {
+ "male vocalists": 3.0,
+ "singer-songwriter": 2.0,
+ "emo": 1.0,
+ "american": 6.0,
+ "pop": 16.0,
+ "rock": 3.0,
+ "hip hop": 33.0,
+ "dance": 1.0,
+ "rap": 100.0,
+ "seen live": 4.0,
+ "Hip-Hop": 79.0,
+ "alternative": 3.0,
+ "00s": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Nirvana",
+ "features": {
+ "indie": 4.0,
+ "favorites": 1.0,
+ "male vocalists": 2.0,
+ "Grunge": 100.0,
+ "alternative": 35.0,
+ "metal": 3.0,
+ "american": 4.0,
+ "classic rock": 2.0,
+ "rock": 52.0,
+ "alternative rock": 34.0,
+ "punk rock": 3.0,
+ "punk": 7.0,
+ "indie rock": 2.0,
+ "hard rock": 3.0,
+ "90s": 28.0
+ }
+ },
+ {
+ "description": "Fleetwood Mac",
+ "features": {
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "singer-songwriter": 2.0,
+ "british": 10.0,
+ "american": 3.0,
+ "classic rock": 100.0,
+ "blues": 41.0,
+ "rock": 67.0,
+ "pop": 33.0,
+ "oldies": 3.0,
+ "seen live": 7.0,
+ "alternative": 1.0,
+ "acoustic": 1.0,
+ "female vocalist": 2.0,
+ "guitar": 1.0,
+ "Progressive rock": 2.0,
+ "female vocalists": 10.0,
+ "folk": 2.0,
+ "60s": 5.0,
+ "70s": 48.0,
+ "80s": 12.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Childish Gambino",
+ "features": {
+ "indie": 35.0,
+ "male vocalists": 1.0,
+ "soul": 5.0,
+ "american": 8.0,
+ "experimental": 3.0,
+ "pop": 3.0,
+ "psychedelic": 2.0,
+ "hip hop": 31.0,
+ "electronic": 2.0,
+ "dance": 1.0,
+ "rap": 70.0,
+ "seen live": 37.0,
+ "Hip-Hop": 100.0,
+ "rnb": 6.0,
+ "alternative": 4.0,
+ "funk": 8.0
+ }
+ },
+ {
+ "description": "Pink Floyd",
+ "features": {
+ "favorites": 1.0,
+ "indie": 1.0,
+ "Psychedelic Rock": 72.0,
+ "british": 13.0,
+ "experimental": 6.0,
+ "ambient": 1.0,
+ "classic rock": 79.0,
+ "rock": 53.0,
+ "psychedelic": 44.0,
+ "oldies": 1.0,
+ "seen live": 3.0,
+ "alternative": 6.0,
+ "Progressive rock": 100.0,
+ "alternative rock": 2.0,
+ "hard rock": 2.0,
+ "60s": 5.0,
+ "70s": 8.0,
+ "80s": 3.0
+ }
+ },
+ {
+ "description": "The Killers",
+ "features": {
+ "indie": 100.0,
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "emo": 2.0,
+ "american": 9.0,
+ "british": 2.0,
+ "classic rock": 1.0,
+ "rock": 93.0,
+ "pop": 10.0,
+ "electronica": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 90.0,
+ "new wave": 4.0,
+ "electronic": 3.0,
+ "dance": 1.0,
+ "britpop": 4.0,
+ "indie pop": 4.0,
+ "seen live": 39.0,
+ "alternative": 75.0,
+ "post-punk": 3.0,
+ "alternative rock": 64.0,
+ "00s": 3.0,
+ "punk": 4.0
+ }
+ },
+ {
+ "description": "The Rolling Stones",
+ "features": {
+ "indie": 2.0,
+ "male vocalists": 1.0,
+ "Psychedelic Rock": 2.0,
+ "british": 43.0,
+ "classic rock": 100.0,
+ "blues": 31.0,
+ "rock": 80.0,
+ "psychedelic": 3.0,
+ "pop": 2.0,
+ "oldies": 3.0,
+ "seen live": 14.0,
+ "alternative": 4.0,
+ "guitar": 1.0,
+ "hard rock": 8.0,
+ "60s": 41.0,
+ "70s": 8.0,
+ "80s": 4.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Gorillaz",
+ "features": {
+ "indie": 46.0,
+ "favorites": 1.0,
+ "chillout": 3.0,
+ "british": 12.0,
+ "experimental": 6.0,
+ "rock": 58.0,
+ "electronica": 13.0,
+ "pop": 13.0,
+ "electro": 2.0,
+ "downtempo": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 4.0,
+ "hip hop": 7.0,
+ "electronic": 88.0,
+ "trip-hop": 20.0,
+ "dance": 4.0,
+ "britpop": 4.0,
+ "rap": 4.0,
+ "indie pop": 2.0,
+ "seen live": 5.0,
+ "Hip-Hop": 63.0,
+ "alternative": 100.0,
+ "metal": 2.0,
+ "alternative rock": 11.0,
+ "00s": 3.0,
+ "punk": 2.0,
+ "funk": 3.0
+ }
+ },
+ {
+ "description": "Frank Ocean",
+ "features": {
+ "indie": 3.0,
+ "male vocalists": 6.0,
+ "singer-songwriter": 4.0,
+ "soul": 93.0,
+ "american": 8.0,
+ "experimental": 2.0,
+ "pop": 6.0,
+ "electronica": 1.0,
+ "hip hop": 8.0,
+ "electronic": 3.0,
+ "rap": 4.0,
+ "seen live": 14.0,
+ "Hip-Hop": 82.0,
+ "rnb": 100.0,
+ "alternative": 3.0,
+ "funk": 2.0
+ }
+ },
+ {
+ "description": "Panic! at the Disco",
+ "features": {
+ "male vocalists": 3.0,
+ "american": 8.0,
+ "electronica": 2.0,
+ "punk rock": 6.0,
+ "indie rock": 21.0,
+ "dance": 20.0,
+ "metal": 2.0,
+ "screamo": 2.0,
+ "punk": 21.0,
+ "Love": 2.0,
+ "indie": 68.0,
+ "favorites": 4.0,
+ "emo": 97.0,
+ "rock": 100.0,
+ "pop": 9.0,
+ "electronic": 4.0,
+ "indie pop": 2.0,
+ "seen live": 51.0,
+ "hardcore": 2.0,
+ "techno": 1.0,
+ "alternative": 99.0,
+ "alternative rock": 21.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "The Cure",
+ "features": {
+ "indie": 14.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "british": 16.0,
+ "classic rock": 3.0,
+ "rock": 52.0,
+ "pop": 6.0,
+ "psychedelic": 1.0,
+ "synthpop": 1.0,
+ "punk rock": 1.0,
+ "indie rock": 3.0,
+ "new wave": 100.0,
+ "electronic": 2.0,
+ "britpop": 2.0,
+ "indie pop": 1.0,
+ "seen live": 24.0,
+ "alternative": 68.0,
+ "Gothic": 10.0,
+ "post-punk": 100.0,
+ "alternative rock": 23.0,
+ "punk": 4.0,
+ "Love": 2.0,
+ "70s": 2.0,
+ "80s": 65.0,
+ "90s": 3.0
+ }
+ },
+ {
+ "description": "Madonna",
+ "features": {
+ "singer-songwriter": 3.0,
+ "american": 8.0,
+ "pop": 100.0,
+ "rock": 5.0,
+ "electronica": 3.0,
+ "electronic": 29.0,
+ "dance": 50.0,
+ "seen live": 9.0,
+ "rnb": 1.0,
+ "alternative": 2.0,
+ "female vocalist": 4.0,
+ "00s": 4.0,
+ "female vocalists": 50.0,
+ "Love": 1.0,
+ "80s": 35.0,
+ "90s": 8.0
+ }
+ },
+ {
+ "description": "The Chainsmokers",
+ "features": {
+ "male vocalists": 6.0,
+ "american": 28.0,
+ "electronica": 3.0,
+ "dance": 33.0,
+ "House": 63.0,
+ "pop": 79.0,
+ "electro": 6.0,
+ "electronic": 100.0,
+ "seen live": 17.0,
+ "techno": 3.0,
+ "alternative": 3.0
+ }
+ },
+ {
+ "description": "Linkin Park",
+ "features": {
+ "favorites": 2.0,
+ "indie": 1.0,
+ "male vocalists": 3.0,
+ "emo": 3.0,
+ "american": 6.0,
+ "rock": 100.0,
+ "pop": 3.0,
+ "punk rock": 2.0,
+ "electronic": 4.0,
+ "rap": 3.0,
+ "seen live": 21.0,
+ "Hip-Hop": 2.0,
+ "alternative": 67.0,
+ "metal": 37.0,
+ "Nu Metal": 92.0,
+ "alternative rock": 74.0,
+ "00s": 2.0,
+ "punk": 4.0,
+ "hard rock": 5.0
+ }
+ },
+ {
+ "description": "Lorde",
+ "features": {
+ "indie": 72.0,
+ "singer-songwriter": 7.0,
+ "soul": 1.0,
+ "experimental": 2.0,
+ "pop": 100.0,
+ "electronica": 5.0,
+ "rock": 1.0,
+ "synthpop": 7.0,
+ "electronic": 81.0,
+ "trip-hop": 2.0,
+ "indie pop": 92.0,
+ "seen live": 20.0,
+ "alternative": 17.0,
+ "female vocalist": 4.0,
+ "female vocalists": 28.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "The Black Keys",
+ "features": {
+ "indie": 50.0,
+ "male vocalists": 2.0,
+ "soul": 2.0,
+ "Psychedelic Rock": 2.0,
+ "american": 8.0,
+ "blues": 68.0,
+ "classic rock": 2.0,
+ "rock": 63.0,
+ "psychedelic": 2.0,
+ "indie rock": 48.0,
+ "seen live": 37.0,
+ "alternative": 11.0,
+ "alternative rock": 7.0,
+ "00s": 3.0,
+ "hard rock": 2.0
+ }
+ },
+ {
+ "description": "Daft Punk",
+ "features": {
+ "indie": 2.0,
+ "chillout": 2.0,
+ "experimental": 2.0,
+ "electronica": 37.0,
+ "rock": 3.0,
+ "pop": 2.0,
+ "electro": 11.0,
+ "synthpop": 1.0,
+ "electronic": 100.0,
+ "dance": 54.0,
+ "french": 19.0,
+ "seen live": 7.0,
+ "techno": 36.0,
+ "alternative": 6.0,
+ "House": 54.0,
+ "trance": 2.0,
+ "00s": 2.0,
+ "Soundtrack": 2.0,
+ "funk": 4.0,
+ "90s": 3.0
+ }
+ },
+ {
+ "description": "Led Zeppelin",
+ "features": {
+ "favorites": 1.0,
+ "indie": 1.0,
+ "Psychedelic Rock": 3.0,
+ "british": 9.0,
+ "classic rock": 100.0,
+ "blues": 9.0,
+ "rock": 64.0,
+ "psychedelic": 4.0,
+ "heavy metal": 8.0,
+ "oldies": 1.0,
+ "metal": 4.0,
+ "alternative": 4.0,
+ "guitar": 2.0,
+ "Progressive rock": 33.0,
+ "alternative rock": 1.0,
+ "hard rock": 63.0,
+ "folk": 1.0,
+ "60s": 3.0,
+ "70s": 36.0,
+ "80s": 1.0
+ }
+ },
+ {
+ "description": "Marshmello",
+ "features": {
+ "emo": 10.0,
+ "pop": 28.0,
+ "electronic": 91.0,
+ "dance": 100.0,
+ "rap": 28.0,
+ "seen live": 19.0,
+ "rnb": 19.0,
+ "House": 10.0
+ }
+ },
+ {
+ "description": "Khalid",
+ "features": {
+ "indie": 7.0,
+ "male vocalists": 7.0,
+ "soul": 88.0,
+ "american": 19.0,
+ "pop": 100.0,
+ "synthpop": 7.0,
+ "electronic": 13.0,
+ "seen live": 25.0,
+ "rnb": 75.0,
+ "alternative": 63.0,
+ "folk": 7.0
+ }
+ },
+ {
+ "description": "David Guetta",
+ "features": {
+ "chillout": 1.0,
+ "electronica": 7.0,
+ "pop": 6.0,
+ "electro": 6.0,
+ "electronic": 76.0,
+ "dance": 82.0,
+ "french": 11.0,
+ "seen live": 9.0,
+ "techno": 39.0,
+ "House": 100.0,
+ "trance": 4.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "Lizzo",
+ "features": {
+ "american": 16.0,
+ "dance": 8.0,
+ "rap": 47.0,
+ "rnb": 54.0,
+ "female vocalists": 24.0,
+ "pop": 16.0,
+ "hip hop": 47.0,
+ "seen live": 93.0,
+ "Hip-Hop": 100.0,
+ "alternative": 8.0
+ }
+ },
+ {
+ "description": "Sia",
+ "features": {
+ "indie": 70.0,
+ "favorites": 1.0,
+ "singer-songwriter": 18.0,
+ "soul": 3.0,
+ "jazz": 2.0,
+ "chillout": 76.0,
+ "Mellow": 4.0,
+ "ambient": 2.0,
+ "pop": 20.0,
+ "electronica": 4.0,
+ "rock": 2.0,
+ "beautiful": 4.0,
+ "piano": 1.0,
+ "downtempo": 57.0,
+ "indie rock": 1.0,
+ "electronic": 16.0,
+ "trip-hop": 57.0,
+ "dance": 2.0,
+ "indie pop": 8.0,
+ "lounge": 2.0,
+ "seen live": 7.0,
+ "alternative": 9.0,
+ "acoustic": 2.0,
+ "female vocalist": 7.0,
+ "alternative rock": 1.0,
+ "00s": 2.0,
+ "female vocalists": 100.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Elton John",
+ "features": {
+ "favorites": 2.0,
+ "indie": 1.0,
+ "singer-songwriter": 64.0,
+ "male vocalists": 9.0,
+ "soul": 2.0,
+ "british": 28.0,
+ "classic rock": 87.0,
+ "blues": 1.0,
+ "pop": 100.0,
+ "rock": 59.0,
+ "piano": 54.0,
+ "oldies": 4.0,
+ "britpop": 2.0,
+ "seen live": 19.0,
+ "alternative": 2.0,
+ "Soundtrack": 3.0,
+ "00s": 2.0,
+ "Love": 2.0,
+ "60s": 2.0,
+ "70s": 16.0,
+ "80s": 16.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Twenty One Pilots",
+ "features": {
+ "american": 15.0,
+ "experimental": 6.0,
+ "electronica": 1.0,
+ "piano": 1.0,
+ "indie rock": 12.0,
+ "rap": 48.0,
+ "pop": 17.0,
+ "rock": 11.0,
+ "electronic": 100.0,
+ "noise": 1.0,
+ "indie pop": 71.0,
+ "seen live": 50.0,
+ "male vocalists": 4.0,
+ "punk": 1.0,
+ "Love": 1.0,
+ "indie": 84.0,
+ "emo": 5.0,
+ "electro": 1.0,
+ "synthpop": 1.0,
+ "hip hop": 7.0,
+ "Hip-Hop": 27.0,
+ "alternative": 84.0,
+ "alternative rock": 23.0
+ }
+ },
+ {
+ "description": "Avicii",
+ "features": {
+ "swedish": 20.0,
+ "seen live": 14.0,
+ "techno": 2.0,
+ "House": 100.0,
+ "trance": 3.0,
+ "electronica": 6.0,
+ "pop": 3.0,
+ "electro": 5.0,
+ "electronic": 83.0,
+ "dance": 66.0
+ }
+ },
+ {
+ "description": "Ellie Goulding",
+ "features": {
+ "indie": 85.0,
+ "singer-songwriter": 11.0,
+ "chillout": 3.0,
+ "british": 89.0,
+ "pop": 36.0,
+ "electronica": 3.0,
+ "rock": 1.0,
+ "electro": 2.0,
+ "synthpop": 9.0,
+ "electronic": 98.0,
+ "dance": 5.0,
+ "britpop": 2.0,
+ "indie pop": 78.0,
+ "seen live": 27.0,
+ "alternative": 6.0,
+ "acoustic": 2.0,
+ "female vocalist": 5.0,
+ "00s": 2.0,
+ "female vocalists": 100.0,
+ "folk": 4.0
+ }
+ },
+ {
+ "description": "Muse",
+ "features": {
+ "indie": 43.0,
+ "favorites": 2.0,
+ "male vocalists": 3.0,
+ "emo": 2.0,
+ "british": 21.0,
+ "experimental": 3.0,
+ "rock": 83.0,
+ "pop": 2.0,
+ "piano": 1.0,
+ "indie rock": 12.0,
+ "electronic": 4.0,
+ "britpop": 10.0,
+ "seen live": 46.0,
+ "alternative": 70.0,
+ "metal": 1.0,
+ "Progressive rock": 57.0,
+ "alternative rock": 100.0,
+ "00s": 2.0,
+ "hard rock": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Green Day",
+ "features": {
+ "indie": 3.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 4.0,
+ "american": 7.0,
+ "classic rock": 2.0,
+ "rock": 75.0,
+ "pop": 6.0,
+ "punk rock": 100.0,
+ "indie rock": 2.0,
+ "seen live": 26.0,
+ "Grunge": 1.0,
+ "alternative": 47.0,
+ "metal": 2.0,
+ "alternative rock": 17.0,
+ "00s": 2.0,
+ "punk": 69.0,
+ "hard rock": 2.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Metallica",
+ "features": {
+ "seen live": 31.0,
+ "emo": 2.0,
+ "metal": 91.0,
+ "alternative": 2.0,
+ "american": 6.0,
+ "Power metal": 1.0,
+ "classic rock": 6.0,
+ "rock": 34.0,
+ "alternative rock": 2.0,
+ "hard rock": 41.0,
+ "heavy metal": 74.0,
+ "80s": 4.0,
+ "thrash metal": 100.0,
+ "90s": 3.0,
+ "Progressive metal": 2.0
+ }
+ },
+ {
+ "description": "Sam Smith",
+ "features": {
+ "indie": 3.0,
+ "male vocalists": 9.0,
+ "singer-songwriter": 8.0,
+ "soul": 100.0,
+ "british": 55.0,
+ "pop": 87.0,
+ "electronic": 45.0,
+ "dance": 32.0,
+ "seen live": 30.0,
+ "rnb": 7.0,
+ "alternative": 3.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "Kygo",
+ "features": {
+ "electronica": 7.0,
+ "downtempo": 49.0,
+ "dance": 5.0,
+ "House": 74.0,
+ "chillout": 65.0,
+ "pop": 5.0,
+ "synthpop": 3.0,
+ "electronic": 100.0,
+ "seen live": 36.0
+ }
+ },
+ {
+ "description": "Halsey",
+ "features": {
+ "american": 34.0,
+ "classic rock": 2.0,
+ "beautiful": 4.0,
+ "black metal": 4.0,
+ "pop": 100.0,
+ "electronic": 38.0,
+ "noise": 2.0,
+ "heavy metal": 2.0,
+ "indie pop": 44.0,
+ "seen live": 32.0,
+ "female vocalist": 4.0,
+ "singer-songwriter": 8.0,
+ "british": 4.0,
+ "rnb": 4.0,
+ "trance": 2.0,
+ "female vocalists": 44.0,
+ "indie": 68.0,
+ "soul": 4.0,
+ "emo": 4.0,
+ "synthpop": 12.0,
+ "alternative": 32.0
+ }
+ },
+ {
+ "description": "Michael Jackson",
+ "features": {
+ "male vocalists": 5.0,
+ "singer-songwriter": 2.0,
+ "soul": 36.0,
+ "american": 6.0,
+ "classic rock": 2.0,
+ "pop": 100.0,
+ "rock": 8.0,
+ "electronic": 1.0,
+ "dance": 41.0,
+ "seen live": 3.0,
+ "rnb": 7.0,
+ "70s": 3.0,
+ "80s": 50.0,
+ "funk": 34.0,
+ "90s": 5.0
+ }
+ },
+ {
+ "description": "Maroon 5",
+ "features": {
+ "indie": 12.0,
+ "favorites": 3.0,
+ "male vocalists": 9.0,
+ "singer-songwriter": 2.0,
+ "soul": 3.0,
+ "emo": 2.0,
+ "jazz": 2.0,
+ "american": 11.0,
+ "classic rock": 2.0,
+ "rock": 100.0,
+ "pop": 96.0,
+ "punk rock": 2.0,
+ "indie rock": 3.0,
+ "electronic": 1.0,
+ "dance": 2.0,
+ "britpop": 1.0,
+ "indie pop": 2.0,
+ "seen live": 16.0,
+ "alternative": 69.0,
+ "acoustic": 2.0,
+ "metal": 1.0,
+ "alternative rock": 52.0,
+ "00s": 4.0,
+ "punk": 3.0,
+ "Love": 2.0,
+ "funk": 5.0
+ }
+ },
+ {
+ "description": "Charli XCX",
+ "features": {
+ "singer-songwriter": 5.0,
+ "british": 26.0,
+ "experimental": 2.0,
+ "electronica": 5.0,
+ "dance": 4.0,
+ "female vocalists": 56.0,
+ "indie": 7.0,
+ "chillout": 11.0,
+ "pop": 98.0,
+ "rock": 2.0,
+ "electro": 4.0,
+ "synthpop": 100.0,
+ "electronic": 99.0,
+ "new wave": 4.0,
+ "britpop": 2.0,
+ "indie pop": 7.0,
+ "seen live": 63.0,
+ "Hip-Hop": 2.0,
+ "alternative": 5.0,
+ "female vocalist": 2.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "Foo Fighters",
+ "features": {
+ "indie": 7.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "american": 5.0,
+ "classic rock": 1.0,
+ "rock": 100.0,
+ "pop": 2.0,
+ "punk rock": 2.0,
+ "indie rock": 3.0,
+ "seen live": 35.0,
+ "Grunge": 48.0,
+ "alternative": 47.0,
+ "metal": 2.0,
+ "alternative rock": 69.0,
+ "00s": 2.0,
+ "punk": 5.0,
+ "hard rock": 30.0,
+ "90s": 4.0
+ }
+ },
+ {
+ "description": "Florence + the Machine",
+ "features": {
+ "indie": 100.0,
+ "singer-songwriter": 7.0,
+ "soul": 5.0,
+ "british": 72.0,
+ "experimental": 2.0,
+ "pop": 10.0,
+ "rock": 5.0,
+ "beautiful": 1.0,
+ "indie rock": 8.0,
+ "electronic": 2.0,
+ "britpop": 2.0,
+ "indie pop": 61.0,
+ "seen live": 29.0,
+ "alternative": 72.0,
+ "female vocalist": 3.0,
+ "alternative rock": 5.0,
+ "00s": 2.0,
+ "female vocalists": 86.0,
+ "Love": 2.0,
+ "folk": 6.0
+ }
+ },
+ {
+ "description": "blink-182",
+ "features": {
+ "indie": 3.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 8.0,
+ "american": 6.0,
+ "rock": 56.0,
+ "pop": 5.0,
+ "punk rock": 100.0,
+ "indie rock": 2.0,
+ "seen live": 23.0,
+ "hardcore": 2.0,
+ "alternative": 42.0,
+ "metal": 2.0,
+ "alternative rock": 10.0,
+ "00s": 1.0,
+ "punk": 72.0,
+ "hard rock": 1.0,
+ "90s": 4.0
+ }
+ },
+ {
+ "description": "Vampire Weekend",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 3.0,
+ "american": 11.0,
+ "experimental": 6.0,
+ "rock": 37.0,
+ "pop": 9.0,
+ "indie rock": 82.0,
+ "electronic": 2.0,
+ "indie pop": 63.0,
+ "seen live": 58.0,
+ "alternative": 57.0,
+ "alternative rock": 7.0,
+ "00s": 4.0,
+ "folk": 1.0
+ }
+ },
+ {
+ "description": "Martin Garrix",
+ "features": {
+ "german": 2.0,
+ "experimental": 2.0,
+ "american": 2.0,
+ "electronica": 5.0,
+ "dance": 57.0,
+ "House": 100.0,
+ "Soundtrack": 2.0,
+ "black metal": 2.0,
+ "Power metal": 2.0,
+ "pop": 30.0,
+ "electronic": 80.0,
+ "noise": 2.0,
+ "seen live": 38.0,
+ "Grunge": 2.0,
+ "techno": 2.0,
+ "trance": 3.0,
+ "electro": 5.0
+ }
+ },
+ {
+ "description": "Paramore",
+ "features": {
+ "indie": 9.0,
+ "favorites": 2.0,
+ "emo": 35.0,
+ "american": 7.0,
+ "rock": 100.0,
+ "pop": 6.0,
+ "punk rock": 8.0,
+ "indie rock": 4.0,
+ "seen live": 34.0,
+ "alternative": 79.0,
+ "female vocalist": 6.0,
+ "alternative rock": 22.0,
+ "screamo": 1.0,
+ "00s": 2.0,
+ "female vocalists": 72.0,
+ "punk": 13.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Britney Spears",
+ "features": {
+ "singer-songwriter": 2.0,
+ "american": 9.0,
+ "electronica": 1.0,
+ "beautiful": 2.0,
+ "dance": 44.0,
+ "rnb": 3.0,
+ "House": 1.0,
+ "trance": 1.0,
+ "female vocalists": 44.0,
+ "Love": 2.0,
+ "black metal": 2.0,
+ "90s": 6.0,
+ "indie": 1.0,
+ "death metal": 1.0,
+ "emo": 2.0,
+ "pop": 100.0,
+ "rock": 3.0,
+ "electro": 2.0,
+ "electronic": 5.0,
+ "seen live": 7.0,
+ "Hip-Hop": 2.0,
+ "alternative": 2.0,
+ "female vocalist": 4.0,
+ "00s": 4.0
+ }
+ },
+ {
+ "description": "Travi$ Scott",
+ "features": {
+ "male vocalists": 2.0,
+ "american": 10.0,
+ "experimental": 4.0,
+ "electronica": 2.0,
+ "rap": 62.0,
+ "rnb": 4.0,
+ "soul": 4.0,
+ "electro": 4.0,
+ "hip hop": 20.0,
+ "seen live": 24.0,
+ "Hip-Hop": 100.0,
+ "alternative": 2.0
+ }
+ },
+ {
+ "description": "Oasis",
+ "features": {
+ "indie": 45.0,
+ "favorites": 1.0,
+ "male vocalists": 2.0,
+ "british": 61.0,
+ "classic rock": 3.0,
+ "rock": 89.0,
+ "pop": 7.0,
+ "indie rock": 12.0,
+ "britpop": 100.0,
+ "seen live": 21.0,
+ "alternative": 53.0,
+ "alternative rock": 20.0,
+ "00s": 2.0,
+ "punk": 1.0,
+ "hard rock": 2.0,
+ "90s": 10.0
+ }
+ },
+ {
+ "description": "A$AP Rocky",
+ "features": {
+ "male vocalists": 3.0,
+ "american": 9.0,
+ "experimental": 2.0,
+ "hip hop": 12.0,
+ "rap": 61.0,
+ "seen live": 30.0,
+ "Hip-Hop": 100.0
+ }
+ },
+ {
+ "description": "Nicki Minaj",
+ "features": {
+ "singer-songwriter": 2.0,
+ "american": 7.0,
+ "dance": 9.0,
+ "rap": 84.0,
+ "rnb": 51.0,
+ "female vocalists": 25.0,
+ "Love": 2.0,
+ "chillout": 1.0,
+ "pop": 44.0,
+ "hip hop": 39.0,
+ "electronic": 3.0,
+ "seen live": 4.0,
+ "Hip-Hop": 100.0,
+ "alternative": 2.0,
+ "female vocalist": 3.0
+ }
+ },
+ {
+ "description": "The Smiths",
+ "features": {
+ "indie": 100.0,
+ "favorites": 3.0,
+ "male vocalists": 3.0,
+ "singer-songwriter": 2.0,
+ "emo": 2.0,
+ "british": 32.0,
+ "classic rock": 4.0,
+ "rock": 32.0,
+ "pop": 10.0,
+ "indie rock": 22.0,
+ "new wave": 85.0,
+ "electronic": 1.0,
+ "britpop": 10.0,
+ "indie pop": 10.0,
+ "seen live": 2.0,
+ "alternative": 77.0,
+ "post-punk": 85.0,
+ "alternative rock": 21.0,
+ "punk": 2.0,
+ "Love": 2.0,
+ "80s": 96.0
+ }
+ },
+ {
+ "description": "The Strokes",
+ "features": {
+ "indie": 97.0,
+ "favorites": 2.0,
+ "male vocalists": 2.0,
+ "emo": 1.0,
+ "american": 10.0,
+ "british": 2.0,
+ "classic rock": 2.0,
+ "rock": 98.0,
+ "pop": 2.0,
+ "punk rock": 2.0,
+ "indie rock": 100.0,
+ "new wave": 1.0,
+ "britpop": 2.0,
+ "indie pop": 3.0,
+ "seen live": 42.0,
+ "alternative": 71.0,
+ "post-punk": 5.0,
+ "alternative rock": 59.0,
+ "00s": 4.0,
+ "punk": 4.0,
+ "Love": 1.0
+ }
+ },
+ {
+ "description": "MGMT",
+ "features": {
+ "indie": 90.0,
+ "male vocalists": 2.0,
+ "Psychedelic Rock": 4.0,
+ "american": 8.0,
+ "experimental": 5.0,
+ "psychedelic": 68.0,
+ "pop": 7.0,
+ "rock": 5.0,
+ "electronica": 5.0,
+ "electro": 3.0,
+ "synthpop": 10.0,
+ "indie rock": 10.0,
+ "electronic": 100.0,
+ "dance": 3.0,
+ "indie pop": 51.0,
+ "seen live": 35.0,
+ "alternative": 53.0,
+ "post-punk": 1.0,
+ "alternative rock": 3.0,
+ "00s": 3.0
+ }
+ },
+ {
+ "description": "Fall Out Boy",
+ "features": {
+ "indie": 14.0,
+ "favorites": 3.0,
+ "male vocalists": 3.0,
+ "emo": 86.0,
+ "american": 7.0,
+ "rock": 91.0,
+ "pop": 9.0,
+ "punk rock": 28.0,
+ "indie rock": 4.0,
+ "dance": 1.0,
+ "seen live": 39.0,
+ "hardcore": 3.0,
+ "alternative": 69.0,
+ "metal": 2.0,
+ "alternative rock": 16.0,
+ "screamo": 3.0,
+ "00s": 2.0,
+ "punk": 55.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Dua Lipa",
+ "features": {
+ "beautiful": 8.0,
+ "dance": 11.0,
+ "pop": 100.0,
+ "electronic": 11.0,
+ "indie pop": 16.0,
+ "seen live": 28.0,
+ "british": 29.0,
+ "japanese": 6.0,
+ "rnb": 12.0,
+ "female vocalists": 31.0,
+ "indie": 9.0,
+ "emo": 9.0,
+ "synthpop": 35.0
+ }
+ },
+ {
+ "description": "Jonas Brothers",
+ "features": {
+ "american": 9.0,
+ "grindcore": 3.0,
+ "punk rock": 2.0,
+ "dance": 2.0,
+ "metal": 3.0,
+ "House": 2.0,
+ "Soundtrack": 2.0,
+ "black metal": 3.0,
+ "Power metal": 2.0,
+ "pop": 100.0,
+ "rock": 56.0,
+ "Melodic Death Metal": 3.0,
+ "seen live": 17.0,
+ "00s": 4.0,
+ "male vocalists": 10.0,
+ "female vocalists": 2.0,
+ "punk": 3.0,
+ "Love": 3.0,
+ "indie": 2.0,
+ "death metal": 4.0,
+ "emo": 3.0,
+ "metalcore": 2.0,
+ "hardcore": 2.0,
+ "alternative": 2.0,
+ "alternative rock": 2.0
+ }
+ },
+ {
+ "description": "Foster the People",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 4.0,
+ "american": 36.0,
+ "pop": 10.0,
+ "rock": 7.0,
+ "indie rock": 12.0,
+ "electronic": 8.0,
+ "dance": 2.0,
+ "indie pop": 83.0,
+ "seen live": 23.0,
+ "alternative": 65.0,
+ "alternative rock": 7.0,
+ "00s": 1.0
+ }
+ },
+ {
+ "description": "Bon Iver",
+ "features": {
+ "indie": 75.0,
+ "singer-songwriter": 70.0,
+ "male vocalists": 4.0,
+ "Mellow": 3.0,
+ "chillout": 2.0,
+ "american": 7.0,
+ "experimental": 2.0,
+ "ambient": 2.0,
+ "rock": 2.0,
+ "beautiful": 3.0,
+ "indie rock": 5.0,
+ "indie pop": 2.0,
+ "seen live": 36.0,
+ "acoustic": 59.0,
+ "alternative": 6.0,
+ "00s": 2.0,
+ "folk": 100.0
+ }
+ },
+ {
+ "description": "Major Lazer",
+ "features": {
+ "indie": 2.0,
+ "american": 4.0,
+ "experimental": 3.0,
+ "british": 2.0,
+ "electronica": 5.0,
+ "pop": 2.0,
+ "electro": 37.0,
+ "hip hop": 2.0,
+ "electronic": 85.0,
+ "dance": 12.0,
+ "seen live": 100.0,
+ "Hip-Hop": 4.0,
+ "alternative": 2.0,
+ "House": 3.0,
+ "00s": 2.0,
+ "funk": 4.0,
+ "reggae": 66.0
+ }
+ },
+ {
+ "description": "Two Door Cinema Club",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 2.0,
+ "british": 63.0,
+ "rock": 6.0,
+ "pop": 3.0,
+ "electronica": 2.0,
+ "synthpop": 2.0,
+ "indie rock": 19.0,
+ "electronic": 68.0,
+ "dance": 2.0,
+ "britpop": 2.0,
+ "indie pop": 10.0,
+ "seen live": 47.0,
+ "alternative": 53.0,
+ "alternative rock": 4.0,
+ "00s": 2.0
+ }
+ },
+ {
+ "description": "OneRepublic",
+ "features": {
+ "indie": 63.0,
+ "favorites": 2.0,
+ "male vocalists": 8.0,
+ "emo": 1.0,
+ "american": 12.0,
+ "rock": 100.0,
+ "pop": 21.0,
+ "piano": 2.0,
+ "indie rock": 5.0,
+ "indie pop": 2.0,
+ "seen live": 9.0,
+ "alternative": 94.0,
+ "acoustic": 1.0,
+ "alternative rock": 80.0,
+ "00s": 3.0,
+ "Love": 2.0
+ }
+ },
+ {
+ "description": "Cage the Elephant",
+ "features": {
+ "indie": 59.0,
+ "male vocalists": 2.0,
+ "american": 11.0,
+ "rock": 68.0,
+ "punk rock": 44.0,
+ "indie rock": 100.0,
+ "seen live": 41.0,
+ "alternative": 73.0,
+ "alternative rock": 26.0,
+ "00s": 4.0,
+ "punk": 7.0
+ }
+ },
+ {
+ "description": "Arcade Fire",
+ "features": {
+ "indie": 100.0,
+ "male vocalists": 2.0,
+ "experimental": 6.0,
+ "rock": 48.0,
+ "pop": 2.0,
+ "beautiful": 1.0,
+ "post-rock": 2.0,
+ "indie rock": 99.0,
+ "new wave": 1.0,
+ "indie pop": 4.0,
+ "seen live": 59.0,
+ "alternative": 76.0,
+ "post-punk": 3.0,
+ "alternative rock": 16.0,
+ "00s": 5.0,
+ "female vocalists": 2.0,
+ "folk": 6.0
+ }
+ },
+ {
+ "description": "Bruno Mars",
+ "features": {
+ "indie": 3.0,
+ "male vocalists": 47.0,
+ "singer-songwriter": 7.0,
+ "soul": 10.0,
+ "american": 8.0,
+ "blues": 2.0,
+ "pop": 100.0,
+ "rock": 2.0,
+ "hip hop": 2.0,
+ "dance": 2.0,
+ "seen live": 6.0,
+ "Hip-Hop": 3.0,
+ "rnb": 63.0,
+ "alternative": 2.0,
+ "acoustic": 1.0,
+ "folk": 1.0,
+ "funk": 4.0,
+ "reggae": 4.0
+ }
+ },
+ {
+ "description": "Carly Rae Jepsen",
+ "features": {
+ "singer-songwriter": 5.0,
+ "soul": 2.0,
+ "chillout": 2.0,
+ "pop": 100.0,
+ "synthpop": 9.0,
+ "electronic": 4.0,
+ "dance": 11.0,
+ "seen live": 6.0,
+ "acoustic": 21.0,
+ "female vocalist": 4.0,
+ "00s": 1.0,
+ "female vocalists": 46.0,
+ "folk": 26.0
+ }
+ },
+ {
+ "description": "Weezer",
+ "features": {
+ "indie": 50.0,
+ "favorites": 3.0,
+ "male vocalists": 2.0,
+ "emo": 15.0,
+ "american": 8.0,
+ "classic rock": 2.0,
+ "rock": 100.0,
+ "pop": 6.0,
+ "punk rock": 5.0,
+ "indie rock": 41.0,
+ "britpop": 1.0,
+ "indie pop": 3.0,
+ "seen live": 37.0,
+ "hardcore": 1.0,
+ "Grunge": 2.0,
+ "alternative": 86.0,
+ "metal": 2.0,
+ "alternative rock": 73.0,
+ "00s": 2.0,
+ "punk": 11.0,
+ "Love": 1.0,
+ "hard rock": 2.0,
+ "90s": 9.0
+ }
+ },
+ {
+ "description": "P!nk",
+ "features": {
+ "indie": 2.0,
+ "favorites": 2.0,
+ "singer-songwriter": 5.0,
+ "soul": 2.0,
+ "american": 11.0,
+ "pop": 100.0,
+ "rock": 59.0,
+ "electronic": 2.0,
+ "dance": 7.0,
+ "seen live": 14.0,
+ "Hip-Hop": 2.0,
+ "rnb": 5.0,
+ "alternative": 4.0,
+ "female vocalist": 4.0,
+ "alternative rock": 2.0,
+ "00s": 4.0,
+ "female vocalists": 74.0,
+ "punk": 3.0
+ }
+ },
+ {
+ "description": "System of a Down",
+ "features": {
+ "indie": 2.0,
+ "favorites": 1.0,
+ "male vocalists": 1.0,
+ "emo": 2.0,
+ "american": 5.0,
+ "experimental": 3.0,
+ "rock": 65.0,
+ "punk rock": 2.0,
+ "metalcore": 1.0,
+ "heavy metal": 6.0,
+ "Progressive metal": 3.0,
+ "thrash metal": 2.0,
+ "seen live": 18.0,
+ "hardcore": 3.0,
+ "metal": 100.0,
+ "alternative": 54.0,
+ "Progressive rock": 2.0,
+ "Nu Metal": 62.0,
+ "alternative rock": 13.0,
+ "industrial": 1.0,
+ "00s": 2.0,
+ "punk": 3.0,
+ "hard rock": 20.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "Adele",
+ "features": {
+ "indie": 40.0,
+ "singer-songwriter": 50.0,
+ "soul": 100.0,
+ "jazz": 8.0,
+ "chillout": 2.0,
+ "Mellow": 2.0,
+ "british": 66.0,
+ "blues": 3.0,
+ "pop": 19.0,
+ "rock": 2.0,
+ "beautiful": 1.0,
+ "piano": 2.0,
+ "britpop": 3.0,
+ "indie pop": 3.0,
+ "seen live": 2.0,
+ "rnb": 2.0,
+ "acoustic": 4.0,
+ "alternative": 4.0,
+ "female vocalist": 4.0,
+ "00s": 2.0,
+ "female vocalists": 81.0,
+ "Love": 2.0,
+ "folk": 2.0
+ }
+ },
+ {
+ "description": "xxxtentacion",
+ "features": {
+ "american": 11.0,
+ "experimental": 7.0,
+ "punk rock": 4.0,
+ "rap": 80.0,
+ "folk": 4.0,
+ "rock": 7.0,
+ "pop": 4.0,
+ "heavy metal": 4.0,
+ "seen live": 4.0,
+ "rnb": 7.0,
+ "emo": 49.0,
+ "soul": 4.0,
+ "hip hop": 32.0,
+ "new wave": 4.0,
+ "hardcore": 4.0,
+ "Hip-Hop": 100.0,
+ "alternative": 11.0,
+ "alternative rock": 7.0
+ }
+ },
+ {
+ "description": "The 1975",
+ "features": {
+ "male vocalists": 5.0,
+ "british": 69.0,
+ "experimental": 2.0,
+ "indie rock": 98.0,
+ "Love": 1.0,
+ "indie": 100.0,
+ "emo": 1.0,
+ "ambient": 1.0,
+ "rock": 21.0,
+ "pop": 9.0,
+ "post-rock": 1.0,
+ "synthpop": 5.0,
+ "new wave": 4.0,
+ "electronic": 3.0,
+ "britpop": 1.0,
+ "indie pop": 17.0,
+ "seen live": 73.0,
+ "alternative": 69.0,
+ "alternative rock": 20.0,
+ "00s": 1.0,
+ "funk": 1.0
+ }
+ },
+ {
+ "description": "Depeche Mode",
+ "features": {
+ "indie": 3.0,
+ "favorites": 1.0,
+ "male vocalists": 2.0,
+ "british": 13.0,
+ "ambient": 1.0,
+ "experimental": 1.0,
+ "classic rock": 2.0,
+ "rock": 16.0,
+ "electronica": 11.0,
+ "pop": 9.0,
+ "electro": 3.0,
+ "synthpop": 56.0,
+ "electronic": 100.0,
+ "new wave": 87.0,
+ "dance": 3.0,
+ "britpop": 2.0,
+ "seen live": 22.0,
+ "techno": 1.0,
+ "alternative": 20.0,
+ "Gothic": 2.0,
+ "post-punk": 4.0,
+ "alternative rock": 5.0,
+ "industrial": 3.0,
+ "00s": 2.0,
+ "80s": 59.0,
+ "90s": 4.0
+ }
+ },
+ {
+ "description": "The White Stripes",
+ "features": {
+ "indie": 59.0,
+ "favorites": 2.0,
+ "male vocalists": 1.0,
+ "singer-songwriter": 1.0,
+ "american": 8.0,
+ "experimental": 1.0,
+ "blues": 13.0,
+ "classic rock": 3.0,
+ "rock": 100.0,
+ "pop": 2.0,
+ "punk rock": 2.0,
+ "indie rock": 47.0,
+ "seen live": 25.0,
+ "Grunge": 1.0,
+ "alternative": 74.0,
+ "metal": 1.0,
+ "guitar": 2.0,
+ "Progressive rock": 1.0,
+ "alternative rock": 65.0,
+ "00s": 3.0,
+ "punk": 5.0,
+ "hard rock": 3.0,
+ "folk": 2.0,
+ "90s": 2.0
+ }
+ },
+ {
+ "description": "The Clash",
+ "features": {
+ "indie": 5.0,
+ "british": 43.0,
+ "classic rock": 29.0,
+ "rock": 43.0,
+ "pop": 1.0,
+ "punk rock": 71.0,
+ "indie rock": 2.0,
+ "new wave": 4.0,
+ "alternative": 9.0,
+ "post-punk": 3.0,
+ "alternative rock": 2.0,
+ "punk": 100.0,
+ "hard rock": 1.0,
+ "70s": 8.0,
+ "80s": 13.0,
+ "reggae": 6.0
+ }
+ }
+]
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json b/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json
new file mode 100644
index 0000000000..4d684b2fc0
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/resources/kmeans/lastfm.json
@@ -0,0 +1,490 @@
+{
+ "children": [
+ {
+ "children": [
+ {
+ "name": "Radiohead"
+ },
+ {
+ "name": "Red Hot Chili Peppers"
+ },
+ {
+ "name": "Coldplay"
+ },
+ {
+ "name": "Nirvana"
+ },
+ {
+ "name": "Panic! at the Disco"
+ },
+ {
+ "name": "The Cure"
+ },
+ {
+ "name": "Linkin Park"
+ },
+ {
+ "name": "Radiohead"
+ },
+ {
+ "name": "Red Hot Chili Peppers"
+ },
+ {
+ "name": "Coldplay"
+ },
+ {
+ "name": "Nirvana"
+ },
+ {
+ "name": "Panic! at the Disco"
+ },
+ {
+ "name": "The Cure"
+ },
+ {
+ "name": "Linkin Park"
+ },
+ {
+ "name": "Muse"
+ },
+ {
+ "name": "Maroon 5"
+ },
+ {
+ "name": "Foo Fighters"
+ },
+ {
+ "name": "Paramore"
+ },
+ {
+ "name": "Oasis"
+ },
+ {
+ "name": "Fall Out Boy"
+ },
+ {
+ "name": "OneRepublic"
+ },
+ {
+ "name": "Weezer"
+ },
+ {
+ "name": "System of a Down"
+ },
+ {
+ "name": "The White Stripes"
+ }
+ ],
+ "name": "rock, alternative"
+ },
+ {
+ "children": [
+ {
+ "name": "Lil Nas X"
+ },
+ {
+ "name": "Post Malone"
+ },
+ {
+ "name": "Drake"
+ },
+ {
+ "name": "Kanye West"
+ },
+ {
+ "name": "Kendrick Lamar"
+ },
+ {
+ "name": "Tyler, the Creator"
+ },
+ {
+ "name": "Eminem"
+ },
+ {
+ "name": "Childish Gambino"
+ },
+ {
+ "name": "Frank Ocean"
+ },
+ {
+ "name": "Lil Nas X"
+ },
+ {
+ "name": "Post Malone"
+ },
+ {
+ "name": "Drake"
+ },
+ {
+ "name": "Kanye West"
+ },
+ {
+ "name": "Kendrick Lamar"
+ },
+ {
+ "name": "Tyler, the Creator"
+ },
+ {
+ "name": "Eminem"
+ },
+ {
+ "name": "Childish Gambino"
+ },
+ {
+ "name": "Frank Ocean"
+ },
+ {
+ "name": "Lizzo"
+ },
+ {
+ "name": "Travi$ Scott"
+ },
+ {
+ "name": "A$AP Rocky"
+ },
+ {
+ "name": "Nicki Minaj"
+ },
+ {
+ "name": "xxxtentacion"
+ }
+ ],
+ "name": "Hip-Hop, rap"
+ },
+ {
+ "children": [
+ {
+ "name": "Arctic Monkeys"
+ },
+ {
+ "name": "Imagine Dragons"
+ },
+ {
+ "name": "The Killers"
+ },
+ {
+ "name": "Gorillaz"
+ },
+ {
+ "name": "The Black Keys"
+ },
+ {
+ "name": "Arctic Monkeys"
+ },
+ {
+ "name": "Imagine Dragons"
+ },
+ {
+ "name": "The Killers"
+ },
+ {
+ "name": "Gorillaz"
+ },
+ {
+ "name": "The Black Keys"
+ },
+ {
+ "name": "Twenty One Pilots"
+ },
+ {
+ "name": "Ellie Goulding"
+ },
+ {
+ "name": "Florence + the Machine"
+ },
+ {
+ "name": "Vampire Weekend"
+ },
+ {
+ "name": "The Smiths"
+ },
+ {
+ "name": "The Strokes"
+ },
+ {
+ "name": "MGMT"
+ },
+ {
+ "name": "Foster the People"
+ },
+ {
+ "name": "Two Door Cinema Club"
+ },
+ {
+ "name": "Cage the Elephant"
+ },
+ {
+ "name": "Arcade Fire"
+ },
+ {
+ "name": "The 1975"
+ }
+ ],
+ "name": "indie, alternative"
+ },
+ {
+ "children": [
+ {
+ "name": "Ed Sheeran"
+ },
+ {
+ "name": "Tame Impala"
+ },
+ {
+ "name": "Ed Sheeran"
+ },
+ {
+ "name": "Tame Impala"
+ },
+ {
+ "name": "Green Day"
+ },
+ {
+ "name": "Metallica"
+ },
+ {
+ "name": "blink-182"
+ },
+ {
+ "name": "Bon Iver"
+ },
+ {
+ "name": "The Clash"
+ }
+ ],
+ "name": "rock, punk rock"
+ },
+ {
+ "children": [
+ {
+ "name": "Calvin Harris"
+ },
+ {
+ "name": "The Weeknd"
+ },
+ {
+ "name": "The Chainsmokers"
+ },
+ {
+ "name": "Daft Punk"
+ },
+ {
+ "name": "Marshmello"
+ },
+ {
+ "name": "David Guetta"
+ },
+ {
+ "name": "Calvin Harris"
+ },
+ {
+ "name": "The Weeknd"
+ },
+ {
+ "name": "The Chainsmokers"
+ },
+ {
+ "name": "Daft Punk"
+ },
+ {
+ "name": "Marshmello"
+ },
+ {
+ "name": "David Guetta"
+ },
+ {
+ "name": "Avicii"
+ },
+ {
+ "name": "Kygo"
+ },
+ {
+ "name": "Martin Garrix"
+ },
+ {
+ "name": "Major Lazer"
+ },
+ {
+ "name": "Depeche Mode"
+ }
+ ],
+ "name": "electronic, dance"
+ },
+ {
+ "children": [
+ {
+ "name": "Queen"
+ },
+ {
+ "name": "The Beatles"
+ },
+ {
+ "name": "David Bowie"
+ },
+ {
+ "name": "Fleetwood Mac"
+ },
+ {
+ "name": "Pink Floyd"
+ },
+ {
+ "name": "The Rolling Stones"
+ },
+ {
+ "name": "Led Zeppelin"
+ },
+ {
+ "name": "Queen"
+ },
+ {
+ "name": "The Beatles"
+ },
+ {
+ "name": "David Bowie"
+ },
+ {
+ "name": "Fleetwood Mac"
+ },
+ {
+ "name": "Pink Floyd"
+ },
+ {
+ "name": "The Rolling Stones"
+ },
+ {
+ "name": "Led Zeppelin"
+ },
+ {
+ "name": "Elton John"
+ }
+ ],
+ "name": "classic rock, rock"
+ },
+ {
+ "children": [
+ {
+ "name": "Billie Eilish"
+ },
+ {
+ "name": "Ariana Grande"
+ },
+ {
+ "name": "Taylor Swift"
+ },
+ {
+ "name": "Beyoncé"
+ },
+ {
+ "name": "Shawn Mendes"
+ },
+ {
+ "name": "Rihanna"
+ },
+ {
+ "name": "Lana Del Rey"
+ },
+ {
+ "name": "Katy Perry"
+ },
+ {
+ "name": "Lady Gaga"
+ },
+ {
+ "name": "Miley Cyrus"
+ },
+ {
+ "name": "Mark Ronson"
+ },
+ {
+ "name": "Madonna"
+ },
+ {
+ "name": "Lorde"
+ },
+ {
+ "name": "Khalid"
+ },
+ {
+ "name": "Billie Eilish"
+ },
+ {
+ "name": "Ariana Grande"
+ },
+ {
+ "name": "Taylor Swift"
+ },
+ {
+ "name": "Beyoncé"
+ },
+ {
+ "name": "Shawn Mendes"
+ },
+ {
+ "name": "Rihanna"
+ },
+ {
+ "name": "Lana Del Rey"
+ },
+ {
+ "name": "Katy Perry"
+ },
+ {
+ "name": "Lady Gaga"
+ },
+ {
+ "name": "Miley Cyrus"
+ },
+ {
+ "name": "Mark Ronson"
+ },
+ {
+ "name": "Madonna"
+ },
+ {
+ "name": "Lorde"
+ },
+ {
+ "name": "Khalid"
+ },
+ {
+ "name": "Sia"
+ },
+ {
+ "name": "Sam Smith"
+ },
+ {
+ "name": "Halsey"
+ },
+ {
+ "name": "Michael Jackson"
+ },
+ {
+ "name": "Charli XCX"
+ },
+ {
+ "name": "Britney Spears"
+ },
+ {
+ "name": "Dua Lipa"
+ },
+ {
+ "name": "Jonas Brothers"
+ },
+ {
+ "name": "Bruno Mars"
+ },
+ {
+ "name": "Carly Rae Jepsen"
+ },
+ {
+ "name": "P!nk"
+ },
+ {
+ "name": "Adele"
+ }
+ ],
+ "name": "pop, female vocalists"
+ }
+ ],
+ "name": "Musicians"
+}
diff --git a/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html b/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html
new file mode 100644
index 0000000000..e7e7403871
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/main/resources/kmeans/radial.html
@@ -0,0 +1,68 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java
new file mode 100644
index 0000000000..aa22fc5353
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/breadthfirstsearch/BreadthFirstSearchAlgorithmUnitTest.java
@@ -0,0 +1,86 @@
+package com.baeldung.algorithms.breadthfirstsearch;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class BreadthFirstSearchAlgorithmUnitTest {
+
+ private Tree root;
+ private Tree rootFirstChild;
+ private Tree depthMostChild;
+ private Tree rootSecondChild;
+
+ private Node start;
+ private Node firstNeighbor;
+ private Node firstNeighborNeighbor;
+ private Node secondNeighbor;
+
+ @Test
+ void givenTree_whenSearchTen_thenRoot() {
+ initTree();
+ assertThat(BreadthFirstSearchAlgorithm.search(10, root)).isPresent().contains(root);
+ }
+
+ @Test
+ void givenTree_whenSearchThree_thenDepthMostValue() {
+ initTree();
+ assertThat(BreadthFirstSearchAlgorithm.search(3, root)).isPresent().contains(depthMostChild);
+ }
+
+ @Test
+ void givenTree_whenSearchFour_thenRootSecondChild() {
+ initTree();
+ assertThat(BreadthFirstSearchAlgorithm.search(4, root)).isPresent().contains(rootSecondChild);
+ }
+
+ @Test
+ void givenTree_whenSearchFive_thenNotFound() {
+ initTree();
+ assertThat(BreadthFirstSearchAlgorithm.search(5, root)).isEmpty();
+ }
+
+ private void initTree() {
+ root = Tree.of(10);
+ rootFirstChild = root.addChild(2);
+ depthMostChild = rootFirstChild.addChild(3);
+ rootSecondChild = root.addChild(4);
+ }
+
+ @Test
+ void givenNode_whenSearchTen_thenStart() {
+ initNode();
+ assertThat(BreadthFirstSearchAlgorithm.search(10, firstNeighborNeighbor)).isPresent().contains(start);
+ }
+
+ @Test
+ void givenNode_whenSearchThree_thenNeighborNeighbor() {
+ initNode();
+ assertThat(BreadthFirstSearchAlgorithm.search(3, firstNeighborNeighbor)).isPresent().contains(firstNeighborNeighbor);
+ }
+
+ @Test
+ void givenNode_whenSearchFour_thenSecondNeighbor() {
+ initNode();
+ assertThat(BreadthFirstSearchAlgorithm.search(4, firstNeighborNeighbor)).isPresent().contains(secondNeighbor);
+ }
+
+ @Test
+ void givenNode_whenSearchFive_thenNotFound() {
+ initNode();
+ assertThat(BreadthFirstSearchAlgorithm.search(5, firstNeighborNeighbor)).isEmpty();
+ }
+
+ private void initNode() {
+ start = new Node<>(10);
+ firstNeighbor = new Node<>(2);
+ start.connect(firstNeighbor);
+
+ firstNeighborNeighbor = new Node<>(3);
+ firstNeighbor.connect(firstNeighborNeighbor);
+ firstNeighborNeighbor.connect(start);
+
+ secondNeighbor = new Node<>(4);
+ start.connect(secondNeighbor);
+ }
+}
\ No newline at end of file
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java
new file mode 100644
index 0000000000..8ad962055e
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.algorithms.interpolationsearch;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class InterpolationSearchUnitTest {
+
+ private int[] myData;
+
+ @Before
+ public void setUp() {
+ myData = new int[]{13,21,34,55,69,73,84,101};
+ }
+
+ @Test
+ public void givenSortedArray_whenLookingFor84_thenReturn6() {
+ int pos = InterpolationSearch.interpolationSearch(myData, 84);
+ assertEquals(6, pos);
+ }
+
+ @Test
+ public void givenSortedArray_whenLookingFor19_thenReturnMinusOne() {
+ int pos = InterpolationSearch.interpolationSearch(myData, 19);
+ assertEquals(-1, pos);
+ }
+
+}
diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
new file mode 100644
index 0000000000..97e99290c9
--- /dev/null
+++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/printtriangles/PrintTriangleExamplesUnitTest.java
@@ -0,0 +1,101 @@
+package com.baeldung.algorithms.printtriangles;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(JUnitParamsRunner.class)
+public class PrintTriangleExamplesUnitTest {
+
+ private static Object[][] rightTriangles() {
+ String expected0 = "";
+
+ String expected2 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator();
+
+ String expected5 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator()
+ + "***" + System.lineSeparator()
+ + "****" + System.lineSeparator()
+ + "*****" + System.lineSeparator();
+
+ String expected7 = "*" + System.lineSeparator()
+ + "**" + System.lineSeparator()
+ + "***" + System.lineSeparator()
+ + "****" + System.lineSeparator()
+ + "*****" + System.lineSeparator()
+ + "******" + System.lineSeparator()
+ + "*******" + System.lineSeparator();
+
+ return new Object[][] {
+ { 0, expected0 },
+ { 2, expected2 },
+ { 5, expected5 },
+ { 7, expected7 }
+ };
+ }
+
+ @Test
+ @Parameters(method = "rightTriangles")
+ public void whenPrintARightTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printARightTriangle(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+ private static Object[][] isoscelesTriangles() {
+ String expected0 = "";
+
+ String expected2 = " *" + System.lineSeparator()
+ + "***" + System.lineSeparator();
+
+ String expected5 = " *" + System.lineSeparator()
+ + " ***" + System.lineSeparator()
+ + " *****" + System.lineSeparator()
+ + " *******" + System.lineSeparator()
+ + "*********" + System.lineSeparator();
+
+ String expected7 = " *" + System.lineSeparator()
+ + " ***" + System.lineSeparator()
+ + " *****" + System.lineSeparator()
+ + " *******" + System.lineSeparator()
+ + " *********" + System.lineSeparator()
+ + " ***********" + System.lineSeparator()
+ + "*************" + System.lineSeparator();
+
+ return new Object[][] {
+ { 0, expected0 },
+ { 2, expected2 },
+ { 5, expected5 },
+ { 7, expected7 }
+ };
+ }
+
+ @Test
+ @Parameters(method = "isoscelesTriangles")
+ public void whenPrintAnIsoscelesTriangleIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printAnIsoscelesTriangle(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ @Parameters(method = "isoscelesTriangles")
+ public void whenPrintAnIsoscelesTriangleUsingStringUtilsIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printAnIsoscelesTriangleUsingStringUtils(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ @Parameters(method = "isoscelesTriangles")
+ public void whenPrintAnIsoscelesTriangleUsingSubstringIsCalled_ThenTheCorrectStringIsReturned(int nrOfRows, String expected) {
+ String actual = PrintTriangleExamples.printAnIsoscelesTriangleUsingSubstring(nrOfRows);
+
+ assertEquals(expected, actual);
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java
rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java
diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-miscellaneous-4/README.md
new file mode 100644
index 0000000000..6aad9a43e4
--- /dev/null
+++ b/algorithms-miscellaneous-4/README.md
@@ -0,0 +1,15 @@
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
+
+- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm)
+- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms)
+- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters)
+- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element)
+- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings)
+- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters)
+- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-3) [[next -->]](/../algorithms-miscellaneous-5)
diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-miscellaneous-4/pom.xml
new file mode 100644
index 0000000000..8fd8f807ba
--- /dev/null
+++ b/algorithms-miscellaneous-4/pom.xml
@@ -0,0 +1,51 @@
+
+ 4.0.0
+ algorithms-miscellaneous-4
+ 0.0.1-SNAPSHOT
+ algorithms-miscellaneous-4
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ org.assertj
+ assertj-core
+ ${org.assertj.core.version}
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+
+
+
+
+ 3.9.0
+ 27.0.1-jre
+
+
+
\ No newline at end of file
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java
diff --git a/JGit/src/main/resources/logback.xml b/algorithms-miscellaneous-4/src/main/resources/logback.xml
similarity index 100%
rename from JGit/src/main/resources/logback.xml
rename to algorithms-miscellaneous-4/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
similarity index 100%
rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java
diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md
new file mode 100644
index 0000000000..7a8f2e0a36
--- /dev/null
+++ b/algorithms-miscellaneous-5/README.md
@@ -0,0 +1,11 @@
+## Algorithms - Miscellaneous
+
+This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/../algorithms-sorting) and
+[genetic algorithms](/../algorithms-genetic), have their own dedicated modules.
+
+### Relevant articles:
+
+- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings)
+- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree)
+- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers)
+- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml
new file mode 100644
index 0000000000..d17f93e6e0
--- /dev/null
+++ b/algorithms-miscellaneous-5/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ algorithms-miscellaneous-5
+ 0.0.1-SNAPSHOT
+ algorithms-miscellaneous-5
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ pl.allegro.finance
+ tradukisto
+ ${tradukisto.version}
+
+
+ org.assertj
+ assertj-core
+ ${org.assertj.core.version}
+ test
+
+
+
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+
+
+
+
+
+ 1.0.1
+ 3.9.0
+ 1.11
+
+
+
\ No newline at end of file
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java
diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
new file mode 100644
index 0000000000..61c3f05a95
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/knapsack/Knapsack.java
@@ -0,0 +1,36 @@
+package com.baeldung.algorithms.knapsack;
+
+public class Knapsack {
+
+ public int knapsackRec(int[] w, int[] v, int n, int W) {
+ if (n <= 0) {
+ return 0;
+ } else if (w[n - 1] > W) {
+ return knapsackRec(w, v, n - 1, W);
+ } else {
+ return Math.max(knapsackRec(w, v, n - 1, W), v[n - 1] + knapsackRec(w, v, n - 1, W - w[n - 1]));
+ }
+ }
+
+ public int knapsackDP(int[] w, int[] v, int n, int W) {
+ if (n <= 0 || W <= 0) {
+ return 0;
+ }
+
+ int[][] m = new int[n + 1][W + 1];
+ for (int j = 0; j <= W; j++) {
+ m[0][j] = 0;
+ }
+
+ for (int i = 1; i <= n; i++) {
+ for (int j = 1; j <= W; j++) {
+ if (w[i - 1] > j) {
+ m[i][j] = m[i - 1][j];
+ } else {
+ m[i][j] = Math.max(m[i - 1][j], m[i - 1][j - w[i - 1]] + v[i - 1]);
+ }
+ }
+ }
+ return m[n][W];
+ }
+}
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java
diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java
diff --git a/Twitter4J/src/main/resources/logback.xml b/algorithms-miscellaneous-5/src/main/resources/logback.xml
similarity index 100%
rename from Twitter4J/src/main/resources/logback.xml
rename to algorithms-miscellaneous-5/src/main/resources/logback.xml
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java
diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
new file mode 100644
index 0000000000..b168e6b1eb
--- /dev/null
+++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/knapsack/KnapsackUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.algorithms.knapsack;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class KnapsackUnitTest {
+
+ @Test
+ public void givenWeightsandValues_whenCalculateMax_thenOutputCorrectResult() {
+ final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 };
+ final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 };
+ final int n = 10;
+ final int W = 67;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(1270, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(1270, knapsack.knapsackDP(w, v, n, W));
+ }
+
+ @Test
+ public void givenZeroItems_whenCalculateMax_thenOutputZero() {
+ final int[] w = new int[] {};
+ final int[] v = new int[] {};
+ final int n = 0;
+ final int W = 67;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(0, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(0, knapsack.knapsackDP(w, v, n, W));
+ }
+
+ @Test
+ public void givenZeroWeightLimit_whenCalculateMax_thenOutputZero() {
+ final int[] w = new int[] { 23, 26, 20, 18, 32, 27, 29, 26, 30, 27 };
+ final int[] v = new int[] { 505, 352, 458, 220, 354, 414, 498, 545, 473, 543 };
+ final int n = 10;
+ final int W = 0;
+ final Knapsack knapsack = new Knapsack();
+
+ assertEquals(0, knapsack.knapsackRec(w, v, n, W));
+ assertEquals(0, knapsack.knapsackDP(w, v, n, W));
+ }
+}
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java
diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
similarity index 100%
rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java
diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md
index 36460293b0..3f27cfea49 100644
--- a/algorithms-sorting/README.md
+++ b/algorithms-sorting/README.md
@@ -1,7 +1,19 @@
-## Relevant articles:
+## Algorithms - Sorting
-- [Bubble Sort in Java](http://www.baeldung.com/java-bubble-sort)
+This module contains articles about sorting algorithms.
+
+### Relevant articles:
+
+- [Bubble Sort in Java](https://www.baeldung.com/java-bubble-sort)
- [Merge Sort in Java](https://www.baeldung.com/java-merge-sort)
- [Quicksort Algorithm Implementation in Java](https://www.baeldung.com/java-quicksort)
- [Insertion Sort in Java](https://www.baeldung.com/java-insertion-sort)
- [Heap Sort in Java](https://www.baeldung.com/java-heap-sort)
+- [Shell Sort in Java](https://www.baeldung.com/java-shell-sort)
+- [Counting Sort in Java](https://www.baeldung.com/java-counting-sort)
+- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
+- [How an In-Place Sorting Algorithm Works](https://www.baeldung.com/java-in-place-sorting)
+- [Selection Sort in Java](https://www.baeldung.com/java-selection-sort)
+- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
+- [Radix Sort in Java](https://www.baeldung.com/java-radix-sort)
+- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml
index b25adf05a8..5bb19a8069 100644
--- a/algorithms-sorting/pom.xml
+++ b/algorithms-sorting/pom.xml
@@ -28,6 +28,12 @@
${lombok.version}
provided
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter-api.version}
+ test
+
org.assertj
assertj-core
@@ -52,6 +58,7 @@
3.6.1
3.9.0
1.11
+ 5.3.1
\ No newline at end of file
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
new file mode 100644
index 0000000000..002d4997f4
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java
@@ -0,0 +1,68 @@
+package com.baeldung.bucketsort;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class IntegerBucketSorter implements Sorter {
+
+ private final Comparator comparator;
+
+ public IntegerBucketSorter(Comparator comparator) {
+ this.comparator = comparator;
+ }
+
+ public IntegerBucketSorter() {
+ comparator = Comparator.naturalOrder();
+ }
+
+ public List sort(List arrayToSort) {
+
+ List> buckets = splitIntoUnsortedBuckets(arrayToSort);
+
+ for(List bucket : buckets){
+ bucket.sort(comparator);
+ }
+
+ return concatenateSortedBuckets(buckets);
+ }
+
+ private List concatenateSortedBuckets(List> buckets){
+ List sortedArray = new LinkedList<>();
+ for(List bucket : buckets){
+ sortedArray.addAll(bucket);
+ }
+ return sortedArray;
+ }
+
+ private List> splitIntoUnsortedBuckets(List initialList){
+
+ final int max = findMax(initialList);
+ final int numberOfBuckets = (int) Math.sqrt(initialList.size());
+
+ List> buckets = new ArrayList<>();
+ for(int i = 0; i < numberOfBuckets; i++) buckets.add(new ArrayList<>());
+
+ //distribute the data
+ for (int i : initialList) {
+ buckets.get(hash(i, max, numberOfBuckets)).add(i);
+ }
+ return buckets;
+
+ }
+
+ private int findMax(List input){
+ int m = Integer.MIN_VALUE;
+ for (int i : input){
+ m = Math.max(i, m);
+ }
+ return m;
+ }
+
+ private static int hash(int i, int max, int numberOfBuckets) {
+ return (int) ((double) i / max * (numberOfBuckets - 1));
+ }
+
+
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
new file mode 100644
index 0000000000..b86f60324f
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java
@@ -0,0 +1,8 @@
+package com.baeldung.bucketsort;
+
+import java.util.List;
+
+public interface Sorter {
+
+ List sort(List arrayToSort);
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java
new file mode 100644
index 0000000000..823f372849
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java
@@ -0,0 +1,48 @@
+package com.baeldung.algorithms.counting;
+
+import java.util.Arrays;
+import java.util.stream.IntStream;
+
+public class CountingSort {
+
+ public static int[] sort(int[] input, int k) {
+ verifyPreconditions(input, k);
+ if (input.length == 0) return input;
+
+ int[] c = countElements(input, k);
+ int[] sorted = new int[input.length];
+ for (int i = input.length - 1; i >= 0; i--) {
+ int current = input[i];
+ sorted[c[current] - 1] = current;
+ c[current] -= 1;
+ }
+
+ return sorted;
+ }
+
+ static int[] countElements(int[] input, int k) {
+ int[] c = new int[k + 1];
+ Arrays.fill(c, 0);
+ for (int i : input) {
+ c[i] += 1;
+ }
+
+ for (int i = 1; i < c.length; i++) {
+ c[i] += c[i - 1];
+ }
+ return c;
+ }
+
+ private static void verifyPreconditions(int[] input, int k) {
+ if (input == null) {
+ throw new IllegalArgumentException("Input is required");
+ }
+
+ int min = IntStream.of(input).min().getAsInt();
+ int max = IntStream.of(input).max().getAsInt();
+
+ if (min < 0 || max > k) {
+ throw new IllegalArgumentException("The input numbers should be between zero and " + k);
+ }
+ }
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java
new file mode 100644
index 0000000000..5ba225cead
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/inoutsort/InOutSort.java
@@ -0,0 +1,25 @@
+package com.baeldung.algorithms.inoutsort;
+
+public class InOutSort {
+
+ public static int[] reverseInPlace(int A[]) {
+ int n = A.length;
+ for (int i = 0; i < n / 2; i++) {
+ int temp = A[i];
+ A[i] = A[n - 1 - i];
+ A[n - 1 - i] = temp;
+ }
+
+ return A;
+ }
+
+ public static int[] reverseOutOfPlace(int A[]) {
+ int n = A.length;
+ int[] B = new int[n];
+ for (int i = 0; i < n; i++) {
+ B[n - i - 1] = A[i];
+ }
+
+ return B;
+ }
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
new file mode 100644
index 0000000000..723a2f5a80
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java
@@ -0,0 +1,53 @@
+package com.baeldung.algorithms.radixsort;
+
+import java.util.Arrays;
+
+public class RadixSort {
+
+ public static void sort(int numbers[]) {
+ int maximumNumber = findMaximumNumberIn(numbers);
+
+ int numberOfDigits = calculateNumberOfDigitsIn(maximumNumber);
+
+ int placeValue = 1;
+
+ while (numberOfDigits-- > 0) {
+ applyCountingSortOn(numbers, placeValue);
+ placeValue *= 10;
+ }
+ }
+
+ private static void applyCountingSortOn(int[] numbers, int placeValue) {
+ int range = 10; // radix or the base
+
+ int length = numbers.length;
+ int[] frequency = new int[range];
+ int[] sortedValues = new int[length];
+
+ for (int i = 0; i < length; i++) {
+ int digit = (numbers[i] / placeValue) % range;
+ frequency[digit]++;
+ }
+
+ for (int i = 1; i < range; i++) {
+ frequency[i] += frequency[i - 1];
+ }
+
+ for (int i = length - 1; i >= 0; i--) {
+ int digit = (numbers[i] / placeValue) % range;
+ sortedValues[frequency[digit] - 1] = numbers[i];
+ frequency[digit]--;
+ }
+
+ System.arraycopy(sortedValues, 0, numbers, 0, length);
+ }
+
+ private static int calculateNumberOfDigitsIn(int number) {
+ return (int) Math.log10(number) + 1; // valid only if number > 0
+ }
+
+ private static int findMaximumNumberIn(int[] arr) {
+ return Arrays.stream(arr).max().getAsInt();
+ }
+
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java
new file mode 100644
index 0000000000..17e95edf06
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java
@@ -0,0 +1,38 @@
+package com.baeldung.algorithms.selectionsort;
+
+public class SelectionSort {
+
+ public static void sortAscending(final int[] arr) {
+ for (int i = 0; i < arr.length - 1; i++) {
+ int minElementIndex = i;
+ for (int j = i + 1; j < arr.length; j++) {
+ if (arr[minElementIndex] > arr[j]) {
+ minElementIndex = j;
+ }
+ }
+
+ if (minElementIndex != i) {
+ int temp = arr[i];
+ arr[i] = arr[minElementIndex];
+ arr[minElementIndex] = temp;
+ }
+ }
+ }
+
+ public static void sortDescending(final int[] arr) {
+ for (int i = 0; i < arr.length - 1; i++) {
+ int maxElementIndex = i;
+ for (int j = i + 1; j < arr.length; j++) {
+ if (arr[maxElementIndex] < arr[j]) {
+ maxElementIndex = j;
+ }
+ }
+
+ if (maxElementIndex != i) {
+ int temp = arr[i];
+ arr[i] = arr[maxElementIndex];
+ arr[maxElementIndex] = temp;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java
new file mode 100644
index 0000000000..c130e2d866
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/shellsort/ShellSort.java
@@ -0,0 +1,20 @@
+package com.baeldung.algorithms.shellsort;
+
+public class ShellSort {
+
+ public static void sort(int arrayToSort[]) {
+ int n = arrayToSort.length;
+
+ for (int gap = n / 2; gap > 0; gap /= 2) {
+ for (int i = gap; i < n; i++) {
+ int key = arrayToSort[i];
+ int j = i;
+ while (j >= gap && arrayToSort[j - gap] > key) {
+ arrayToSort[j] = arrayToSort[j - gap];
+ j -= gap;
+ }
+ arrayToSort[j] = key;
+ }
+ }
+ }
+}
diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java
new file mode 100644
index 0000000000..b177bd60fc
--- /dev/null
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparators.java
@@ -0,0 +1,30 @@
+package com.baeldung.algorithms.sort.bynumber;
+
+import java.util.Comparator;
+
+public final class NaturalOrderComparators {
+
+ private static final String DIGIT_AND_DECIMAL_REGEX = "[^\\d.]";
+
+ private NaturalOrderComparators() {
+ throw new AssertionError("Let's keep this static");
+ }
+
+ public static Comparator createNaturalOrderRegexComparator() {
+ return Comparator.comparingDouble(NaturalOrderComparators::parseStringToNumber);
+ }
+
+ private static double parseStringToNumber(String input){
+
+ final String digitsOnly = input.replaceAll(DIGIT_AND_DECIMAL_REGEX, "");
+
+ if("".equals(digitsOnly)) return 0;
+
+ try{
+ return Double.parseDouble(digitsOnly);
+ }catch (NumberFormatException nfe){
+ return 0;
+ }
+ }
+
+}
diff --git a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
similarity index 93%
rename from java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
rename to algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
index c4f684383d..67b5e5facc 100644
--- a/java-strings/src/main/java/com/baeldung/string/sorting/AnagramValidator.java
+++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/stringsort/AnagramValidator.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
import java.util.Arrays;
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
new file mode 100644
index 0000000000..2773d8a68f
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.bucketsort;
+
+import com.baeldung.bucketsort.IntegerBucketSorter;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+public class IntegerBucketSorterUnitTest {
+
+ private IntegerBucketSorter sorter;
+
+ @Before
+ public void setUp() throws Exception {
+ sorter = new IntegerBucketSorter();
+ }
+
+ @Test
+ public void givenUnsortedList_whenSortedUsingBucketSorter_checkSortingCorrect() {
+
+ List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15);
+ List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602);
+
+ List actual = sorter.sort(unsorted);
+
+ assertEquals(expected, actual);
+
+
+ }
+}
\ No newline at end of file
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java
new file mode 100644
index 0000000000..ec6cf0784e
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.algorithms.counting;
+
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+
+import org.junit.jupiter.api.Test;
+
+class CountingSortUnitTest {
+
+ @Test
+ void countElements_GivenAnArray_ShouldCalculateTheFrequencyArrayAsExpected() {
+ int k = 5;
+ int[] input = { 4, 3, 2, 5, 4, 3, 5, 1, 0, 2, 5 };
+
+ int[] c = CountingSort.countElements(input, k);
+ int[] expected = { 1, 2, 4, 6, 8, 11 };
+ assertArrayEquals(expected, c);
+ }
+
+ @Test
+ void sort_GivenAnArray_ShouldSortTheInputAsExpected() {
+ int k = 5;
+ int[] input = { 4, 3, 2, 5, 4, 3, 5, 1, 0, 2, 5 };
+
+ int[] sorted = CountingSort.sort(input, k);
+
+ // Our sorting algorithm and Java's should return the same result
+ Arrays.sort(input);
+ assertArrayEquals(input, sorted);
+ }
+}
\ No newline at end of file
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java
new file mode 100644
index 0000000000..321b905f68
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/inoutsort/InOutSortUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.algorithms.inoutsort;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class InOutSortUnitTest {
+
+ @Test
+ public void givenArray_whenInPlaceSort_thenReversed() {
+ int[] input = {1, 2, 3, 4, 5, 6, 7};
+ int[] expected = {7, 6, 5, 4, 3, 2, 1};
+ assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseInPlace(input));
+ }
+
+ @Test
+ public void givenArray_whenOutOfPlaceSort_thenReversed() {
+ int[] input = {1, 2, 3, 4, 5, 6, 7};
+ int[] expected = {7, 6, 5, 4, 3, 2, 1};
+ assertArrayEquals("the two arrays are not equal", expected, InOutSort.reverseOutOfPlace(input));
+ }
+}
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
new file mode 100644
index 0000000000..0f6c751ade
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.radixsort;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class RadixSortUnitTest {
+
+ @Test
+ public void givenUnsortedArray_whenRadixSort_thenArraySorted() {
+ int[] numbers = { 387, 468, 134, 123, 68, 221, 769, 37, 7 };
+ RadixSort.sort(numbers);
+ int[] numbersSorted = { 7, 37, 68, 123, 134, 221, 387, 468, 769 };
+ assertArrayEquals(numbersSorted, numbers);
+ }
+}
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java
new file mode 100644
index 0000000000..85efd1d3da
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.algorithms.selectionsort;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class SelectionSortUnitTest {
+
+ @Test
+ public void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() {
+ int[] input = { 5, 4, 1, 6, 2 };
+ SelectionSort.sortAscending(input);
+ int[] expected = {1, 2, 4, 5, 6};
+ assertArrayEquals("the two arrays are not equal", expected, input);
+ }
+
+ @Test
+ public void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() {
+ int[] input = { 5, 4, 1, 6, 2 };
+ SelectionSort.sortDescending(input);
+ int[] expected = {6, 5, 4, 2, 1};
+ assertArrayEquals("the two arrays are not equal", expected, input);
+ }
+}
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java
new file mode 100644
index 0000000000..91a27c41d0
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/shellsort/ShellSortUnitTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.algorithms.shellsort;
+
+import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+
+import org.junit.Test;
+
+public class ShellSortUnitTest {
+
+ @Test
+ public void givenUnsortedArray_whenShellSort_thenSortedAsc() {
+ int[] input = {41, 15, 82, 5, 65, 19, 32, 43, 8};
+ ShellSort.sort(input);
+ int[] expected = {5, 8, 15, 19, 32, 41, 43, 65, 82};
+ assertArrayEquals("the two arrays are not equal", expected, input);
+ }
+}
diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java
new file mode 100644
index 0000000000..2f05f62147
--- /dev/null
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/sort/bynumber/NaturalOrderComparatorsUnitTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.algorithms.sort.bynumber;
+
+import com.baeldung.algorithms.sort.bynumber.NaturalOrderComparators;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class NaturalOrderComparatorsUnitTest {
+
+ @Test
+ public void givenSimpleStringsContainingIntsAndDoubles_whenSortedByRegex_checkSortingCorrect() {
+
+ List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.4", "d2.3d");
+
+ testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());
+
+ List expected = Arrays.asList("a1", "d2.2", "d2.3d", "d2.4", "b3", "c4");
+
+ assertEquals(expected, testStrings);
+
+
+ }
+
+ @Test
+ public void givenSimpleStringsContainingIntsAndDoublesWithAnInvalidNumber_whenSortedByRegex_checkSortingCorrect() {
+
+ List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.4", "d2.3.3d");
+
+ testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());
+
+ List expected = Arrays.asList("d2.3.3d", "a1", "d2.2", "d2.4", "b3", "c4");
+
+ assertEquals(expected, testStrings);
+
+
+ }
+
+ @Test
+ public void givenAllForseenProblems_whenSortedByRegex_checkSortingCorrect() {
+
+ List testStrings = Arrays.asList("a1", "b3", "c4", "d2.2", "d2.f4", "d2.3.3d");
+
+ testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());
+
+ List expected = Arrays.asList("d2.3.3d", "a1", "d2.2", "d2.f4", "b3", "c4");
+
+ assertEquals(expected, testStrings);
+
+
+ }
+
+ @Test
+ public void givenComplexStringsContainingSeparatedNumbers_whenSortedByRegex_checkNumbersCondensedAndSorted() {
+
+ List testStrings = Arrays.asList("a1b2c5", "b3ght3.2", "something65.thensomething5"); //125, 33.2, 65.5
+
+ List expected = Arrays.asList("b3ght3.2", "something65.thensomething5", "a1b2c5" );
+
+ testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());
+
+ assertEquals(expected, testStrings);
+
+ }
+
+ @Test
+ public void givenStringsNotContainingNumbers_whenSortedByRegex_checkOrderNotChanged() {
+
+ List testStrings = Arrays.asList("a", "c", "d", "e");
+ List expected = new ArrayList<>(testStrings);
+
+ testStrings.sort(NaturalOrderComparators.createNaturalOrderRegexComparator());
+
+ assertEquals(expected, testStrings);
+ }
+}
\ No newline at end of file
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
similarity index 86%
rename from java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
index 07d31c7187..25fc274dd8 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/AnagramValidatorUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/AnagramValidatorUnitTest.java
@@ -1,12 +1,10 @@
-package com.baeldung.string.sorting;
+package com.baeldung.algorithms.stringsort;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
import org.junit.jupiter.api.Test;
-import com.baeldung.string.sorting.AnagramValidator;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class AnagramValidatorUnitTest {
diff --git a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
similarity index 94%
rename from java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
index 90d1dad554..226de64f07 100644
--- a/java-strings/src/test/java/com/baeldung/string/sorting/SortStringUnitTest.java
+++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/stringsort/SortStringUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.sorting;
-
-import java.util.Arrays;
+package com.baeldung.algorithms.stringsort;
import org.junit.jupiter.api.Test;
+import java.util.Arrays;
+
import static org.assertj.core.api.Assertions.assertThat;
class SortStringUnitTest {
diff --git a/animal-sniffer-mvn-plugin/README.md b/animal-sniffer-mvn-plugin/README.md
index 4c7c381da4..52e319b399 100644
--- a/animal-sniffer-mvn-plugin/README.md
+++ b/animal-sniffer-mvn-plugin/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Animal Sniffer Maven Plugin
-[Introduction to Animal Sniffer Maven Plugin](http://www.baeldung.com/maven-animal-sniffer)
+This module contains articles about the Animal Sniffer Maven Plugin
+
+### Relevant articles:
+
+[Introduction to Animal Sniffer Maven Plugin](https://www.baeldung.com/maven-animal-sniffer)
diff --git a/animal-sniffer-mvn-plugin/pom.xml b/animal-sniffer-mvn-plugin/pom.xml
index 55e37e2ec4..fd8f6d3d8c 100644
--- a/animal-sniffer-mvn-plugin/pom.xml
+++ b/animal-sniffer-mvn-plugin/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
animal-sniffer-mvn-plugin
1.0-SNAPSHOT
animal-sniffer-mvn-plugin
diff --git a/annotations/README.md b/annotations/README.md
new file mode 100644
index 0000000000..ec4005fc5e
--- /dev/null
+++ b/annotations/README.md
@@ -0,0 +1,7 @@
+## Annotations
+
+This module contains articles about Java annotations
+
+### Relevant Articles:
+
+- [Java Annotation Processing and Creating a Builder](https://www.baeldung.com/java-annotation-processing-builder)
diff --git a/annotations/readme.md b/annotations/readme.md
deleted file mode 100644
index 2b052803e6..0000000000
--- a/annotations/readme.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Java Annotation Processing and Creating a Builder](http://www.baeldung.com/java-annotation-processing-builder)
diff --git a/antlr/README.md b/antlr/README.md
index 419d9ddfbb..1f394125c6 100644
--- a/antlr/README.md
+++ b/antlr/README.md
@@ -1,3 +1,7 @@
+## ANTLR
+
+This module contains articles about ANTLR
+
### Relevant Articles:
-- [Java with ANTLR](http://www.baeldung.com/java-antlr)
+- [Java with ANTLR](https://www.baeldung.com/java-antlr)
diff --git a/apache-avro/README.md b/apache-avro/README.md
index 32d84ecc76..b338e8e565 100644
--- a/apache-avro/README.md
+++ b/apache-avro/README.md
@@ -1,2 +1,6 @@
+## Apache Avro
+
+This module contains articles about Apache Avro
+
### Relevant Articles:
-- [Guide to Apache Avro](http://www.baeldung.com/java-apache-avro)
+- [Guide to Apache Avro](https://www.baeldung.com/java-apache-avro)
diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml
index e6fb4d24ff..6baae9c541 100644
--- a/apache-avro/pom.xml
+++ b/apache-avro/pom.xml
@@ -14,12 +14,6 @@
-
- junit
- junit
- ${junit.version}
- test
-
org.slf4j
slf4j-simple
@@ -46,15 +40,6 @@
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
org.apache.avro
avro-maven-plugin
@@ -79,8 +64,6 @@
- UTF-8
- 3.5
1.8.2
1.7.25
diff --git a/apache-bval/README.md b/apache-bval/README.md
index 80ea149993..e856810378 100644
--- a/apache-bval/README.md
+++ b/apache-bval/README.md
@@ -1,2 +1,7 @@
+## Apache BVal
+
+This module contains articles about Apache BVal
+
### Relevant Articles:
-- [Intro to Apache BVal](http://www.baeldung.com/apache-bval)
+
+- [Intro to Apache BVal](https://www.baeldung.com/apache-bval)
diff --git a/apache-curator/README.md b/apache-curator/README.md
index 9bda573292..4fef6a138e 100644
--- a/apache-curator/README.md
+++ b/apache-curator/README.md
@@ -1,3 +1,7 @@
+## Apache Curator
+
+This module contains articles about Apache Curator
+
### Relevant Articles:
-- [Introduction to Apache Curator](http://www.baeldung.com/apache-curator)
+- [Introduction to Apache Curator](https://www.baeldung.com/apache-curator)
diff --git a/apache-cxf/README.md b/apache-cxf/README.md
index d03999dce3..f825b85bb3 100644
--- a/apache-cxf/README.md
+++ b/apache-cxf/README.md
@@ -1,6 +1,10 @@
+## Apache CXF
+
+This module contains articles about Apache CXF
+
## Relevant Articles:
-- [Introduction to Apache CXF Aegis Data Binding](http://www.baeldung.com/aegis-data-binding-in-apache-cxf)
-- [Apache CXF Support for RESTful Web Services](http://www.baeldung.com/apache-cxf-rest-api)
-- [A Guide to Apache CXF with Spring](http://www.baeldung.com/apache-cxf-with-spring)
-- [Introduction to Apache CXF](http://www.baeldung.com/introduction-to-apache-cxf)
+- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
+- [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api)
+- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
+- [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf)
- [Server-Sent Events (SSE) In JAX-RS](https://www.baeldung.com/java-ee-jax-rs-sse)
diff --git a/apache-fop/README.md b/apache-fop/README.md
index 1e734a5f36..2adc593026 100644
--- a/apache-fop/README.md
+++ b/apache-fop/README.md
@@ -1,5 +1,5 @@
-=========
+## Apache FOP
-## Core Java Cookbooks and Examples
+This module contains articles about Apache FOP
### Relevant Articles:
diff --git a/apache-fop/pom.xml b/apache-fop/pom.xml
index 879eb4f111..150756d51d 100644
--- a/apache-fop/pom.xml
+++ b/apache-fop/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
apache-fop
0.1-SNAPSHOT
apache-fop
diff --git a/apache-fop/src/test/resources/input.xml b/apache-fop/src/test/resources/input.xml
deleted file mode 100644
index a8266f3f5c..0000000000
--- a/apache-fop/src/test/resources/input.xml
+++ /dev/null
@@ -1,1674 +0,0 @@
-
-
-
- Bootstrap a Web Application with Spring 4
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. The Maven pom.xml
-
-
- 3. The Java based Web Configuration
-
-
- 4. Conclusion
-
-
- If you're new here, you may want to get my "REST APIs with Spring" eBook. Thanks for visiting!
-
-
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. The Maven pom.xml
-
-
- Â Â Â 2.1. Justification of the cglib dependency
-
-
- Â Â Â 2.2. The cglib dependency in Spring 3.2 and beyond
-
-
- 3. The Java based web configuration
-
-
- Â Â 3.1. The web.xml
-
-
- 4. Conclusion
-
-
-
- 1. Overview
- The tutorial illustrates how to Bootstrap a Web Application with Spring and also discusses how to make the jump from XML to Java without having to completely migrate the entire XML configuration.
-
-
- 2. The Maven pom.xml
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- 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">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org</groupId>
- <artifactId>rest</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>war</packaging>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring.version}</version>
- <exclusions>
- <exclusion>
- <artifactId>commons-logging</artifactId>
- <groupId>commons-logging</groupId>
- </exclusion>
- </exclusions>
- </dependency>
-
- </dependencies>
-
- <build>
- <finalName>rest</finalName>
-
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <properties>
- <spring.version>4.0.5.RELEASE</spring.version>
- </properties>
-
-</project>
-
- 2.1. The cglib dependency before Spring 3.2
- You may wonder why cglib is a dependency – it turns out there is a valid reason to include it – the entire configuration cannot function without it. If removed, Spring will throw:
- Caused by: java.lang.IllegalStateException: CGLIB is required to process @Configuration classes. Either add CGLIB to the classpath or remove the following @Configuration bean definitions
- The reason this happens is explained by the way Spring deals with @Configuration classes. These classes are effectively beans, and because of this they need to be aware of the Context, and respect scope and other bean semantics. This is achieved by dynamically creating a cglib proxy with this awareness for each @Configuration class, hence the cglib dependency.
- Also, because of this, there are a few restrictions for Configuration annotated classes:
-
-
- Configuration classes should not be final
-
-
- They should have a constructor with no arguments
-
-
-
-
- 2.2. The cglib dependency in Spring 3.2 and beyond
- Starting with Spring 3.2, it is no longer necessary to add cglib as an explicit dependency . This is because Spring is in now inlining cglib – which will ensure that all class based proxying functionality will work out of the box with Spring 3.2.
- The new cglib code is placed under the Spring package: org.springframework.cglib (replacing the original net.sf.cglib ). The reason for the package change is to avoid conflicts with any cglib versions already existing on the classpath.
- Also, the new cglib 3.0 is now used, upgraded from the older 2.2 dependency (see this JIRA issue for more details).
- Finally, now that Spring 4.0 is out in the wild, changes like this one (removing the cglib dependency) are to be expected with Java 8 just around the corner – you can watch this Spring Jira to keep track of the Spring support, and the Java 8 Resources page to keep tabs on the that.
-
-
-
- 3. The Java based Web Configuration
- @Configuration
-@ImportResource( { "classpath*:/rest_config.xml" } )
-@ComponentScan( basePackages = "org.rest" )
-@PropertySource({ "classpath:rest.properties", "classpath:web.properties" })
-public class AppConfig{
-
- @Bean
-Â Â public static PropertySourcesPlaceholderConfigurer properties() {
-Â Â return new PropertySourcesPlaceholderConfigurer();
-Â Â }
-}
- First, the @Configuration annotation – this is the main artifact used by the Java based Spring configuration; it is itself meta-annotated with @Component , which makes the annotated classes standard beans and as such, also candidates for component scanning. The main purpose of @Configuration classes is to be sources of bean definitions for the Spring IoC Container. For a more detailed description, see the official docs.
- Then, @ImportResource is used to import the existing XML based Spring configuration. This may be configuration which is still being migrated from XML to Java, or simply legacy configuration that you wish to keep. Either way, importing it into the Container is essential for a successful migration, allowing small steps without to much risk. The equivalent XML annotation that is replaced is:
- <import resource=”classpath*:/rest_config.xml” />
- Moving on to @ComponentScan – this configures the component scanning directive, effectively replacing the XML:
- <context:component-scan base-package="org.rest" />
- As of Spring 3.1, the @Configuration are excluded from classpath scanning by default – see this JIRA issue. Before Spring 3.1 though, these classes should have been excluded explicitly:
- excludeFilters = { @ComponentScan.Filter( Configuration.class ) }
- The @Configuration classes should not be autodiscovered because they are already specified and used by the Container – allowing them to be rediscovered and introduced into the Spring context will result in the following error:
- Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘webConfig’ for bean class [org.rest.spring.AppConfig] conflicts with existing, non-compatible bean definition of same name and class [org.rest.spring.AppConfig]
- And finally, using the @Bean annotation to configure the properties support –Â PropertySourcesPlaceholderConfigurer is initialized in a @Bean annotated method, indicating it will produce a Spring bean managed by the Container. This new configuration has replaced the following XML:
- <context:property-placeholder
-location="classpath:persistence.properties, classpath:web.properties"
-ignore-unresolvable="true"/>
- For a more in depth discussion on why it was necessary to manually register the PropertySourcesPlaceholderConfigurer bean, see the Properties with Spring Tutorial.
-
- 3.1. The web.xml
- <?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="
- http://java.sun.com/xml/ns/javaee"
-Â Â Â xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-Â Â Â xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-Â Â Â xsi:schemaLocation="
- http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-Â Â Â id="rest" version="3.0">
-
- <context-param>
- <param-name>contextClass</param-name>
- <param-value>
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
- </param-value>
- </context-param>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>org.rest.spring.root</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
-
- <servlet>
- <servlet-name>rest</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <init-param>
- <param-name>contextClass</param-name>
- <param-value>
- org.springframework.web.context.support.AnnotationConfigWebApplicationContext
- </param-value>
- </init-param>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>org.rest.spring.rest</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>rest</servlet-name>
- <url-pattern>/api/*</url-pattern>
- </servlet-mapping>
-
- <welcome-file-list>
- <welcome-file />
- </welcome-file-list>
-
-</web-app>
- First, the root context is defined and configured to use AnnotationConfigWebApplicationContext instead of the default XmlWebApplicationContext . The newer AnnotationConfigWebApplicationContext accepts @Configuration annotated classes as input for the Container configuration and is needed in order to set up the Java based context. Unlike XmlWebApplicationContext , it assumes no default configuration class locations, so the “contextConfigLocation” init-param for the Servlet must be set. This will point to the java package where the @Configuration classes are located; the fully qualified name(s) of the classes are also supported.
- Next, the DispatcherServlet is configured to use the same kind of context, with the only difference that it’s loading configuration classes out of a different package.
- Other than this, the web.xml doesn’t really change from a XML to a Java based configuration.
-
-
-
- 4. Conclusion
- The presented approach allows for a smooth migration of the Spring configuration from XML to Java, mixing the old and the new. This is important for older projects, which may have a lot of XML based configuration that cannot be migrated all at once.
- This way, in a migration, the XML beans can be ported in small increments.
- In the next article on REST with Spring, I cover setting up MVC in the project, configuration of the HTTP status codes, payload marshalling and content negotiation.
- The implementation of this Bootstrap a Spring Web App Tutorial can be downloaded as a working sample project.
- This is an Eclipse based project, so it should be easy to import and run as it is.
-
- Â
-
-
-
-
-
-
-
-
- java, Spring
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Build a REST API with Spring 4 and Java Config
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Understanding REST in Spring
-
-
- 3. The Java configuration
-
-
- 4. Testing the Spring context
-
-
- 5. The Controller
-
-
- 6. Mapping the HTTP response codes
-
-
- 7. Additional Maven dependencies
-
-
- 8. Conclusion
-
-
- If you're new here, you may want to get my "REST APIs with Spring" eBook. Thanks for visiting!
-
-
- Â
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Understanding REST in Spring
-
-
- 3. The Java configuration
-
-
- 4. Testing the Spring context
-
-
- 5. The Controller
-
-
- 6. Mapping the HTTP response codes
-
-
- Â Â Â 6.1. Unmapped requests
-
-
- Â Â Â 6.2. Valid, mapped requests
-
-
- Â Â Â 6.3. Client error
-
-
- Â Â Â 6.4. Using @ExceptionHandler
-
-
- 7. Additional Maven dependencies
-
-
- 8. Conclusion
-
-
-
- 1. Overview
- This article shows how to set up REST in Spring – the Controller and HTTP response codes, configuration of payload marshalling and content negotiation.
-
-
- 2. Understanding REST in Spring
- The Spring framework supports 2 ways of creating RESTful services:
-
-
- using MVC with ModelAndView
-
-
- using HTTP message converters
-
-
- The ModelAndView approach is older and much better documented, but also more verbose and configuration heavy. It tries to shoehorn the REST paradigm into the old model, which is not without problems. The Spring team understood this and provided first-class REST support starting with Spring 3.0 .
- The new approach, based on HttpMessageConverter and annotations , is much more lightweight and easy to implement. Configuration is minimal and it provides sensible defaults for what you would expect from a RESTful service. It is however newer and a a bit on the light side concerning documentation; what’s , the reference doesn’t go out of it’s way to make the distinction and the tradeoffs between the two approaches as clear as they should be. Nevertheless, this is the way RESTful services should be build after Spring 3.0.
-
-
- 3. The Java configuration
-
- @Configuration
-@EnableWebMvc
-public class WebConfig{
- //
-}
- The new @EnableWebMvc annotation does a number of useful things – specifically, in the case of REST, it detect the existence of Jackson and JAXB 2 on the classpath and automatically creates and registers default JSON and XML converters . The functionality of the annotation is equivalent to the XML version:
- <mvc:annotation-driven />
- This is a shortcut, and though it may be useful in many situations, it’s not perfect. When more complex configuration is needed, remove the annotation and extend WebMvcConfigurationSupport directly.
-
-
- 4. Testing the Spring context
- Starting with Spring 3.1 , we get first-class testing support for @Configuration classes:
- @RunWith( SpringJUnit4ClassRunner.class )
-@ContextConfiguration( classes = { ApplicationConfig.class, PersistenceConfig.class },
- loader = AnnotationConfigContextLoader.class )
-public class SpringTest{
-
- @Test
- public void whenSpringContextIsInstantiated_thenNoExceptions(){
- // When
- }
-}
- The Java configuration classes are simply specified with the @ContextConfiguration annotation and the new AnnotationConfigContextLoader loads the bean definitions from the @Configuration classes.
- Notice that the WebConfig configuration class was not included in the test because it needs to run in a Servlet context, which is not provided.
-
-
- 5. The Controller
- The @Controller is the central artifact in the entire Web Tier of the RESTful API. For the purpose of this post, the controller is modeling a simple REST resource – Foo :
- @Controller
-@RequestMapping( value = "/foos" )
-class FooController{
-
- @Autowired
- IFooService service;
-
- @RequestMapping( method = RequestMethod.GET )
- @ResponseBody
- public List< Foo > findAll(){
- return service.findAll();
- }
-
- @RequestMapping( value = "/{id}", method = RequestMethod.GET )
- @ResponseBody
- public Foo findOne( @PathVariable( "id" ) Long id ){
- return RestPreconditions.checkFound( service.findOne( id ) );
- }
-
- @RequestMapping( method = RequestMethod.POST )
- @ResponseStatus( HttpStatus.CREATED )
- @ResponseBody
- public Long create( @RequestBody Foo resource ){
- Preconditions.checkNotNull( resource );
- return service.create( resource );
- }
-
- @RequestMapping( value = "/{id}", method = RequestMethod.PUT )
- @ResponseStatus( HttpStatus.OK )
- public void update( @PathVariable( "id" ) Long id, @RequestBody Foo resource ){
- Preconditions.checkNotNull( resource );
- RestPreconditions.checkNotNull( service.getById( resource.getId() ) );
- service.update( resource );
- }
-
- @RequestMapping( value = "/{id}", method = RequestMethod.DELETE )
- @ResponseStatus( HttpStatus.OK )
- public void delete( @PathVariable( "id" ) Long id ){
- service.deleteById( id );
- }
-
-}
- You may have noticed I’m using a very simple, guava style RestPreconditions utility:
- public class RestPreconditions {
- public static <T> T checkFound(final T resource) {
- if (resource == null) {
- throw new MyResourceNotFoundException();
- }
- return resource;
- }
-}
- The Controller implementation is non-public – this is because it doesn’t need to be. Usually the controller is the last in the chain of dependencies – it receives HTTP requests from the Spring front controller (the DispathcerServlet ) and simply delegate them forward to a service layer. If there is no use case where the controller has to be injected or manipulated through a direct reference, then I prefer not to declare it as public.
- The request mappings are straightforward – as with any controller, the actual value of the mapping as well as the HTTP method are used to determine the target method for the request. @ RequestBody will bind the parameters of the method to the body of the HTTP request, whereas @ResponseBody does the same for the response and return type. They also ensure that the resource will be marshalled and unmarshalled using the correct HTTP converter. Content negotiation will take place to choose which one of the active converters will be used, based mostly on the Accept header, although other HTTP headers may be used to determine the representation as well.
-
-
- 6. Mapping the HTTP response codes
- The status codes of the HTTP response are one of the most important parts of the REST service, and the subject can quickly become very complex. Getting these right can be what makes or breaks the service.
-
- 6.1. Unmapped requests
- If Spring MVC receives a request which doesn’t have a mapping, it considers the request not to be allowed and returns a 405 METHOD NOT ALLOWED back to the client. It is also good practice to include the Allow HTTP header when returning a 405 to the client, in order to specify which operations are allowed. This is the standard behavior of Spring MVC and does not require any additional configuration.
-
-
- 6.2. Valid, mapped requests
- For any request that does have a mapping, Spring MVC considers the request valid and responds with 200 OK if no other status code is specified otherwise. It is because of this that controller declares different @ResponseStatus for the create , update and delete actions but not for get , which should indeed return the default 200 OK.
-
-
- 6.3. Client error
- In case of a client error , custom exceptions are defined and mapped to the appropriate error codes. Simply throwing these exceptions from any of the layers of the web tier will ensure Spring maps the corresponding status code on the HTTP response.
- @ResponseStatus( value = HttpStatus.BAD_REQUEST )
-public class BadRequestException extends RuntimeException{
- //
-}
-@ResponseStatus( value = HttpStatus.NOT_FOUND )
-public class ResourceNotFoundException extends RuntimeException{
- //
-}
- These exceptions are part of the REST API and, as such, should only be used in the appropriate layers corresponding to REST; if for instance a DAO/DAL layer exist, it should not use the exceptions directly. Note also that these are not checked exceptions but runtime exceptions – in line with Spring practices and idioms.
-
-
- 6.4. Using @ExceptionHandler
- Another option to map custom exceptions on specific status codes is to use the @ExceptionHandler annotation in the controller. The problem with that approach is that the annotation only applies to the controller in which it is defined, not to the entire Spring Container, which means that it needs to be declared in each controller individually. This quickly becomes cumbersome, especially in more complex applications which many controllers. There are a few JIRA issues opened with Spring at this time to handle this and other related limitations: SPR-8124, SPR-7278, SPR-8406.
-
-
-
- 7. Additional Maven dependencies
- In addition to the spring-webmvc dependency required for the standard web application, we’ll need to set up content marshalling and unmarshalling for the REST API:
- <dependencies>
- <dependency>
-Â Â <groupId>com.fasterxml.jackson.core</groupId>
- Â Â <artifactId>jackson-databind</artifactId>
-Â Â <version>${jackson.version}</version>
- </dependency>
- <dependency>
- <groupId>javax.xml.bind</groupId>
- <artifactId>jaxb-api</artifactId>
- <version>${jaxb-api.version}</version>
- <scope>runtime</scope>
- </dependency>
-</dependencies>
-
-<properties>
- <jackson.version>2.4.0</jackson.version>
- <jaxb-api.version>2.2.11</jaxb-api.version>
-</properties>
- These are the libraries used to convert the representation of the REST resource to either JSON or XML .
-
-
- 8. Conclusion
- This tutorial illustrated how to implement and configure a REST Service using Spring 4 and Java based configuration, discussing HTTP response codes, basic Content Negotiation and marshaling.
- In the next articles of the series I will focus on Discoverability of the API, advanced content negotiation and working with additional representations of a Resource.
- The implementation of this Spring REST API Tutorial can be downloaded as a working sample project.
- This is an Eclipse based project, so it should be easy to import and run as it is.
-
-
-
-
-
-
-
-
-
- java, REST, Spring, testing
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring Security for a REST API
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Spring Security in the web.xml
-
-
- 3. The Security Configuration
-
-
- 4. Maven and other trouble
-
-
- 5. Conclusion
-
-
-
-
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Introducing Spring Security in the web.xml
-
-
- 3. The Security Configuration
-
-
- Â Â Â Â 3.1. The basics
-
-
- Â Â Â Â 3.2. The Entry Point
-
-
- Â Â Â Â 3.3. The Login
-
-
- Â Â Â 3.4. Authentication should return 200 instead of 301
-
-
- Â Â Â 3.5. Failed Authentication should return 401 instead of 302
-
-
- Â Â Â Â 3.6. The Authentication Manager and Provider
-
-
-    3.7. Finally – Authentication against the running REST Service
-
-
- 4. Maven and other trouble
-
-
- 5. Conclusion
-
-
-
- 1. Overview
- This tutorial shows how to Secure a REST Service using Spring and Spring Security 3.1 with Java based configuration. The article will focus on how to set up the Security Configuration specifically for the REST API using a Login and Cookie approach.
-
-
- 2. Spring Security in the web.xml
- The architecture of Spring Security is based entirely on Servlet Filters and, as such, comes before Spring MVC in regards to the processing of HTTP requests. Keeping this in mind, to begin with, a filter needs to be declared in the web.xml of the application:
- <filter>
- <filter-name>springSecurityFilterChain</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
-</filter>
-<filter-mapping>
- <filter-name>springSecurityFilterChain</filter-name>
- <url-pattern>/*</url-pattern>
-</filter-mapping>
- The filter must necessarily be named ‘springSecurityFilterChain’ Â to match the default bean created by Spring Security in the container.
- Note that the defined filter is not the actual class implementing the security logic but a DelegatingFilterProxy with the purpose of delegating the Filter’s methods to an internal bean. This is done so that the target bean can still benefit from the Spring context lifecycle and flexibility.
- The URL pattern used to configure the Filter is /* even though the entire web service is mapped to /api/* so that the security configuration has the option to secure other possible mappings as well, if required.
-
-
- 3. The Security Configuration
- <?xml version="1.0" encoding="UTF-8"?>
-<beans:beans
- xmlns="http://www.springframework.org/schema/security"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:beans="http://www.springframework.org/schema/beans"
- xmlns:sec="http://www.springframework.org/schema/security"
- xsi:schemaLocation="
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-3.2.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
-
- <http entry-point-ref="restAuthenticationEntryPoint">
- <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>
-
- <form-login
- authentication-success-handler-ref="mySuccessHandler"
- authentication-failure-handler-ref="myFailureHandler"
- />
-
- <logout />
- </http>
-
- <beans:bean id="mySuccessHandler"
- class="org.rest.security.MySavedRequestAwareAuthenticationSuccessHandler"/>
- <beans:bean id="myFailureHandler"
- class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"/>
-
- <authentication-manager alias="authenticationManager">
- <authentication-provider>
- <user-service>
- <user name="temporary" password="temporary" authorities="ROLE_ADMIN"/>
- <user name="user" password="user" authorities="ROLE_USER"/>
- </user-service>
- </authentication-provider>
- </authentication-manager>
-
-</beans:beans>
- Most of the configuration is done using the security namespace – for this to be enabled, the schema locations must be defined and pointed to the correct 3.1 or 3.2 XSD versions. The namespace is designed so that it expresses the common uses of Spring Security while still providing hooks raw beans to accommodate more advanced scenarios. >> Signup for my upcoming Video Course on Building a REST API with Spring 4
-
- 3.1. The <http> element
- The <http> element is the main container element for HTTP security configuration. In the current implementation, it only secured a single mapping: /api/admin/** . Note that the mapping is relative to the root context of the web application, not to the rest Servlet; this is because the entire security configuration lives in the root Spring context and not in the child context of the Servlet.
-
-
- 3.2. The Entry Point
- In a standard web application, the authentication process may be automatically triggered when the client tries to access a secured resource without being authenticated – this is usually done by redirecting to a login page so that the user can enter credentials. However, for a REST Web Service this behavior doesn’t make much sense – Authentication should only be done by a request to the correct URI and all other requests should simply fail with a 401 UNAUTHORIZED status code if the user is not authenticated.
- Spring Security handles this automatic triggering of the authentication process with the concept of an Entry Point – this is a required part of the configuration, and can be injected via the entry-point-ref attribute of the <http> element. Keeping in mind that this functionality doesn’t make sense in the context of the REST Service, the new custom entry point is defined to simply return 401 whenever it is triggered:
- @Component( "restAuthenticationEntryPoint" )
-public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
-
- @Override
- public void commence( HttpServletRequest request, HttpServletResponse response,
- AuthenticationException authException ) throws IOException{
- response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
- }
-}
- A quick sidenote here is that the 401 is sent without the WWW-Authenticate header, as required by the HTTP Spec – we can of course set the value manually if we need to.
-
-
- 3.3. The Login Form for REST
- There are multiple ways to do Authentication for a REST API – one of the default Spring Security provides is Form Login – which uses an authentication processing filter – org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter .
- The <form-login> element will create this filter and will also allow us to set our custom authentication success handler on it. This can also be done manually by using the <custom-filter> element to register a filter at the position FORM_LOGIN_FILTER – but the namespace support is flexible enough.
- Note that for a standard web application, the auto-config attribute of the <http> element is shorthand syntax for some useful security configuration. While this may be appropriate for some very simple configurations, it doesn’t fit and should not be used for a REST API.
-
-
- 3.4. Authentication should return 200 instead of 301
- By default, form login will answer a successful authentication request with a 301 MOVED PERMANENTLY status code; this makes sense in the context of an actual login form which needs to redirect after login. For a RESTful web service however, the desired response for a successful authentication should be 200 OK .
- This is done by injecting a custom authentication success handler in the form login filter, to replace the default one. The new handler implements the exact same login as the default org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler with one notable difference – the redirect logic is removed:
- public class MySavedRequestAwareAuthenticationSuccessHandler
- extends SimpleUrlAuthenticationSuccessHandler {
-
- private RequestCache requestCache = new HttpSessionRequestCache();
-
- @Override
- public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
- Authentication authentication) throws ServletException, IOException {
- SavedRequest savedRequest = requestCache.getRequest(request, response);
-
- if (savedRequest == null) {
- clearAuthenticationAttributes(request);
- return;
- }
- String targetUrlParam = getTargetUrlParameter();
- if (isAlwaysUseDefaultTargetUrl() ||
- (targetUrlParam != null &&
- StringUtils.hasText(request.getParameter(targetUrlParam)))) {
- requestCache.removeRequest(request, response);
- clearAuthenticationAttributes(request);
- return;
- }
-
- clearAuthenticationAttributes(request);
- }
-
- public void setRequestCache(RequestCache requestCache) {
- this.requestCache = requestCache;
- }
-}
-
-
- 3.5. Failed Authentication should return 401 instead of 302
- Similarly – we configured the authentication failure handler – same way we did with the success handler.
- Luckily – in this case, we don’t need to actually define a new class for this handler – the standard implementation – SimpleUrlAuthenticationFailureHandler – does just fine.
- The only difference is that – now that we’re defining this explicitly in our XML config – it’s not going to get a default defaultFailureUrl from Spring – and so it won’t redirect.
-
-
- 3.6. The Authentication Manager and Provider
- The authentication process uses an in-memory provider to perform authentication – this is meant to simplify the configuration as a production implementation of these artifacts is outside the scope of this post.
-
-
- 3.7 Finally – Authentication against the running REST Service
- Now let’s see how we can authenticate against the REST API – the URL for login is /j_spring_security_check – and a simple curl command performing login would be:
- curl -i -X POST -d j_username=user -d j_password=userPass
-http://localhost:8080/spring-security-rest/j_spring_security_check
- This request will return the Cookie which will then be used by any subsequent request against the REST Service.
- We can use curl to authentication and store the cookie it receives in a file :
- curl -i -X POST -d j_username=user -d j_password=userPass -c /opt/cookies.txt
-http://localhost:8080/spring-security-rest/j_spring_security_check
- Then we can use the cookie from the file to do further authenticated requests:
- curl -i --header "Accept:application/json" -X GET -b /opt/cookies.txt
-http://localhost:8080/spring-security-rest/api/foos
- This authenticated request will correctly result in a 200 OK :
- HTTP/1.1 200 OK
-Server: Apache-Coyote/1.1
-Content-Type: application/json;charset=UTF-8
-Transfer-Encoding: chunked
-Date: Wed, 24 Jul 2013 20:31:13 GMT
-
-[{"id":0,"name":"JbidXc"}]
-
-
-
- 4. Maven and other trouble
- The Spring core dependencies necessary for a web application and for the REST Service have been discussed in detail. For security, we’ll need to add: spring-security-web and spring-security-config – all of these have also been covered in the Maven for Spring Security tutorial.
- It’s worth paying close attention to the way Maven will resolve the older Spring dependencies – the resolution strategy will start causing problems once the security artifacts are added to the pom. To address this problem, some of the core dependencies will need to be overridden in order to keep them at the right version.
-
-
- 5. Conclusion
- This post covered the basic security configuration and implementation for a RESTful Service using Spring Security 3.1 , discussing the web.xml , the security configuration, the HTTP status codes for the authentication process and the Maven resolution of the security artifacts.
- The implementation of this Spring Security REST Tutorial can be downloaded as a working sample project.This is an Eclipse based project, so it should be easy to import and run as it is.
-
-
-
-
-
-
-
-
-
- REST, security, Spring
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring Security Basic Authentication
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- 1. Overview
-
-
- 2. The Spring Security Configuration
-
-
- 3. Consuming The Secured Application
-
-
- 4. Further Configuration – The Entry Point
-
-
- 5. The Maven Dependencies
-
-
- 6. Conclusion
-
-
- If you're new here, you may want to get my "REST APIs with Spring" eBook. Thanks for visiting!
-
-
-
-
- 1. Overview
- This tutorial shows how to set up, configure and customize Basic Authentication with Spring . We’re going to built on top of the simple Spring MVC example, and secure the UI of the MVC application with the Basic Auth mechanism provided by Spring Security.
-
- 2. The Spring Security Configuration
- The Configuration for Spring Security is still XML:
- <?xml version="1.0" encoding="UTF-8"?>
-<beans:beans xmlns="http://www.springframework.org/schema/security"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:beans="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-3.1.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
-
- <http use-expressions="true">
- <intercept-url pattern="/**" access="isAuthenticated()" />
-
- <http-basic />
- </http>
-
- <authentication-manager>
- <authentication-provider>
- <user-service>
- <user name="user1" password="user1Pass" authorities="ROLE_USER" />
- </user-service>
- </authentication-provider>
- </authentication-manager>
-
-</beans:beans>
- This is one of the last pieces of configuration in Spring that still need XML – Java Configuration for Spring Security is still a work in progress.
- What is relevant here is the <http-basic> element inside the main <http> element of the configuration – this is enough to enable Basic Authentication for the entire application. The Authentication Manager is not the focus of this tutorial, so we are using an in memory manager with the user and password defined in plaintext.
- The web.xml of the web application enabling Spring Security has already been discussed in the Spring Logout tutorial.
-
-
- 3. Consuming The Secured Application
- The curl command is our go to tool for consuming the secured application.
- First, let’s try to request the /homepage.html without providing any security credentials:
- curl -i http://localhost:8080/spring-security-mvc-basic-auth/homepage.html
- We get back the expected 401 Unauthorized and the Authentication Challenge:
- HTTP/1.1 401 Unauthorized
-Server: Apache-Coyote/1.1
-Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly
-WWW-Authenticate: Basic realm="Spring Security Application"
-Content-Type: text/html;charset=utf-8
-Content-Length: 1061
-Date: Wed, 29 May 2013 15:14:08 GMT
- The browser would interpret this challenge and prompt us for credentials with a simple dialog, but since we’re using curl , this isn’t the case.
- Now, let’s request the same resource – the homepage – but provide the credentials to access it as well:
- curl -i --user user1:user1Pass http://localhost:8080/spring-security-mvc-basic-auth/homepage.html
- Now, the response from the server is 200 OK along with a Cookie :
- HTTP/1.1 200 OK
-Server: Apache-Coyote/1.1
-Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly
-Content-Type: text/html;charset=ISO-8859-1
-Content-Language: en-US
-Content-Length: 90
-Date: Wed, 29 May 2013 15:19:38 GMT
- From the browser, the application can be consumed normally – the only difference is that a login page is no longer a hard requirement since all browsers support Basic Authentication and use a dialog to prompt the user for credentials.
-
-
- 4. Further Configuration – The Entry Point
- By default, the BasicAuthenticationEntryPoint provisioned by Spring Security returns a full html page for a 401 Unauthorized response back to the client. This html representation of the error renders well in a browser, but it not well suited for other scenarios, such as a REST API where a json representation may be preferred.
- The namespace is flexible enough for this new requirement as well – to address this – the entry point can be overridden:
- <http-basic entry-point-ref="myBasicAuthenticationEntryPoint" />
- The new entry point is defined as a standard bean:
- @Component
-public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {
-
- @Override
- public void commence
- (HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
- throws IOException, ServletException {
- response.addHeader("WWW-Authenticate", "Basic realm=\"" + getRealmName() + "\"");
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- PrintWriter writer = response.getWriter();
- writer.println("HTTP Status 401 - " + authEx.getMessage());
- }
-
- @Override
- public void afterPropertiesSet() throws Exception {
- setRealmName("Baeldung");
- super.afterPropertiesSet();
- }
-}
- By writing directly to the HTTP Response we now have full control over the format of the response body.
-
-
- 5. The Maven Dependencies
- The Maven dependencies for Spring Security have been discussed before in the Spring Security with Maven article – we will need both spring-security-web and spring-security-config available at runtime.
-
-
- 6. Conclusion
- In this example we secured an MVC application with Spring Security and Basic Authentication. We discussed the XML configuration and we consumed the application with simple curl commands. Finally took control of the exact error message format – moving from the standard HTML error page to a custom text or json format.
- The implementation of this Spring tutorial can be found in the github project – this is an Eclipse based project, so it should be easy to import and run as it is. When the project runs locally, the sample html can be accessed at:
- http://localhost:8080/spring-security-mvc-basic-auth/homepage.html
-
-
-
-
-
-
-
-
-
- security, Spring
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Spring Security Digest Authentication
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- 1. Overview
-
-
- 2. The Security XML Configuration
-
-
- 3. Consuming the Secured Application
-
-
- 4. The Maven Dependencies
-
-
- 5. Conclusion
-
-
- If you're new here, you may want to get my "REST APIs with Spring" eBook. Thanks for visiting!
-
-
-
-
- 1. Overview
- This tutorial shows how to set up, configure and customize Digest Authentication with Spring. Similar to the previous article covering Basic Authentication, we’re going to built on top of the Spring MVC tutorial, and secure the application with the Digest Auth mechanism provided by Spring Security.
-
- 2. The Security XML Configuration
- First thing to understand about the configuration is that, while Spring Security does have full out of the box support for the Digest authentication mechanism, this support is not as well integrated into the namespace as Basic Authentication was.
- In this case, we need to manually define the raw beans that are going to make up the security configuration – the DigestAuthenticationFilter and the DigestAuthenticationEntryPoint :
- <?xml version="1.0" encoding="UTF-8"?>
-<beans:beans xmlns="http://www.springframework.org/schema/security"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:beans="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-3.1.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
-
-Â Â Â <beans:bean id="digestFilter"
- class="org.springframework.security.web.authentication.www.DigestAuthenticationFilter">
-Â Â Â Â Â Â Â <beans:property name="userDetailsService" ref="userService" />
-Â Â Â Â Â Â Â <beans:property name="authenticationEntryPoint" ref="digestEntryPoint" />
-Â Â Â </beans:bean>
-Â Â Â <beans:bean id="digestEntryPoint"Â
- class="org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint">
-Â Â Â Â Â Â Â <beans:property name="realmName" value="Contacts Realm via Digest Authentication" />
-Â Â Â Â Â Â Â <beans:property name="key" value="acegi" />
-Â Â Â </beans:bean>
-
- <!-- the security namespace configuration -->
- <http use-expressions="true" entry-point-ref="digestEntryPoint">
- <intercept-url pattern="/**" access="isAuthenticated()" />
-
- <custom-filter ref="digestFilter" after="BASIC_AUTH_FILTER" />
- </http>
-
- <authentication-manager>
- <authentication-provider>
- <user-service id="userService">
- <user name="user1" password="user1Pass" authorities="ROLE_USER" />
- </user-service>
- </authentication-provider>
- </authentication-manager>
-
-</beans:beans>
- Next, we need to integrate these beans into the overall security configuration – and in this case, the namespace is still flexible enough to allow us to do that.
- The first part of this is pointing to the custom entry point bean, via the entry-point-ref attribute of the main <http> element.
- The second part is adding the newly defined digest filter into the security filter chain . Since this filter is functionally equivalent to the BasicAuthenticationFilter , we are using the same relative position in the chain – this is specified by the BASIC_AUTH_FILTER alias in the overall Spring Security Standard Filters.
- Finally, notice that the Digest Filter is configured to point to the user service bean – and here, the namespace is again very useful as it allows us to specify a bean name for the default user service created by the <user-service> element:
- <user-service id="userService">
-
-
- 3. Consuming the Secured Application
- We’re going to be using the curl command to consume the secured application and understand how a client can interact with it.
- Let’s start by requesting the homepage – without providing security credentials in the request:
- curl -i http://localhost/spring-security-mvc-digest-auth/homepage.html
- As expected, we get back a response with a 401 Unauthorized status code:
- HTTP/1.1 401 Unauthorized
-Server: Apache-Coyote/1.1
-Set-Cookie: JSESSIONID=CF0233C...; Path=/spring-security-mvc-digest-auth/; HttpOnly
-WWW-Authenticate: Digest realm="Contacts Realm via Digest Authentication", qop="auth",
- nonce="MTM3MzYzODE2NTg3OTo3MmYxN2JkOWYxZTc4MzdmMzBiN2Q0YmY0ZTU0N2RkZg=="
-Content-Type: text/html;charset=utf-8
-Content-Length: 1061
-Date: Fri, 12 Jul 2013 14:04:25 GMT
- If this request were sent by the browser, the authentication challenge would prompt the user for credentials using a simple user/password dialog.
- Let’s now provide the correct credentials and send the request again:
- curl -i --digest --user
- user1:user1Pass http://localhost/spring-security-mvc-digest-auth/homepage.html
- Notice that we are enabling Digest Authentication for the curl command via the –digest flag.
- The first response from the server will be the same – the 401 Unauthorized – but the challenge will now be interpreted and acted upon by a second request – which will succeed with a 200 OK :
- HTTP/1.1 401 Unauthorized
-Server: Apache-Coyote/1.1
-Set-Cookie: JSESSIONID=A961E0D...; Path=/spring-security-mvc-digest-auth/; HttpOnly
-WWW-Authenticate: Digest realm="Contacts Realm via Digest Authentication", qop="auth",
- nonce="MTM3MzYzODgyOTczMTo3YjM4OWQzMGU0YTgwZDg0YmYwZjRlZWJjMDQzZWZkOA=="
-Content-Type: text/html;charset=utf-8
-Content-Length: 1061
-Date: Fri, 12 Jul 2013 14:15:29 GMT
-
-HTTP/1.1 200 OK
-Server: Apache-Coyote/1.1
-Set-Cookie: JSESSIONID=55F996B...; Path=/spring-security-mvc-digest-auth/; HttpOnly
-Content-Type: text/html;charset=ISO-8859-1
-Content-Language: en-US
-Content-Length: 90
-Date: Fri, 12 Jul 2013 14:15:29 GMT
-
-<html>
-<head></head>
-
-<body>
- <h1>This is the homepage</h1>
-</body>
-</html>
- A final note on this interaction is that a client can preemptively send the correct Authorization header with the first request, and thus entirely avoid the server security challenge and the second request.
-
-
- 4. The Maven Dependencies
- The security dependencies are discussed in depth in the Spring Security Maven tutorial. In short, we will need to define spring-security-web and spring-security-config as dependencies in our pom.xml .
-
-
- 5. Conclusion
- In this tutorial we introduce security into a simple Spring MVC project by leveraging the Digest Authentication support in the framework.
- The implementation of these examples can be found in the github project – this is an Eclipse based project, so it should be easy to import and run as it is.
- When the project runs locally, the homepage html can be accessed at (or, with minimal Tomcat configuration, on port 80):
- http://localhost:8080/spring-security-mvc-digest-auth/homepage.html
- Finally, there is no reason an application needs to choose between Basic and Digest authentication – both can be set up simultaneously on the same URI structure , in such a way that the client can pick between the two mechanisms when consuming the web application.
-
-
-
-
-
-
-
-
-
- security, Spring
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
-
-
-
- Basic and Digest Authentication for a REST Service with Spring Security
-
-
-
-
-
- Return to Content
-
-
-
-
-
- Contents
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Configuration of Basic Authentication
-
-
- 3. Configuration of Digest Authentication
-
-
- 4. Supporting both authentication protocols in the same RESTful service
-
-
- 5. Testing both scenarios
-
-
- 6. Conclusion
-
-
- If you're new here, you may want to get my "REST APIs with Spring" eBook. Thanks for visiting!
-
-
-
-
- Table of Contents
-
-
- 1. Overview
-
-
- 2. Configuration of Basic Authentication
-
-
- Â Â Â 2.1. Satisfying the stateless constraint – getting rid of sessions
-
-
- 3. Configuration of Digest Authentication
-
-
- 4. Supporting both authentication protocols in the same RESTful service
-
-
- Â Â Â 4.1. Anonymous request
-
-
- Â Â Â 4.2. Request with authentication credentials
-
-
- 5. Testing both scenarios
-
-
- 6. Conclusion
-
-
-
- 1. Overview
- This article discusses how to set up both Basic and Digest Authentication on the same URI structure of a REST API . In a previous article, we discussed another method of securing the REST Service – form based authentication, so Basic and Digest authentication is the natural alternative, as well as the more RESTful one.
-
-
- 2. Configuration of Basic Authentication
- The main reason that form based authentication is not ideal for a RESTful Service is that Spring Security will make use of Sessions – this is of course state on the server, so the statelessness constraints in REST is practically ignored.
- We’ll start by setting up Basic Authentication – first we remove the old custom entry point and filter from the main <http> security element:
- <http create-session="stateless">
- <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN" />
-
- <http-basic />
-</http>
- Note how support for basic authentication has been added with a single configuration line – <http-basic /> – which handles the creation and wiring of both the BasicAuthenticationFilter and the BasicAuthenticationEntryPoint .
-
- 2.1. Satisfying the stateless constraint – getting rid of sessions
- One of the main constraints of the RESTful architectural style is that the client-server communication is fully stateless , as the original dissertation reads:
-
- Â Â Â 5.1.3 Stateless
- We next add a constraint to the client-server interaction: communication must be stateless in nature, as in the client-stateless-server (CSS) style of Section 3.4.3 (Figure 5-3), such that each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client .
-
- The concept of Session on the server is one with a long history in Spring Security, and removing it entirely has been difficult until now, especially when configuration was done by using the namespace. However, Spring Security 3.1 augments the namespace configuration with a new stateless option for session creation, which effectively guarantees that no session will be created or used by Spring. What this new option does is completely removes all session related filters from the security filter chain, ensuring that authentication is performed for each request.
-
-
-
- 3. Configuration of Digest Authentication
- Starting with the previous configuration, the filter and entry point necessary to set up digest authentication will be defined as beans. Then, the digest entry point will override the one created by <http-basic> behind the scenes. Finally, the custom digest filter will be introduced in the security filter chain using the after semantics of the security namespace to position it directly after the basic authentication filter.
- <http create-session="stateless" entry-point-ref="digestEntryPoint">
- <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN" />
-
- <http-basic />
- <custom-filter ref="digestFilter" after="BASIC_AUTH_FILTER" />
-</http>
-
-<beans:bean id="digestFilter" class=
- "org.springframework.security.web.authentication.www.DigestAuthenticationFilter">
- <beans:property name="userDetailsService" ref="userService" />
- <beans:property name="authenticationEntryPoint" ref="digestEntryPoint" />
-</beans:bean>
-
-<beans:bean id="digestEntryPoint" class=
- "org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint">
- <beans:property name="realmName" value="Contacts Realm via Digest Authentication"/>
- <beans:property name="key" value="acegi" />
-</beans:bean>
-
-<authentication-manager>
- <authentication-provider>
- <user-service id="userService">
- <user name="eparaschiv" password="eparaschiv" authorities="ROLE_ADMIN" />
- <user name="user" password="user" authorities="ROLE_USER" />
- </user-service>
- </authentication-provider>
-</authentication-manager>
- Unfortunately there is no support in the security namespace to automatically configure the digest authentication the way basic authentication can be configured with <http-basic> . Because of that, the necessary beans had to be defined and wired manually into the security configuration.
-
-
- 4. Supporting both authentication protocols in the same RESTful service
- Basic or Digest authentication alone can be easily implemented in Spring Security 3.x; it is supporting both of them for the same RESTful web service, on the same URI mappings that introduces a new level of complexity into the configuration and testing of the service.
-
- 4.1. Anonymous request
- With both basic and digest filters in the security chain, the way a anonymous request – a request containing no authentication credentials (Authorization HTTP header) – is processed by Spring Security is – the two authentication filters will find no credentials and will continue execution of the filter chain. Then, seeing how the request wasn’t authenticated, an AccessDeniedException is thrown and caught in the ExceptionTranslationFilter , which commences the digest entry point, prompting the client for credentials.
- The responsibilities of both the basic and digest filters are very narrow – they will continue to execute the security filter chain if they are unable to identify the type of authentication credentials in the request. It is because of this that Spring Security can have the flexibility to be configured with support for multiple authentication protocols on the same URI.
- When a request is made containing the correct authentication credentials – either basic or digest – that protocol will be rightly used. However, for an anonymous request, the client will get prompted only for digest authentication credentials. This is because the digest entry point is configured as the main and single entry point of the Spring Security chain; as such digest authentication can be considered the default .
-
-
- 4.2. Request with authentication credentials
- A request with credentials for Basic authentication will be identified by the Authorization header starting with the prefix “Basic” . When processing such a request, the credentials will be decoded in the basic authentication filter and the request will be authorized. Similarly, a request with credentials for Digest authentication will use the prefix “Digest” Â for it’s Authorization header.
-
-
-
- 5. Testing both scenarios
- The tests will consume the REST service by creating a new resource after authenticating with either basic or digest:
- @Test
-public void givenAuthenticatedByBasicAuth_whenAResourceIsCreated_then201IsReceived(){
- // Given
- // When
- Response response = given()
- .auth().preemptive().basic( ADMIN_USERNAME, ADMIN_PASSWORD )
- .contentType( HttpConstants.MIME_JSON ).body( new Foo( randomAlphabetic( 6 ) ) )
- .post( paths.getFooURL() );
-
- // Then
- assertThat( response.getStatusCode(), is( 201 ) );
-}
-@Test
-public void givenAuthenticatedByDigestAuth_whenAResourceIsCreated_then201IsReceived(){
- // Given
- // When
- Response response = given()
- .auth().digest( ADMIN_USERNAME, ADMIN_PASSWORD )
- .contentType( HttpConstants.MIME_JSON ).body( new Foo( randomAlphabetic( 6 ) ) )
- .post( paths.getFooURL() );
-
- // Then
- assertThat( response.getStatusCode(), is( 201 ) );
-}
- Note that the test using basic authentication adds credentials to the request preemptively , regardless if the server has challenged for authentication or not. This is to ensure that the server doesn’t need to challenge the client for credentials, because if it did, the challenge would be for Digest credentials, since that is the default.
-
-
- 6. Conclusion
- This article covered the configuration and implementation of both Basic and Digest authentication for a RESTful service, using mostly Spring Security 3.0 namespace support as well as some new features added by Spring Security 3.1.
- For the full implementation, check out the github project.
-
-
-
-
-
-
-
-
-
- REST, security, Spring
-
-
-
-
-
-
-
-
-
-
- © 2014 Baeldung. All Rights Reserved.
-
-
-
-
-
-
-
-
-
-
diff --git a/apache-fop/src/test/resources/output_herold.pdf b/apache-fop/src/test/resources/output_herold.pdf
deleted file mode 100644
index 1d23de7b61..0000000000
Binary files a/apache-fop/src/test/resources/output_herold.pdf and /dev/null differ
diff --git a/apache-fop/src/test/resources/output_html2fo.pdf b/apache-fop/src/test/resources/output_html2fo.pdf
deleted file mode 100644
index 7c2b4a0c51..0000000000
Binary files a/apache-fop/src/test/resources/output_html2fo.pdf and /dev/null differ
diff --git a/apache-fop/src/test/resources/output_jtidy.pdf b/apache-fop/src/test/resources/output_jtidy.pdf
deleted file mode 100644
index 1d9456122c..0000000000
Binary files a/apache-fop/src/test/resources/output_jtidy.pdf and /dev/null differ
diff --git a/apache-geode/README.md b/apache-geode/README.md
index 2f04418825..86629f7a82 100644
--- a/apache-geode/README.md
+++ b/apache-geode/README.md
@@ -1,3 +1,7 @@
+## Apache Geode
+
+This module contains articles about Apache Geode
+
### Relevant Articles:
- [A Quick Guide to Apache Geode](https://www.baeldung.com/apache-geode)
diff --git a/apache-geode/pom.xml b/apache-geode/pom.xml
index 15c7e04d29..195dfadd20 100644
--- a/apache-geode/pom.xml
+++ b/apache-geode/pom.xml
@@ -19,25 +19,7 @@
geode-core
${geode.core}
-
- junit
- junit
- ${junit.version}
-
-
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
- ${java.version}
- ${java.version}
-
-
-
-
1.6.0
diff --git a/apache-meecrowave/README.md b/apache-meecrowave/README.md
index 42b93a383e..d360af13af 100644
--- a/apache-meecrowave/README.md
+++ b/apache-meecrowave/README.md
@@ -1,3 +1,7 @@
+## Apache Meecrowave
+
+This module contains articles about Apache Meecrowave
+
### Relevant Articles:
-================================
-- [Building a Microservice with Apache Meecrowave](http://www.baeldung.com/apache-meecrowave)
+
+- [Building a Microservice with Apache Meecrowave](https://www.baeldung.com/apache-meecrowave)
\ No newline at end of file
diff --git a/apache-meecrowave/pom.xml b/apache-meecrowave/pom.xml
index 4eb1094f94..51c6514992 100644
--- a/apache-meecrowave/pom.xml
+++ b/apache-meecrowave/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
apache-meecrowave
0.0.1
apache-meecrowave
@@ -38,13 +37,6 @@
${meecrowave-junit.version}
test
-
-
- junit
- junit
- ${junit.version}
- test
-
diff --git a/apache-olingo/README.md b/apache-olingo/README.md
index bfbdc97700..2f4e86d5a2 100644
--- a/apache-olingo/README.md
+++ b/apache-olingo/README.md
@@ -1,3 +1,8 @@
-## Relevant articles:
+## Apache Olingo
+
+This module contains articles about Apache Olingo
+
+### Relevant articles:
- [OData Protocol Guide](https://www.baeldung.com/odata)
+- [Intro to OData with Olingo](https://www.baeldung.com/olingo)
diff --git a/apache-olingo/olingo2/pom.xml b/apache-olingo/olingo2/pom.xml
index 24e7b4e0b2..95b123efbc 100644
--- a/apache-olingo/olingo2/pom.xml
+++ b/apache-olingo/olingo2/pom.xml
@@ -4,9 +4,8 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.baeldung.examples.olingo2
- olingo2-sample
- 0.0.1-SNAPSHOT
- olingo2-sample
+ olingo2
+ olingo2
Sample Olingo 2 Project
diff --git a/apache-opennlp/README.md b/apache-opennlp/README.md
index 2e9fa0e384..4b1fa36540 100644
--- a/apache-opennlp/README.md
+++ b/apache-opennlp/README.md
@@ -1,3 +1,7 @@
+## Apache OpenNLP
+
+This module contains articles about Apache OpenNLP
+
### Relevant Articles
-- [Intro to Apache OpenNLP](http://www.baeldung.com/apache-open-nlp)
+- [Intro to Apache OpenNLP](https://www.baeldung.com/apache-open-nlp)
diff --git a/apache-poi/README.md b/apache-poi/README.md
index 862981991d..b7b8bf5f6a 100644
--- a/apache-poi/README.md
+++ b/apache-poi/README.md
@@ -1,4 +1,8 @@
+## Apache POI
+
+This module contains articles about Apache POI
+
### Relevant Articles:
-- [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi)
-- [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel)
-- [Creating a MS PowerPoint Presentation in Java](http://www.baeldung.com/apache-poi-slideshow)
+- [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)
diff --git a/apache-pulsar/README.md b/apache-pulsar/README.md
index 2970bc3d88..c44849a490 100644
--- a/apache-pulsar/README.md
+++ b/apache-pulsar/README.md
@@ -1,3 +1,7 @@
+## Apache Pulsar
+
+This module contains articles about Apache Pulsar
+
### Relevant Articles:
- [Introduction to Apache Pulsar](https://www.baeldung.com/apache-pulsar)
diff --git a/apache-pulsar/pom.xml b/apache-pulsar/pom.xml
index 8a0882dae1..fdd9ae1e95 100644
--- a/apache-pulsar/pom.xml
+++ b/apache-pulsar/pom.xml
@@ -24,8 +24,6 @@
- 1.8
- 1.8
- 2.1.1-incubating
+ 2.1.1-incubating
diff --git a/apache-shiro/README.md b/apache-shiro/README.md
index bc3480b266..ed63c569da 100644
--- a/apache-shiro/README.md
+++ b/apache-shiro/README.md
@@ -1,2 +1,9 @@
-### Relevant articles
-- [Introduction to Apache Shiro](http://www.baeldung.com/apache-shiro)
+## Apache Shiro
+
+This module contains articles about Apache Shiro
+
+### Relevant articles:
+
+- [Introduction to Apache Shiro](https://www.baeldung.com/apache-shiro)
+- [Permissions-Based Access Control with Apache Shiro](https://www.baeldung.com/apache-shiro-access-control)
+
diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml
index 644d70b30a..7f0d07589c 100644
--- a/apache-shiro/pom.xml
+++ b/apache-shiro/pom.xml
@@ -38,17 +38,6 @@
jcl-over-slf4j
runtime
-
- org.slf4j
- slf4j-log4j12
- runtime
-
-
- log4j
- log4j
- ${log4j-version}
- runtime
-
@@ -56,4 +45,4 @@
1.2.17
-
\ No newline at end of file
+
diff --git a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
index e6e72b2579..2713786d71 100644
--- a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
+++ b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java
@@ -18,22 +18,17 @@ import javax.servlet.http.HttpServletRequest;
@Controller
public class ShiroSpringController {
-
-
@GetMapping("/")
public String index() {
return "index";
}
-
@RequestMapping( value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
public String login(HttpServletRequest req, UserCredentials cred, RedirectAttributes attr) {
if(req.getMethod().equals(RequestMethod.GET.toString())) {
return "login";
- }
- else {
-
+ } else {
Subject subject = SecurityUtils.getSubject();
if(!subject.isAuthenticated()) {
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
new file mode 100644
index 0000000000..a373122d6c
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java
@@ -0,0 +1,68 @@
+package com.baeldung.shiro.permissions.custom;
+
+import com.baeldung.MyCustomRealm;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.*;
+import org.apache.shiro.config.Ini;
+import org.apache.shiro.mgt.DefaultSecurityManager;
+import org.apache.shiro.mgt.SecurityManager;
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.realm.text.IniRealm;
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Main {
+
+ private static final transient Logger log = LoggerFactory.getLogger(Main.class);
+
+ public static void main(String[] args) {
+
+ IniRealm realm = new IniRealm();
+ Ini ini = Ini.fromResourcePath(Main.class.getResource("/com/baeldung/shiro/permissions/custom/shiro.ini").getPath());
+ realm.setIni(ini);
+ realm.setPermissionResolver(new PathPermissionResolver());
+ realm.init();
+ SecurityManager securityManager = new DefaultSecurityManager(realm);
+
+ SecurityUtils.setSecurityManager(securityManager);
+ Subject currentUser = SecurityUtils.getSubject();
+
+ if (!currentUser.isAuthenticated()) {
+ UsernamePasswordToken token = new UsernamePasswordToken("paul.reader", "password4");
+ token.setRememberMe(true);
+ try {
+ currentUser.login(token);
+ } catch (UnknownAccountException uae) {
+ log.error("Username Not Found!", uae);
+ } catch (IncorrectCredentialsException ice) {
+ log.error("Invalid Credentials!", ice);
+ } catch (LockedAccountException lae) {
+ log.error("Your Account is Locked!", lae);
+ } catch (AuthenticationException ae) {
+ log.error("Unexpected Error!", ae);
+ }
+ }
+
+ log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
+
+ if (currentUser.hasRole("admin")) {
+ log.info("Welcome Admin");
+ } else if(currentUser.hasRole("editor")) {
+ log.info("Welcome, Editor!");
+ } else if(currentUser.hasRole("author")) {
+ log.info("Welcome, Author");
+ } else {
+ log.info("Welcome, Guest");
+ }
+
+ if(currentUser.isPermitted("/articles/drafts/new-article")) {
+ log.info("You can access articles");
+ } else {
+ log.info("You cannot access articles!");
+ }
+ currentUser.logout();
+ }
+
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java
new file mode 100644
index 0000000000..f7dfbda06a
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java
@@ -0,0 +1,22 @@
+package com.baeldung.shiro.permissions.custom;
+
+import org.apache.shiro.authz.Permission;
+
+import java.nio.file.Path;
+
+public class PathPermission implements Permission {
+
+ private final Path path;
+
+ public PathPermission(Path path) {
+ this.path = path;
+ }
+
+ @Override
+ public boolean implies(Permission p) {
+ if(p instanceof PathPermission) {
+ return ((PathPermission) p).path.startsWith(path);
+ }
+ return false;
+ }
+}
diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java
new file mode 100644
index 0000000000..4b60d2fbd4
--- /dev/null
+++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java
@@ -0,0 +1,13 @@
+package com.baeldung.shiro.permissions.custom;
+
+import org.apache.shiro.authz.Permission;
+import org.apache.shiro.authz.permission.PermissionResolver;
+
+import java.nio.file.Paths;
+
+public class PathPermissionResolver implements PermissionResolver {
+ @Override
+ public Permission resolvePermission(String permissionString) {
+ return new PathPermission(Paths.get(permissionString));
+ }
+}
diff --git a/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini
new file mode 100644
index 0000000000..732ff8b60d
--- /dev/null
+++ b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini
@@ -0,0 +1,10 @@
+[users]
+jane.admin = password, admin
+john.editor = password2, editor
+zoe.author = password3, author
+paul.reader = password4
+
+[roles]
+admin = /
+editor = /articles
+author = /articles/drafts
diff --git a/apache-solrj/README.md b/apache-solrj/README.md
index 7a32becb64..803db393e9 100644
--- a/apache-solrj/README.md
+++ b/apache-solrj/README.md
@@ -1,4 +1,7 @@
-## Apache Solrj Tutorials Project
+## Apache Solrj
-### Relevant Articles
-- [Guide to Solr in Java with Apache Solrj](http://www.baeldung.com/apache-solrj)
+This module contains articles about Apache Solrj
+
+### Relevant Articles:
+
+- [Guide to Solr in Java with Apache Solrj](https://www.baeldung.com/apache-solrj)
\ No newline at end of file
diff --git a/apache-solrj/pom.xml b/apache-solrj/pom.xml
index 1227fdca46..b19ceb1e48 100644
--- a/apache-solrj/pom.xml
+++ b/apache-solrj/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
apache-solrj
0.0.1-SNAPSHOT
apache-solrj
diff --git a/apache-spark/README.md b/apache-spark/README.md
index a4dce212b4..52313d66bf 100644
--- a/apache-spark/README.md
+++ b/apache-spark/README.md
@@ -1,4 +1,10 @@
-### Relevant articles
+## Apache Spark
-- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark)
+This module contains articles about Apache Spark
+
+### Relevant articles:
+
+- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark)
- [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline)
+- [Machine Learning with Spark MLlib](https://www.baeldung.com/spark-mlib-machine-learning)
+
diff --git a/apache-spark/data/iris.data b/apache-spark/data/iris.data
new file mode 100644
index 0000000000..396653cc98
--- /dev/null
+++ b/apache-spark/data/iris.data
@@ -0,0 +1,150 @@
+5.1,3.5,1.4,0.2,Iris-setosa
+4.9,3.0,1.4,0.2,Iris-setosa
+4.7,3.2,1.3,0.2,Iris-setosa
+4.6,3.1,1.5,0.2,Iris-setosa
+5.0,3.6,1.4,0.2,Iris-setosa
+5.4,3.9,1.7,0.4,Iris-setosa
+4.6,3.4,1.4,0.3,Iris-setosa
+5.0,3.4,1.5,0.2,Iris-setosa
+4.4,2.9,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.4,3.7,1.5,0.2,Iris-setosa
+4.8,3.4,1.6,0.2,Iris-setosa
+4.8,3.0,1.4,0.1,Iris-setosa
+4.3,3.0,1.1,0.1,Iris-setosa
+5.8,4.0,1.2,0.2,Iris-setosa
+5.7,4.4,1.5,0.4,Iris-setosa
+5.4,3.9,1.3,0.4,Iris-setosa
+5.1,3.5,1.4,0.3,Iris-setosa
+5.7,3.8,1.7,0.3,Iris-setosa
+5.1,3.8,1.5,0.3,Iris-setosa
+5.4,3.4,1.7,0.2,Iris-setosa
+5.1,3.7,1.5,0.4,Iris-setosa
+4.6,3.6,1.0,0.2,Iris-setosa
+5.1,3.3,1.7,0.5,Iris-setosa
+4.8,3.4,1.9,0.2,Iris-setosa
+5.0,3.0,1.6,0.2,Iris-setosa
+5.0,3.4,1.6,0.4,Iris-setosa
+5.2,3.5,1.5,0.2,Iris-setosa
+5.2,3.4,1.4,0.2,Iris-setosa
+4.7,3.2,1.6,0.2,Iris-setosa
+4.8,3.1,1.6,0.2,Iris-setosa
+5.4,3.4,1.5,0.4,Iris-setosa
+5.2,4.1,1.5,0.1,Iris-setosa
+5.5,4.2,1.4,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+5.0,3.2,1.2,0.2,Iris-setosa
+5.5,3.5,1.3,0.2,Iris-setosa
+4.9,3.1,1.5,0.1,Iris-setosa
+4.4,3.0,1.3,0.2,Iris-setosa
+5.1,3.4,1.5,0.2,Iris-setosa
+5.0,3.5,1.3,0.3,Iris-setosa
+4.5,2.3,1.3,0.3,Iris-setosa
+4.4,3.2,1.3,0.2,Iris-setosa
+5.0,3.5,1.6,0.6,Iris-setosa
+5.1,3.8,1.9,0.4,Iris-setosa
+4.8,3.0,1.4,0.3,Iris-setosa
+5.1,3.8,1.6,0.2,Iris-setosa
+4.6,3.2,1.4,0.2,Iris-setosa
+5.3,3.7,1.5,0.2,Iris-setosa
+5.0,3.3,1.4,0.2,Iris-setosa
+7.0,3.2,4.7,1.4,Iris-versicolor
+6.4,3.2,4.5,1.5,Iris-versicolor
+6.9,3.1,4.9,1.5,Iris-versicolor
+5.5,2.3,4.0,1.3,Iris-versicolor
+6.5,2.8,4.6,1.5,Iris-versicolor
+5.7,2.8,4.5,1.3,Iris-versicolor
+6.3,3.3,4.7,1.6,Iris-versicolor
+4.9,2.4,3.3,1.0,Iris-versicolor
+6.6,2.9,4.6,1.3,Iris-versicolor
+5.2,2.7,3.9,1.4,Iris-versicolor
+5.0,2.0,3.5,1.0,Iris-versicolor
+5.9,3.0,4.2,1.5,Iris-versicolor
+6.0,2.2,4.0,1.0,Iris-versicolor
+6.1,2.9,4.7,1.4,Iris-versicolor
+5.6,2.9,3.6,1.3,Iris-versicolor
+6.7,3.1,4.4,1.4,Iris-versicolor
+5.6,3.0,4.5,1.5,Iris-versicolor
+5.8,2.7,4.1,1.0,Iris-versicolor
+6.2,2.2,4.5,1.5,Iris-versicolor
+5.6,2.5,3.9,1.1,Iris-versicolor
+5.9,3.2,4.8,1.8,Iris-versicolor
+6.1,2.8,4.0,1.3,Iris-versicolor
+6.3,2.5,4.9,1.5,Iris-versicolor
+6.1,2.8,4.7,1.2,Iris-versicolor
+6.4,2.9,4.3,1.3,Iris-versicolor
+6.6,3.0,4.4,1.4,Iris-versicolor
+6.8,2.8,4.8,1.4,Iris-versicolor
+6.7,3.0,5.0,1.7,Iris-versicolor
+6.0,2.9,4.5,1.5,Iris-versicolor
+5.7,2.6,3.5,1.0,Iris-versicolor
+5.5,2.4,3.8,1.1,Iris-versicolor
+5.5,2.4,3.7,1.0,Iris-versicolor
+5.8,2.7,3.9,1.2,Iris-versicolor
+6.0,2.7,5.1,1.6,Iris-versicolor
+5.4,3.0,4.5,1.5,Iris-versicolor
+6.0,3.4,4.5,1.6,Iris-versicolor
+6.7,3.1,4.7,1.5,Iris-versicolor
+6.3,2.3,4.4,1.3,Iris-versicolor
+5.6,3.0,4.1,1.3,Iris-versicolor
+5.5,2.5,4.0,1.3,Iris-versicolor
+5.5,2.6,4.4,1.2,Iris-versicolor
+6.1,3.0,4.6,1.4,Iris-versicolor
+5.8,2.6,4.0,1.2,Iris-versicolor
+5.0,2.3,3.3,1.0,Iris-versicolor
+5.6,2.7,4.2,1.3,Iris-versicolor
+5.7,3.0,4.2,1.2,Iris-versicolor
+5.7,2.9,4.2,1.3,Iris-versicolor
+6.2,2.9,4.3,1.3,Iris-versicolor
+5.1,2.5,3.0,1.1,Iris-versicolor
+5.7,2.8,4.1,1.3,Iris-versicolor
+6.3,3.3,6.0,2.5,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+7.1,3.0,5.9,2.1,Iris-virginica
+6.3,2.9,5.6,1.8,Iris-virginica
+6.5,3.0,5.8,2.2,Iris-virginica
+7.6,3.0,6.6,2.1,Iris-virginica
+4.9,2.5,4.5,1.7,Iris-virginica
+7.3,2.9,6.3,1.8,Iris-virginica
+6.7,2.5,5.8,1.8,Iris-virginica
+7.2,3.6,6.1,2.5,Iris-virginica
+6.5,3.2,5.1,2.0,Iris-virginica
+6.4,2.7,5.3,1.9,Iris-virginica
+6.8,3.0,5.5,2.1,Iris-virginica
+5.7,2.5,5.0,2.0,Iris-virginica
+5.8,2.8,5.1,2.4,Iris-virginica
+6.4,3.2,5.3,2.3,Iris-virginica
+6.5,3.0,5.5,1.8,Iris-virginica
+7.7,3.8,6.7,2.2,Iris-virginica
+7.7,2.6,6.9,2.3,Iris-virginica
+6.0,2.2,5.0,1.5,Iris-virginica
+6.9,3.2,5.7,2.3,Iris-virginica
+5.6,2.8,4.9,2.0,Iris-virginica
+7.7,2.8,6.7,2.0,Iris-virginica
+6.3,2.7,4.9,1.8,Iris-virginica
+6.7,3.3,5.7,2.1,Iris-virginica
+7.2,3.2,6.0,1.8,Iris-virginica
+6.2,2.8,4.8,1.8,Iris-virginica
+6.1,3.0,4.9,1.8,Iris-virginica
+6.4,2.8,5.6,2.1,Iris-virginica
+7.2,3.0,5.8,1.6,Iris-virginica
+7.4,2.8,6.1,1.9,Iris-virginica
+7.9,3.8,6.4,2.0,Iris-virginica
+6.4,2.8,5.6,2.2,Iris-virginica
+6.3,2.8,5.1,1.5,Iris-virginica
+6.1,2.6,5.6,1.4,Iris-virginica
+7.7,3.0,6.1,2.3,Iris-virginica
+6.3,3.4,5.6,2.4,Iris-virginica
+6.4,3.1,5.5,1.8,Iris-virginica
+6.0,3.0,4.8,1.8,Iris-virginica
+6.9,3.1,5.4,2.1,Iris-virginica
+6.7,3.1,5.6,2.4,Iris-virginica
+6.9,3.1,5.1,2.3,Iris-virginica
+5.8,2.7,5.1,1.9,Iris-virginica
+6.8,3.2,5.9,2.3,Iris-virginica
+6.7,3.3,5.7,2.5,Iris-virginica
+6.7,3.0,5.2,2.3,Iris-virginica
+6.3,2.5,5.0,1.9,Iris-virginica
+6.5,3.0,5.2,2.0,Iris-virginica
+6.2,3.4,5.4,2.3,Iris-virginica
+5.9,3.0,5.1,1.8,Iris-virginica
\ No newline at end of file
diff --git a/apache-spark/model/logistic-regression/data/._SUCCESS.crc b/apache-spark/model/logistic-regression/data/._SUCCESS.crc
new file mode 100644
index 0000000000..3b7b044936
Binary files /dev/null and b/apache-spark/model/logistic-regression/data/._SUCCESS.crc differ
diff --git a/apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc b/apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc
new file mode 100644
index 0000000000..46311024cf
Binary files /dev/null and b/apache-spark/model/logistic-regression/data/.part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet.crc differ
diff --git a/core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension b/apache-spark/model/logistic-regression/data/_SUCCESS
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension
rename to apache-spark/model/logistic-regression/data/_SUCCESS
diff --git a/apache-spark/model/logistic-regression/data/part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet b/apache-spark/model/logistic-regression/data/part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet
new file mode 100644
index 0000000000..07f442ef34
Binary files /dev/null and b/apache-spark/model/logistic-regression/data/part-00000-f3a3ee61-f200-41ff-80d9-8e1edf399601-c000.snappy.parquet differ
diff --git a/apache-spark/model/logistic-regression/metadata/._SUCCESS.crc b/apache-spark/model/logistic-regression/metadata/._SUCCESS.crc
new file mode 100644
index 0000000000..3b7b044936
Binary files /dev/null and b/apache-spark/model/logistic-regression/metadata/._SUCCESS.crc differ
diff --git a/apache-spark/model/logistic-regression/metadata/.part-00000.crc b/apache-spark/model/logistic-regression/metadata/.part-00000.crc
new file mode 100644
index 0000000000..35d5043fbe
Binary files /dev/null and b/apache-spark/model/logistic-regression/metadata/.part-00000.crc differ
diff --git a/libraries-data/src/main/resources/META-INF/BenchmarkList b/apache-spark/model/logistic-regression/metadata/_SUCCESS
similarity index 100%
rename from libraries-data/src/main/resources/META-INF/BenchmarkList
rename to apache-spark/model/logistic-regression/metadata/_SUCCESS
diff --git a/apache-spark/model/logistic-regression/metadata/part-00000 b/apache-spark/model/logistic-regression/metadata/part-00000
new file mode 100644
index 0000000000..e3f27fec10
--- /dev/null
+++ b/apache-spark/model/logistic-regression/metadata/part-00000
@@ -0,0 +1 @@
+{"class":"org.apache.spark.mllib.classification.LogisticRegressionModel","version":"1.0","numFeatures":4,"numClasses":3}
diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml
index b8c1962dd4..41fd51d9fd 100644
--- a/apache-spark/pom.xml
+++ b/apache-spark/pom.xml
@@ -1,31 +1,31 @@
-
- 4.0.0
- com.baeldung
- apache-spark
- 1.0-SNAPSHOT
- apache-spark
- jar
- http://maven.apache.org
+
+ 4.0.0
+ apache-spark
+ 1.0-SNAPSHOT
+ apache-spark
+ jar
+ http://maven.apache.org
-
- com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
-
-
- org.apache.spark
- spark-core_2.11
- ${org.apache.spark.spark-core.version}
- provided
-
+
- org.apache.spark
- spark-sql_2.11
- ${org.apache.spark.spark-sql.version}
- provided
+ org.apache.spark
+ spark-core_2.11
+ ${org.apache.spark.spark-core.version}
+ provided
+
+
+ org.apache.spark
+ spark-sql_2.11
+ ${org.apache.spark.spark-sql.version}
+ provided
org.apache.spark
@@ -33,6 +33,12 @@
${org.apache.spark.spark-streaming.version}
provided
+
+ org.apache.spark
+ spark-mllib_2.11
+ ${org.apache.spark.spark-mllib.version}
+ provided
+
org.apache.spark
spark-streaming-kafka-0-10_2.11
@@ -48,46 +54,37 @@
spark-cassandra-connector-java_2.11
${com.datastax.spark.spark-cassandra-connector-java.version}
-
+
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${java.version}
- ${java.version}
-
-
-
- maven-assembly-plugin
-
-
- package
-
- single
-
-
-
-
-
- jar-with-dependencies
-
-
-
-
-
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+
-
- 2.3.0
- 2.3.0
- 2.3.0
- 2.3.0
- 2.3.0
- 1.5.2
- 3.2
-
+
+ 2.3.0
+ 2.3.0
+ 2.3.0
+ 2.3.0
+ 2.3.0
+ 2.3.0
+ 1.5.2
+
diff --git a/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java b/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java
new file mode 100644
index 0000000000..6094683031
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/ml/MachineLearningApp.java
@@ -0,0 +1,111 @@
+package com.baeldung.ml;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.spark.SparkConf;
+import org.apache.spark.api.java.JavaPairRDD;
+import org.apache.spark.api.java.JavaRDD;
+import org.apache.spark.api.java.JavaSparkContext;
+import org.apache.spark.mllib.classification.LogisticRegressionModel;
+import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS;
+import org.apache.spark.mllib.evaluation.MulticlassMetrics;
+import org.apache.spark.mllib.linalg.Matrix;
+import org.apache.spark.mllib.linalg.Vector;
+import org.apache.spark.mllib.linalg.Vectors;
+import org.apache.spark.mllib.regression.LabeledPoint;
+import org.apache.spark.mllib.stat.MultivariateStatisticalSummary;
+import org.apache.spark.mllib.stat.Statistics;
+
+import scala.Tuple2;
+
+public class MachineLearningApp {
+
+ public static void main(String[] args) {
+
+ // 1. Setting the Spark Context
+ SparkConf conf = new SparkConf().setAppName("Main")
+ .setMaster("local[2]")
+ .set("spark.executor.memory", "3g")
+ .set("spark.driver.memory", "3g");
+ JavaSparkContext sc = new JavaSparkContext(conf);
+ Logger.getLogger("org")
+ .setLevel(Level.OFF);
+ Logger.getLogger("akka")
+ .setLevel(Level.OFF);
+
+ // 2. Loading the Data-set
+ String dataFile = "data\\iris.data";
+ JavaRDD data = sc.textFile(dataFile);
+
+ // 3. Exploratory Data Analysis
+ // 3.1. Creating Vector of Input Data
+ JavaRDD inputData = data.map(line -> {
+ String[] parts = line.split(",");
+ double[] v = new double[parts.length - 1];
+ for (int i = 0; i < parts.length - 1; i++) {
+ v[i] = Double.parseDouble(parts[i]);
+ }
+ return Vectors.dense(v);
+ });
+ // 3.2. Performing Statistical Analysis
+ MultivariateStatisticalSummary summary = Statistics.colStats(inputData.rdd());
+ System.out.println("Summary Mean:");
+ System.out.println(summary.mean());
+ System.out.println("Summary Variance:");
+ System.out.println(summary.variance());
+ System.out.println("Summary Non-zero:");
+ System.out.println(summary.numNonzeros());
+ // 3.3. Performing Correlation Analysis
+ Matrix correlMatrix = Statistics.corr(inputData.rdd(), "pearson");
+ System.out.println("Correlation Matrix:");
+ System.out.println(correlMatrix.toString());
+
+ // 4. Data Preparation
+ // 4.1. Creating Map for Textual Output Labels
+ Map map = new HashMap();
+ map.put("Iris-setosa", 0);
+ map.put("Iris-versicolor", 1);
+ map.put("Iris-virginica", 2);
+ // 4.2. Creating LabeledPoint of Input and Output Data
+ JavaRDD parsedData = data.map(line -> {
+ String[] parts = line.split(",");
+ double[] v = new double[parts.length - 1];
+ for (int i = 0; i < parts.length - 1; i++) {
+ v[i] = Double.parseDouble(parts[i]);
+ }
+ return new LabeledPoint(map.get(parts[parts.length - 1]), Vectors.dense(v));
+ });
+
+ // 5. Data Splitting into 80% Training and 20% Test Sets
+ JavaRDD[] splits = parsedData.randomSplit(new double[] { 0.8, 0.2 }, 11L);
+ JavaRDD trainingData = splits[0].cache();
+ JavaRDD testData = splits[1];
+
+ // 6. Modeling
+ // 6.1. Model Training
+ LogisticRegressionModel model = new LogisticRegressionWithLBFGS().setNumClasses(3)
+ .run(trainingData.rdd());
+ // 6.2. Model Evaluation
+ JavaPairRDD predictionAndLabels = testData.mapToPair(p -> new Tuple2<>(model.predict(p.features()), p.label()));
+ MulticlassMetrics metrics = new MulticlassMetrics(predictionAndLabels.rdd());
+ double accuracy = metrics.accuracy();
+ System.out.println("Model Accuracy on Test Data: " + accuracy);
+
+ // 7. Model Saving and Loading
+ // 7.1. Model Saving
+ model.save(sc.sc(), "model\\logistic-regression");
+ // 7.2. Model Loading
+ LogisticRegressionModel sameModel = LogisticRegressionModel.load(sc.sc(), "model\\logistic-regression");
+ // 7.3. Prediction on New Data
+ Vector newData = Vectors.dense(new double[] { 1, 1, 1, 1 });
+ double prediction = sameModel.predict(newData);
+ System.out.println("Model Prediction on New Data = " + prediction);
+
+ // 8. Clean-up
+ sc.close();
+ }
+
+}
diff --git a/apache-thrift/README.md b/apache-thrift/README.md
index d8b9195dcc..4508939de6 100644
--- a/apache-thrift/README.md
+++ b/apache-thrift/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Thrift
-- [Working with Apache Thrift](http://www.baeldung.com/apache-thrift)
+This module contains articles about Apache Thrift
+
+### Relevant articles:
+
+- [Working with Apache Thrift](https://www.baeldung.com/apache-thrift)
diff --git a/apache-tika/README.md b/apache-tika/README.md
index b92a7bebf1..690e55edc3 100644
--- a/apache-tika/README.md
+++ b/apache-tika/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Tika
-- [Content Analysis with Apache Tika](http://www.baeldung.com/apache-tika)
+This module contains articles about Apache Tika
+
+### Relevant articles:
+
+- [Content Analysis with Apache Tika](https://www.baeldung.com/apache-tika)
diff --git a/apache-velocity/README.md b/apache-velocity/README.md
index 53c67f847e..d539d79efc 100644
--- a/apache-velocity/README.md
+++ b/apache-velocity/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Velocity
-- [Introduction to Apache Velocity](http://www.baeldung.com/apache-velocity)
+This module contains articles about Apache Velocity
+
+### Relevant articles:
+
+- [Introduction to Apache Velocity](https://www.baeldung.com/apache-velocity)
diff --git a/apache-velocity/pom.xml b/apache-velocity/pom.xml
index 24ab0b861d..b370b11cc1 100644
--- a/apache-velocity/pom.xml
+++ b/apache-velocity/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
0.1-SNAPSHOT
apache-velocity
apache-velocity
diff --git a/apache-zookeeper/README.md b/apache-zookeeper/README.md
index 6bddcfd5a8..cda1cd6d73 100644
--- a/apache-zookeeper/README.md
+++ b/apache-zookeeper/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Apache Zookeeper
-- [Getting Started with Java and Zookeeper](http://www.baeldung.com/java-zookeeper)
+This module contains articles about Apache Zookeeper
+
+### Relevant articles:
+
+- [Getting Started with Java and Zookeeper](https://www.baeldung.com/java-zookeeper)
diff --git a/asciidoctor/README.md b/asciidoctor/README.md
index 2124907e87..87b1ec833c 100644
--- a/asciidoctor/README.md
+++ b/asciidoctor/README.md
@@ -1,4 +1,8 @@
-### Relevant articles
+## Asciidoctor
-- [Generating a Book with Asciidoctor](http://www.baeldung.com/asciidoctor-book)
-- [Introduction to Asciidoctor in Java](http://www.baeldung.com/asciidoctor)
+This module contains articles about Asciidoctor
+
+### Relevant articles:
+
+- [Generating a Book with Asciidoctor](https://www.baeldung.com/asciidoctor-book)
+- [Introduction to Asciidoctor in Java](https://www.baeldung.com/asciidoctor)
diff --git a/asm/README.md b/asm/README.md
index 50d9c34324..e10cdc45bd 100644
--- a/asm/README.md
+++ b/asm/README.md
@@ -1,3 +1,7 @@
+## ASM
+
+This module contains articles about ASM
+
### Relevant Articles:
-- [A Guide to Java Bytecode Manipulation with ASM](http://www.baeldung.com/java-asm)
+- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm)
diff --git a/atomix/README.md b/atomix/README.md
index fb22eec8dc..217fced82a 100644
--- a/atomix/README.md
+++ b/atomix/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Atomix
-- [Introduction to Atomix](http://www.baeldung.com/atomix)
+This module contains articles about Atomix
+
+### Relevant articles:
+
+- [Introduction to Atomix](https://www.baeldung.com/atomix)
diff --git a/autovalue/README.md b/autovalue/README.md
deleted file mode 100644
index f33ff6899f..0000000000
--- a/autovalue/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-### Relevant Articles:
-- [Introduction to AutoValue](http://www.baeldung.com/introduction-to-autovalue)
-- [Introduction to AutoFactory](http://www.baeldung.com/autofactory)
-- [Google AutoService](https://www.baeldung.com/google-autoservice)
diff --git a/aws-lambda/README.md b/aws-lambda/README.md
index 921b699bdd..2fbdaace10 100644
--- a/aws-lambda/README.md
+++ b/aws-lambda/README.md
@@ -1,3 +1,7 @@
+## AWS Lambda
+
+This module contains articles about AWS Lambda
+
### Relevant Articles:
-- [Using AWS Lambda with API Gateway](http://www.baeldung.com/aws-lambda-api-gateway)
-- [Introduction to AWS Serverless Application Model](http://www.baeldung.com/aws-serverless)
+- [Using AWS Lambda with API Gateway](https://www.baeldung.com/aws-lambda-api-gateway)
+- [Introduction to AWS Serverless Application Model](https://www.baeldung.com/aws-serverless)
diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml
index c799718e61..1f3c31f87c 100644
--- a/aws-lambda/pom.xml
+++ b/aws-lambda/pom.xml
@@ -2,7 +2,6 @@
4.0.0
- com.baeldung
aws-lambda
0.1.0-SNAPSHOT
aws-lambda
@@ -88,7 +87,6 @@
1.1.1
- 20180130
2.5
1.3.0
1.2.0
diff --git a/aws/README.md b/aws/README.md
index d14ea8a75e..9e4ca8b699 100644
--- a/aws/README.md
+++ b/aws/README.md
@@ -1,11 +1,15 @@
+## AWS
+
+This module contains articles about AWS
+
### Relevant articles
-- [AWS Lambda Using DynamoDB With Java](http://www.baeldung.com/aws-lambda-dynamodb-java)
-- [AWS S3 with Java](http://www.baeldung.com/aws-s3-java)
-- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda)
-- [Managing EC2 Instances in Java](http://www.baeldung.com/ec2-java)
-- [Multipart Uploads in Amazon S3 with Java](http://www.baeldung.com/aws-s3-multipart-upload)
-- [Integration Testing with a Local DynamoDB Instance](http://www.baeldung.com/dynamodb-local-integration-tests)
-- [Using the JetS3t Java Client With Amazon S3](http://www.baeldung.com/jets3t-amazon-s3)
-- [Managing Amazon SQS Queues in Java](http://www.baeldung.com/aws-queues-java)
+- [AWS Lambda Using DynamoDB With Java](https://www.baeldung.com/aws-lambda-dynamodb-java)
+- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java)
+- [AWS Lambda With Java](https://www.baeldung.com/java-aws-lambda)
+- [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java)
+- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload)
+- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests)
+- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3)
+- [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java)
- [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java)
diff --git a/aws/pom.xml b/aws/pom.xml
index 75d5aac1eb..45a30f96ba 100644
--- a/aws/pom.xml
+++ b/aws/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
aws
0.1.0-SNAPSHOT
aws
diff --git a/axon/README.md b/axon/README.md
index f1ae5d00d8..069102fc3a 100644
--- a/axon/README.md
+++ b/axon/README.md
@@ -1,3 +1,7 @@
+## Axon
+
+This module contains articles about Axon
+
### Relevant articles
-- [A Guide to the Axon Framework](http://www.baeldung.com/axon-cqrs-event-sourcing)
+- [A Guide to the Axon Framework](https://www.baeldung.com/axon-cqrs-event-sourcing)
diff --git a/axon/pom.xml b/axon/pom.xml
index 2b9ac1fcdd..21e21f0ef2 100644
--- a/axon/pom.xml
+++ b/axon/pom.xml
@@ -18,12 +18,6 @@
org.axonframework
axon-spring-boot-starter
${axon.version}
-
-
- org.axonframework
- axon-server-connector
-
-
@@ -36,7 +30,6 @@
org.springframework.boot
spring-boot-autoconfigure
- ${spring-boot.version}
compile
@@ -58,7 +51,7 @@
- 4.0.3
+ 4.1.2
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java
index b37b2fdd66..4ef02e6b54 100644
--- a/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java
+++ b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java
@@ -13,6 +13,7 @@ import com.baeldung.axon.coreapi.commands.ShipOrderCommand;
import com.baeldung.axon.coreapi.events.OrderConfirmedEvent;
import com.baeldung.axon.coreapi.events.OrderPlacedEvent;
import com.baeldung.axon.coreapi.events.OrderShippedEvent;
+import com.baeldung.axon.coreapi.exceptions.UnconfirmedOrderException;
@Aggregate
public class OrderAggregate {
@@ -34,7 +35,7 @@ public class OrderAggregate {
@CommandHandler
public void handle(ShipOrderCommand command) {
if (!orderConfirmed) {
- throw new IllegalStateException("Cannot ship an order which has not been confirmed yet.");
+ throw new UnconfirmedOrderException();
}
apply(new OrderShippedEvent(orderId));
@@ -43,12 +44,12 @@ public class OrderAggregate {
@EventSourcingHandler
public void on(OrderPlacedEvent event) {
this.orderId = event.getOrderId();
- orderConfirmed = false;
+ this.orderConfirmed = false;
}
@EventSourcingHandler
public void on(OrderConfirmedEvent event) {
- orderConfirmed = true;
+ this.orderConfirmed = true;
}
protected OrderAggregate() {
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java b/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java
new file mode 100644
index 0000000000..1873bc6893
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/exceptions/UnconfirmedOrderException.java
@@ -0,0 +1,8 @@
+package com.baeldung.axon.coreapi.exceptions;
+
+public class UnconfirmedOrderException extends IllegalStateException {
+
+ public UnconfirmedOrderException() {
+ super("Cannot ship an order which has not been confirmed yet.");
+ }
+}
diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java
index d4cf3d999b..a37f0111ed 100644
--- a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java
+++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java
@@ -5,6 +5,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.axonframework.config.ProcessingGroup;
import org.axonframework.eventhandling.EventHandler;
import org.axonframework.queryhandling.QueryHandler;
import org.springframework.stereotype.Service;
@@ -16,6 +17,7 @@ import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery;
import com.baeldung.axon.coreapi.queries.OrderedProduct;
@Service
+@ProcessingGroup("ordered-products")
public class OrderedProductsEventHandler {
private final Map orderedProducts = new HashMap<>();
diff --git a/axon/src/main/resources/application.properties b/axon/src/main/resources/application.properties
new file mode 100644
index 0000000000..7c51eb8e1e
--- /dev/null
+++ b/axon/src/main/resources/application.properties
@@ -0,0 +1 @@
+spring.application.name=Order Management Service
\ No newline at end of file
diff --git a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java
index 9beedbaa19..aaefe49fb1 100644
--- a/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java
+++ b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java
@@ -2,6 +2,7 @@ package com.baeldung.axon.commandmodel;
import java.util.UUID;
+import com.baeldung.axon.coreapi.exceptions.UnconfirmedOrderException;
import org.axonframework.test.aggregate.AggregateTestFixture;
import org.axonframework.test.aggregate.FixtureConfiguration;
import org.junit.*;
@@ -41,12 +42,12 @@ public class OrderAggregateUnitTest {
}
@Test
- public void givenOrderPlacedEvent_whenShipOrderCommand_thenShouldThrowIllegalStateException() {
+ public void givenOrderPlacedEvent_whenShipOrderCommand_thenShouldThrowUnconfirmedOrderException() {
String orderId = UUID.randomUUID().toString();
String product = "Deluxe Chair";
fixture.given(new OrderPlacedEvent(orderId, product))
.when(new ShipOrderCommand(orderId))
- .expectException(IllegalStateException.class);
+ .expectException(UnconfirmedOrderException.class);
}
@Test
diff --git a/azure/README.md b/azure/README.md
index ae8c443660..4da8481502 100644
--- a/azure/README.md
+++ b/azure/README.md
@@ -1,4 +1,8 @@
+## Azure
+
+This module contains articles about Azure
+
### Relevant Articles:
-- [Deploy a Spring Boot App to Azure](http://www.baeldung.com/spring-boot-azure)
+- [Deploy a Spring Boot App to Azure](https://www.baeldung.com/spring-boot-azure)
diff --git a/azure/pom.xml b/azure/pom.xml
index 270b3e4829..3d9c296748 100644
--- a/azure/pom.xml
+++ b/azure/pom.xml
@@ -2,7 +2,6 @@
4.0.0
- com.baeldung
azure
0.1
azure
diff --git a/bazel/README.md b/bazel/README.md
new file mode 100644
index 0000000000..af4f901f49
--- /dev/null
+++ b/bazel/README.md
@@ -0,0 +1,7 @@
+## Bazel
+
+This module contains articles about Bazel
+
+### Relevant Articles:
+
+- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool)
diff --git a/bazel/WORKSPACE b/bazel/WORKSPACE
new file mode 100644
index 0000000000..415aa398f9
--- /dev/null
+++ b/bazel/WORKSPACE
@@ -0,0 +1,31 @@
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+
+RULES_JVM_EXTERNAL_TAG = "2.0.1"
+RULES_JVM_EXTERNAL_SHA = "55e8d3951647ae3dffde22b4f7f8dee11b3f70f3f89424713debd7076197eaca"
+
+http_archive(
+ name = "rules_jvm_external",
+ strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
+ sha256 = RULES_JVM_EXTERNAL_SHA,
+ url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
+)
+
+load("@rules_jvm_external//:defs.bzl", "maven_install")
+
+maven_install(
+ artifacts = [
+ "org.apache.commons:commons-lang3:3.9"
+ ],
+ repositories = [
+ "https://repo1.maven.org/maven2",
+ ]
+)
+
+http_jar (
+ name = "apache-commons-lang",
+ url = "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
+)
+
diff --git a/bazel/bazelapp/BUILD b/bazel/bazelapp/BUILD
new file mode 100644
index 0000000000..1de95aada5
--- /dev/null
+++ b/bazel/bazelapp/BUILD
@@ -0,0 +1,7 @@
+
+java_binary (
+ name = "BazelApp",
+ srcs = glob(["src/main/java/com/baeldung/*.java"]),
+ main_class = "com.baeldung.BazelApp",
+ deps = ["//bazelgreeting:greeter", "@maven//:org_apache_commons_commons_lang3"]
+)
diff --git a/bazel/bazelapp/pom.xml b/bazel/bazelapp/pom.xml
new file mode 100644
index 0000000000..e56cc06ef4
--- /dev/null
+++ b/bazel/bazelapp/pom.xml
@@ -0,0 +1,32 @@
+
+
+ 4.0.0
+ bazelapp
+ bazelapp
+
+
+ bazel
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.baeldung
+ bazelgreeting
+ ${bazelgreeting.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+ 1.0.0-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java b/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java
new file mode 100644
index 0000000000..e92d85018b
--- /dev/null
+++ b/bazel/bazelapp/src/main/java/com/baeldung/BazelApp.java
@@ -0,0 +1,15 @@
+package com.baeldung;
+
+import com.baeldung.Greetings;
+import org.apache.commons.lang3.StringUtils;
+
+public class BazelApp {
+
+ public static void main(String ... args) {
+ Greetings greetings = new Greetings();
+
+ System.out.println(greetings.greet("Bazel"));
+
+ System.out.println(StringUtils.lowerCase("Bazel"));
+ }
+}
diff --git a/bazel/bazelgreeting/BUILD b/bazel/bazelgreeting/BUILD
new file mode 100644
index 0000000000..6cd8bc13f7
--- /dev/null
+++ b/bazel/bazelgreeting/BUILD
@@ -0,0 +1,6 @@
+
+java_library (
+ name = "greeter",
+ srcs = glob(["src/main/java/com/baeldung/*.java"]),
+ visibility = ["//bazelapp:__pkg__"]
+)
diff --git a/bazel/bazelgreeting/pom.xml b/bazel/bazelgreeting/pom.xml
new file mode 100644
index 0000000000..e688a55bd5
--- /dev/null
+++ b/bazel/bazelgreeting/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+ bazelgreeting
+ bazelgreeting
+
+
+ bazel
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
\ No newline at end of file
diff --git a/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java b/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java
new file mode 100644
index 0000000000..0e8fae7fbe
--- /dev/null
+++ b/bazel/bazelgreeting/src/main/java/com/baeldung/Greetings.java
@@ -0,0 +1,8 @@
+package com.baeldung;
+
+public class Greetings {
+
+ public String greet(String name) {
+ return "Hello ".concat(name);
+ }
+}
diff --git a/bazel/pom.xml b/bazel/pom.xml
new file mode 100644
index 0000000000..cb784ec6e6
--- /dev/null
+++ b/bazel/pom.xml
@@ -0,0 +1,22 @@
+
+
+ 4.0.0
+ bazel
+ pom
+ bazel
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+ bazelgreeting
+ bazelapp
+
+
+
+
\ No newline at end of file
diff --git a/blade/README.md b/blade/README.md
index 1f2a00ed3f..202494330f 100644
--- a/blade/README.md
+++ b/blade/README.md
@@ -1,5 +1,5 @@
### Relevant Articles:
-- [Blade – A Complete Guidebook](http://www.baeldung.com/blade)
+- [Blade – A Complete Guidebook](https://www.baeldung.com/blade)
Run Integration Tests with `mvn integration-test`
diff --git a/blade/pom.xml b/blade/pom.xml
index 37615bed01..6f8a78852d 100644
--- a/blade/pom.xml
+++ b/blade/pom.xml
@@ -3,19 +3,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
-
- com.baeldung
blade
- 1.0.0-SNAPSHOT
blade
-
-
-
-
-
-
-
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
@@ -45,12 +40,6 @@
-
- junit
- junit
- ${junit.version}
- test
-
org.assertj
assertj-core
@@ -79,20 +68,6 @@
sample-blade-app
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
- 3
- true
-
- **/*LiveTest.java
-
-
-
-
org.apache.maven.plugins
maven-failsafe-plugin
@@ -172,34 +147,19 @@
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
- UTF-8
-
-
- 1.8
- 1.8
2.0.14.RELEASE
4.2.1
3.8.1
1.18.4
- 4.12
4.5.6
4.5.6
4.4.10
3.11.1
3.0.0-M3
0.7
- 2.21.0
- 3.7.0
diff --git a/bootique/README.md b/bootique/README.md
index 2ef898fcf7..0d4076201e 100644
--- a/bootique/README.md
+++ b/bootique/README.md
@@ -1,2 +1,6 @@
+## Bootique
+
+This module contains articles about Bootique
+
### Relevant Articles:
-- [Introduction to Bootique](http://www.baeldung.com/bootique)
+- [Introduction to Bootique](https://www.baeldung.com/bootique)
diff --git a/bootique/pom.xml b/bootique/pom.xml
index 4dd9ba4833..7601321b99 100644
--- a/bootique/pom.xml
+++ b/bootique/pom.xml
@@ -42,12 +42,6 @@
bootique-test
test
-
- junit
- junit
- ${junit.version}
- test
-
diff --git a/cas/README.md b/cas/README.md
new file mode 100644
index 0000000000..16775a8a02
--- /dev/null
+++ b/cas/README.md
@@ -0,0 +1,7 @@
+## CAS
+
+This module contains articles about the Central Authentication Service (CAS)
+
+### Relevant Articles:
+
+- [CAS SSO With Spring Security](baeldung.com/spring-security-cas-sso)
\ No newline at end of file
diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml
index 98f5f10493..8a1e602114 100644
--- a/cas/cas-server/pom.xml
+++ b/cas/cas-server/pom.xml
@@ -198,7 +198,6 @@
0.0.4
2.6
- 3.3
0.3.0
1.1.0
diff --git a/cdi/README.md b/cdi/README.md
index bfb635be9e..13169698a2 100644
--- a/cdi/README.md
+++ b/cdi/README.md
@@ -1,5 +1,9 @@
+## CDI
+
+This module contains articles about Contexts and Dependency Injection (CDI)
+
### Relevant Articles:
-- [CDI Interceptor vs Spring AspectJ](http://www.baeldung.com/cdi-interceptor-vs-spring-aspectj)
-- [An Introduction to CDI (Contexts and Dependency Injection) in Java](http://www.baeldung.com/java-ee-cdi)
+- [CDI Interceptor vs Spring AspectJ](https://www.baeldung.com/cdi-interceptor-vs-spring-aspectj)
+- [An Introduction to CDI (Contexts and Dependency Injection) in Java](https://www.baeldung.com/java-ee-cdi)
- [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification)
diff --git a/cdi/pom.xml b/cdi/pom.xml
index c98ad57495..809622a5db 100644
--- a/cdi/pom.xml
+++ b/cdi/pom.xml
@@ -36,12 +36,6 @@
${assertj-core.version}
test
-
- junit
- junit
- ${junit.version}
- test
-
org.springframework
spring-context
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
index 4896408502..dc0bdeb951 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java
@@ -1,15 +1,16 @@
-package com.baeldung.cdi.cdi2observers.application;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import javax.enterprise.inject.se.SeContainer;
-import javax.enterprise.inject.se.SeContainerInitializer;
-
-public class BootstrappingApplication {
-
- public static void main(String... args) {
- SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
- try (SeContainer container = containerInitializer.initialize()) {
- container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!"));
- }
- }
-}
+package com.baeldung.cdi2observers.application;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+
+import javax.enterprise.inject.se.SeContainer;
+import javax.enterprise.inject.se.SeContainerInitializer;
+
+public class BootstrappingApplication {
+
+ public static void main(String... args) {
+ SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance();
+ try (SeContainer container = containerInitializer.initialize()) {
+ container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!"));
+ }
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
index a2329d2ef1..9adfad4d39 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java
@@ -1,14 +1,14 @@
-package com.baeldung.cdi.cdi2observers.events;
-
-public class ExampleEvent {
-
- private final String eventMessage;
-
- public ExampleEvent(String eventMessage) {
- this.eventMessage = eventMessage;
- }
-
- public String getEventMessage() {
- return eventMessage;
- }
-}
+package com.baeldung.cdi2observers.events;
+
+public class ExampleEvent {
+
+ private final String eventMessage;
+
+ public ExampleEvent(String eventMessage) {
+ this.eventMessage = eventMessage;
+ }
+
+ public String getEventMessage() {
+ return eventMessage;
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
index f37030778a..5a0aa0b5e3 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java
@@ -1,14 +1,14 @@
-package com.baeldung.cdi.cdi2observers.events;
-
-import javax.enterprise.event.Event;
-import javax.inject.Inject;
-
-public class ExampleEventSource {
-
- @Inject
- Event exampleEvent;
-
- public void fireEvent() {
- exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!"));
- }
-}
+package com.baeldung.cdi2observers.events;
+
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+public class ExampleEventSource {
+
+ @Inject
+ Event exampleEvent;
+
+ public void fireEvent() {
+ exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!"));
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
index 34520c2b3d..3af48af13f 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java
@@ -1,12 +1,13 @@
-package com.baeldung.cdi.cdi2observers.observers;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import javax.annotation.Priority;
-import javax.enterprise.event.Observes;
-
-public class AnotherExampleEventObserver {
-
- public String onEvent(@Observes @Priority(2) ExampleEvent event) {
- return event.getEventMessage();
- }
-}
+package com.baeldung.cdi2observers.observers;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class AnotherExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(2) ExampleEvent event) {
+ return event.getEventMessage();
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
index b3522b2ad0..33fdc43bbb 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java
@@ -1,13 +1,13 @@
-package com.baeldung.cdi.cdi2observers.observers;
-
-import com.baeldung.cdi.cdi2observers.events.ExampleEvent;
-import com.baeldung.cdi.cdi2observers.services.TextService;
-import javax.annotation.Priority;
-import javax.enterprise.event.Observes;
-
-public class ExampleEventObserver {
-
- public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) {
- return textService.parseText(event.getEventMessage());
- }
-}
+package com.baeldung.cdi2observers.observers;
+
+import com.baeldung.cdi2observers.events.ExampleEvent;
+import com.baeldung.cdi2observers.services.TextService;
+import javax.annotation.Priority;
+import javax.enterprise.event.Observes;
+
+public class ExampleEventObserver {
+
+ public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) {
+ return textService.parseText(event.getEventMessage());
+ }
+}
diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
index 47788a0657..eabe031223 100644
--- a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
+++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java
@@ -1,8 +1,8 @@
-package com.baeldung.cdi.cdi2observers.services;
-
-public class TextService {
-
- public String parseText(String text) {
- return text.toUpperCase();
- }
-}
+package com.baeldung.cdi2observers.services;
+
+public class TextService {
+
+ public String parseText(String text) {
+ return text.toUpperCase();
+ }
+}
diff --git a/cdi/src/main/resources/META-INF/beans.xml b/cdi/src/main/resources/META-INF/beans.xml
index d41b35e7d9..144e9e567f 100644
--- a/cdi/src/main/resources/META-INF/beans.xml
+++ b/cdi/src/main/resources/META-INF/beans.xml
@@ -1,7 +1,8 @@
-
+
+ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
+ bean-discovery-mode="all">
com.baeldung.interceptor.AuditedInterceptor
diff --git a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
index deecf13f9a..1b976144aa 100644
--- a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
+++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java
@@ -1,14 +1,15 @@
-package com.baeldung.cdi.cdi2observers.tests;
-
-import com.baeldung.cdi.cdi2observers.services.TextService;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-
-public class TextServiceUnitTest {
-
- @Test
- public void givenTextServiceInstance_whenCalledparseText_thenCorrect() {
- TextService textService = new TextService();
- assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG");
- }
-}
+package com.baeldung.test.cdi2observers.tests;
+
+import com.baeldung.cdi2observers.services.TextService;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TextServiceUnitTest {
+
+ @Test
+ public void givenTextServiceInstance_whenCalledparseText_thenCorrect() {
+ TextService textService = new TextService();
+ assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG");
+ }
+}
diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
index caf2ed32b5..b22f189373 100644
--- a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
+++ b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java
@@ -6,7 +6,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
public class TimeLoggerFactoryUnitTest {
-
@Test
public void givenTimeLoggerFactory_whenCalledgetTimeLogger_thenOneAssertion() {
TimeLoggerFactory timeLoggerFactory = new TimeLoggerFactory();
diff --git a/checker-plugin/README.md b/checker-plugin/README.md
index f4534b09e8..59dc2878a2 100644
--- a/checker-plugin/README.md
+++ b/checker-plugin/README.md
@@ -1,3 +1,7 @@
+## Checker Plugin
+
+This module contains articles about the Checker Plugin
+
### Relevant articles
-- [The Checker Framework – Pluggable Type Systems for Java](http://www.baeldung.com/checker-framework)
+- [The Checker Framework – Pluggable Type Systems for Java](https://www.baeldung.com/checker-framework)
diff --git a/checker-plugin/pom.xml b/checker-plugin/pom.xml
index 08408366a4..63def4dbdc 100644
--- a/checker-plugin/pom.xml
+++ b/checker-plugin/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
checker-plugin
1.0-SNAPSHOT
checker-plugin
diff --git a/cloud-foundry-uaa/README.md b/cloud-foundry-uaa/README.md
index b2f382cad1..f7707a04e2 100644
--- a/cloud-foundry-uaa/README.md
+++ b/cloud-foundry-uaa/README.md
@@ -1,3 +1,7 @@
-### Revelant Articles
+## Cloud Foundry UAA
+
+This module contains articles about Cloud Foundry UAA
+
+### Relevant Articles:
- [A Quick Guide To Using Cloud Foundry UAA](https://www.baeldung.com/cloud-foundry-uaa)
diff --git a/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml b/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
index c6de00dbe9..fe1b919905 100644
--- a/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
+++ b/cloud-foundry-uaa/cf-uaa-oauth2-client/pom.xml
@@ -4,7 +4,6 @@
4.0.0
com.example
cf-uaa-oauth2-client
- 0.0.1-SNAPSHOT
uaa-client-webapp
Demo project for Spring Boot
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 56fb23e9d8..7cd47bb7b3 100644
--- a/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml
+++ b/cloud-foundry-uaa/cf-uaa-oauth2-resource-server/pom.xml
@@ -4,7 +4,6 @@
4.0.0
com.baeldung.cfuaa
cf-uaa-oauth2-resource-server
- 0.0.1-SNAPSHOT
cf-uaa-oauth2-resource-server
Demo project for Spring Boot
diff --git a/code-generation/README.md b/code-generation/README.md
new file mode 100644
index 0000000000..289a336f99
--- /dev/null
+++ b/code-generation/README.md
@@ -0,0 +1,9 @@
+## Code Generation
+
+This module contains articles about automatic code generation
+
+### Relevant Articles:
+
+- [Introduction to AutoValue](https://www.baeldung.com/introduction-to-autovalue)
+- [Introduction to AutoFactory](https://www.baeldung.com/autofactory)
+- [Google AutoService](https://www.baeldung.com/google-autoservice)
diff --git a/autovalue/pom.xml b/code-generation/pom.xml
similarity index 94%
rename from autovalue/pom.xml
rename to code-generation/pom.xml
index a10e8ef055..b52e558b53 100644
--- a/autovalue/pom.xml
+++ b/code-generation/pom.xml
@@ -1,10 +1,9 @@
4.0.0
- com.baeldung
- autovalue
+ code-generation
1.0
- autovalue
+ code-generation
com.baeldung
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/App.java b/code-generation/src/main/java/com/baeldung/autofactory/App.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/App.java
rename to code-generation/src/main/java/com/baeldung/autofactory/App.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java b/code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java
rename to code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java
rename to code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java b/code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
rename to code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java b/code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
rename to code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java
diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java b/code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
rename to code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
rename to code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
rename to code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java
diff --git a/autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java b/code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java
rename to code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/Foo.java b/code-generation/src/main/java/com/baeldung/autovalue/Foo.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/Foo.java
rename to code-generation/src/main/java/com/baeldung/autovalue/Foo.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java
diff --git a/autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java
similarity index 100%
rename from autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java
rename to code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java
diff --git a/autovalue/src/main/resources/logback.xml b/code-generation/src/main/resources/logback.xml
similarity index 100%
rename from autovalue/src/main/resources/logback.xml
rename to code-generation/src/main/resources/logback.xml
diff --git a/autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java b/code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
similarity index 100%
rename from autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
rename to code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java
diff --git a/autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java b/code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
similarity index 100%
rename from autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
rename to code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java
diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md
index 33df8b107b..f1984f18f4 100644
--- a/core-groovy-2/README.md
+++ b/core-groovy-2/README.md
@@ -1,10 +1,15 @@
-# Groovy
+# Core Groovy 2
+
+This module contains articles about core Groovy concepts
## Relevant articles:
-- [String Matching in Groovy](http://www.baeldung.com/)
- [Template Engines in Groovy](https://www.baeldung.com/groovy-template-engines)
- [Groovy def Keyword](https://www.baeldung.com/groovy-def-keyword)
- [Pattern Matching in Strings in Groovy](https://www.baeldung.com/groovy-pattern-matching)
- [Working with XML in Groovy](https://www.baeldung.com/groovy-xml)
- [Integrating Groovy into Java Applications](https://www.baeldung.com/groovy-java-applications)
+- [Concatenate Strings with Groovy](https://www.baeldung.com/groovy-concatenate-strings)
+- [Metaprogramming in Groovy](https://www.baeldung.com/groovy-metaprogramming)
+- [A Quick Guide to Working with Web Services in Groovy](https://www.baeldung.com/groovy-web-services)
+- [[<-- Prev]](/core-groovy)
diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml
index ba3fd0802b..08526bac9a 100644
--- a/core-groovy-2/pom.xml
+++ b/core-groovy-2/pom.xml
@@ -48,6 +48,11 @@
${spock-core.version}
test
+
+ com.github.groovy-wslite
+ groovy-wslite
+ ${groovy-wslite.version}
+
@@ -175,10 +180,9 @@
1.0.0
2.4.0
1.1-groovy-2.4
- 3.8.1
+ 1.1.3
1.2.3
2.5.7
- UTF-8
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy
new file mode 100644
index 0000000000..479c39699f
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy
@@ -0,0 +1,17 @@
+package com.baeldung.category;
+
+class BaeldungCategory {
+
+ public static String capitalize(String self) {
+ String capitalizedStr = self;
+ if (self.size() > 0) {
+ capitalizedStr = self.substring(0, 1).toUpperCase() + self.substring(1);
+ }
+ return capitalizedStr
+ }
+
+ public static double toThePower(Number self, Number exponent) {
+ return Math.pow(self, exponent);
+ }
+
+}
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy
new file mode 100644
index 0000000000..ccf2ed519b
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy
@@ -0,0 +1,17 @@
+package com.baeldung.category;
+
+import groovy.lang.Category
+
+@Category(Number)
+class NumberCategory {
+
+ public Number cube() {
+ return this*this*this
+ }
+
+ public int divideWithRoundUp(BigDecimal divisor, boolean isRoundUp) {
+ def mathRound = isRoundUp ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN
+ return (int)new BigDecimal(this).divide(divisor, 0, mathRound)
+ }
+
+}
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy
new file mode 100644
index 0000000000..f49d0f906b
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/Employee.groovy
@@ -0,0 +1,45 @@
+package com.baeldung.metaprogramming
+
+import groovy.transform.AutoClone
+import groovy.transform.Canonical
+import groovy.transform.EqualsAndHashCode
+import groovy.transform.ToString
+import groovy.transform.TupleConstructor
+import groovy.util.logging.*
+
+@Canonical
+@TupleConstructor
+@EqualsAndHashCode
+@ToString(includePackage=false, excludes=['id'])
+@Log
+@AutoClone
+class Employee {
+
+ long id
+ String firstName
+ String lastName
+ int age
+
+ //method to catch missing property's getter
+ def propertyMissing(String propertyName) {
+ log.info "$propertyName is not available"
+ "property '$propertyName' is not available"
+ }
+
+ //method to catch missing property's setter
+ def propertyMissing(String propertyName, propertyValue) {
+ println "property '$propertyName' is not available"
+ log.info "$propertyName is not available"
+ "property '$propertyName' is not available"
+ }
+
+ def methodMissing(String methodName, def methodArgs) {
+ log.info "$methodName is not defined"
+ "method '$methodName' is not defined"
+ }
+
+ def logEmp() {
+ log.info "Employee: $lastName, $firstName is of $age years age"
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy
new file mode 100644
index 0000000000..65591cae8d
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/BasicExtensions.groovy
@@ -0,0 +1,30 @@
+package com.baeldung.metaprogramming.extension
+
+import com.baeldung.metaprogramming.Employee
+
+class BasicExtensions {
+
+ static int getYearOfBirth(Employee self) {
+ return (new Date().getYear() + 1900) - self.age;
+ }
+
+ static String capitalize(String self) {
+ return self.substring(0, 1).toUpperCase() + self.substring(1)
+ }
+
+ static void printCounter(Integer self) {
+ while (self>0) {
+ println self
+ self--
+ }
+ }
+
+ static Long square(Long self) {
+ return self*self
+ }
+
+ static BigDecimal cube(BigDecimal self) {
+ return self*self*self
+ }
+
+}
\ No newline at end of file
diff --git a/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/StaticEmployeeExtension.groovy b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/StaticEmployeeExtension.groovy
new file mode 100644
index 0000000000..ab2aac38ea
--- /dev/null
+++ b/core-groovy-2/src/main/groovy/com/baeldung/metaprogramming/extension/StaticEmployeeExtension.groovy
@@ -0,0 +1,10 @@
+package com.baeldung.metaprogramming.extension
+
+import com.baeldung.metaprogramming.Employee
+
+class StaticEmployeeExtension {
+
+ static Employee getDefaultObj(Employee self) {
+ return new Employee(firstName: "firstName", lastName: "lastName", age: 20)
+ }
+}
\ No newline at end of file
diff --git a/core-groovy-2/src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule b/core-groovy-2/src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
new file mode 100644
index 0000000000..967108b846
--- /dev/null
+++ b/core-groovy-2/src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule
@@ -0,0 +1,4 @@
+moduleName=core-groovy-2
+moduleVersion=1.0-SNAPSHOT
+extensionClasses=com.baeldung.metaprogramming.extension.BasicExtensions
+staticExtensionClasses=com.baeldung.metaprogramming.extension.StaticEmployeeExtension
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
new file mode 100644
index 0000000000..a1f67b1e2e
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy
@@ -0,0 +1,101 @@
+package com.baeldung.category
+
+import groovy.time.*
+import java.text.SimpleDateFormat
+import groovy.xml.*
+import groovy.xml.dom.*
+import com.baeldung.category.BaeldungCategory
+import com.baeldung.category.NumberCategory
+
+class CategoryUnitTest extends GroovyTestCase {
+
+ void test_whenUsingTimeCategory_thenOperationOnDate() {
+ def jan_1_2019 = new Date("01/01/2019")
+ use (TimeCategory) {
+ assert jan_1_2019 + 10.seconds == new Date("01/01/2019 00:00:10")
+
+ assert jan_1_2019 + 20.minutes == new Date("01/01/2019 00:20:00")
+
+ assert jan_1_2019 + 2.hours == new Date("01/01/2019 02:00:00")
+
+ assert jan_1_2019 - 1.day == new Date("12/31/2018")
+
+ assert jan_1_2019 + 2.weeks == new Date("01/15/2019")
+
+ assert jan_1_2019 - 2.months == new Date("11/01/2018")
+
+ assert jan_1_2019 + 3.years == new Date("01/01/2022")
+ }
+ }
+
+ void test_whenUsingTimeCategory_thenOperationOnNumber() {
+ SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy")
+ use (TimeCategory) {
+ assert sdf.format(5.days.from.now) == sdf.format(new Date() + 5.days)
+
+ sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss")
+ assert sdf.format(10.minutes.from.now) == sdf.format(new Date() + 10.minutes)
+ assert sdf.format(2.hours.ago) == sdf.format(new Date() - 2.hours)
+ }
+ }
+
+ void test_whenUsingDOMCategory_thenOperationOnXML() {
+
+ def baeldungArticlesText = """
+
+
+ An Intro to the Java Debug Interface (JDI)
+ A quick and practical overview of Java Debug Interface.
+
+
+ A Quick Guide to Working with Web Services in Groovy
+ Learn how to work with Web Services in Groovy.
+
+
+"""
+ def baeldungArticlesDom = DOMBuilder.newInstance().parseText(baeldungArticlesText)
+
+ def root = baeldungArticlesDom.documentElement
+
+ use (DOMCategory) {
+ assert root.article.size() == 2
+
+ def articles = root.article
+
+ assert articles[0].title.text() == "An Intro to the Java Debug Interface (JDI)"
+ assert articles[1].desc.text() == "Learn how to work with Web Services in Groovy."
+
+ def articleNode3 = root.appendNode(new QName("article"), ["core-java": "false"])
+
+ articleNode3.appendNode("title", "Metaprogramming in Groovy")
+ articleNode3.appendNode("desc", "Explore the concept of runtime and compile-time metaprogramming in Groovy")
+
+ assert root.article.size() == 3
+
+ assert root.article[2].title.text() == "Metaprogramming in Groovy"
+ }
+ }
+
+ void test_whenUsingBaeldungCategory_thenCapitalizeString() {
+ use (BaeldungCategory) {
+ assert "norman".capitalize() == "Norman"
+ }
+ }
+
+ void test_whenUsingBaeldungCategory_thenOperationsOnNumber() {
+ use (BaeldungCategory) {
+ assert 50.toThePower(2) == 2500
+ assert 2.4.toThePower(4) == 33.1776
+ }
+ }
+
+ void test_whenUsingNumberCategory_thenOperationsOnNumber() {
+ use (NumberCategory) {
+ assert 3.cube() == 27
+ assert 25.divideWithRoundUp(6, true) == 5
+ assert 120.23.divideWithRoundUp(6.1, true) == 20
+ assert 150.9.divideWithRoundUp(12.1, false) == 12
+ }
+ }
+
+}
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy
new file mode 100644
index 0000000000..8066b10f9b
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/metaprogramming/MetaprogrammingUnitTest.groovy
@@ -0,0 +1,118 @@
+package com.baeldung.metaprogramming
+
+import groovy.time.TimeCategory
+
+class MetaprogrammingUnitTest extends GroovyTestCase {
+
+ Employee emp = new Employee(firstName: "Norman", lastName: "Lewis")
+
+ void testPropertyMissing() {
+ assert emp.address == "property 'address' is not available"
+ }
+
+ void testMethodMissing() {
+ Employee emp = new Employee()
+ try {
+ emp.getFullName()
+ } catch(MissingMethodException e) {
+ println "method is not defined"
+ }
+ assert emp.getFullName() == "method 'getFullName' is not defined"
+ }
+
+ void testMetaClassProperty() {
+ Employee.metaClass.address = ""
+ emp = new Employee(firstName: "Norman", lastName: "Lewis", address: "US")
+ assert emp.address == "US"
+ }
+
+ void testMetaClassMethod() {
+ emp.metaClass.getFullName = {
+ "$lastName, $firstName"
+ }
+ assert emp.getFullName() == "Lewis, Norman"
+ }
+
+ void testMetaClassConstructor() {
+ try {
+ Employee emp = new Employee("Norman")
+ } catch(GroovyRuntimeException e) {
+ assert e.message == "Could not find matching constructor for: com.baeldung.metaprogramming.Employee(String)"
+ }
+
+ Employee.metaClass.constructor = { String firstName ->
+ new Employee(firstName: firstName)
+ }
+
+ Employee norman = new Employee("Norman")
+ assert norman.firstName == "Norman"
+ assert norman.lastName == null
+ }
+
+ void testJavaMetaClass() {
+ String.metaClass.capitalize = { String str ->
+ str.substring(0, 1).toUpperCase() + str.substring(1);
+ }
+ assert "norman".capitalize() == "Norman"
+ }
+
+ void testEmployeeExtension() {
+ Employee emp = new Employee(age: 28)
+ assert emp.getYearOfBirth() == 1991
+ }
+
+ void testJavaClassesExtensions() {
+ 5.printCounter()
+
+ assert 40l.square() == 1600l
+
+ assert (2.98).cube() == 26.463592
+ }
+
+ void testStaticEmployeeExtension() {
+ assert Employee.getDefaultObj().firstName == "firstName"
+ assert Employee.getDefaultObj().lastName == "lastName"
+ assert Employee.getDefaultObj().age == 20
+ }
+
+ void testToStringAnnotation() {
+ Employee employee = new Employee()
+ employee.id = 1
+ employee.firstName = "norman"
+ employee.lastName = "lewis"
+ employee.age = 28
+
+ assert employee.toString() == "Employee(norman, lewis, 28)"
+ }
+
+ void testTupleConstructorAnnotation() {
+ Employee norman = new Employee(1, "norman", "lewis", 28)
+ assert norman.toString() == "Employee(norman, lewis, 28)"
+
+ Employee snape = new Employee(2, "snape")
+ assert snape.toString() == "Employee(snape, null, 0)"
+
+ }
+
+ void testEqualsAndHashCodeAnnotation() {
+ Employee norman = new Employee(1, "norman", "lewis", 28)
+ Employee normanCopy = new Employee(1, "norman", "lewis", 28)
+ assert norman.equals(normanCopy)
+ assert norman.hashCode() == normanCopy.hashCode()
+ }
+
+ void testAutoCloneAnnotation() {
+ try {
+ Employee norman = new Employee(1, "norman", "lewis", 28)
+ def normanCopy = norman.clone()
+ assert norman == normanCopy
+ } catch(CloneNotSupportedException e) {
+ e.printStackTrace()
+ }
+ }
+
+ void testLoggingAnnotation() {
+ Employee employee = new Employee(1, "Norman", "Lewis", 28)
+ employee.logEmp()
+ }
+}
\ No newline at end of file
diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
new file mode 100644
index 0000000000..302959d0d9
--- /dev/null
+++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy
@@ -0,0 +1,152 @@
+package com.baeldung.webservice
+
+import groovy.json.JsonSlurper
+import wslite.rest.ContentType
+import wslite.rest.RESTClient
+import wslite.rest.RESTClientException
+import wslite.soap.SOAPClient
+import wslite.soap.SOAPMessageBuilder
+import wslite.http.auth.HTTPBasicAuthorization
+import org.junit.Test
+
+class WebserviceUnitTest extends GroovyTestCase {
+
+ JsonSlurper jsonSlurper = new JsonSlurper()
+
+ static RESTClient client = new RESTClient("https://postman-echo.com")
+
+ static {
+ client.defaultAcceptHeader = ContentType.JSON
+ client.httpClient.sslTrustAllCerts = true
+ }
+
+ void test_whenSendingGet_thenRespose200() {
+ def postmanGet = new URL('https://postman-echo.com/get')
+ def getConnection = postmanGet.openConnection()
+ getConnection.requestMethod = 'GET'
+ assert getConnection.responseCode == 200
+ if (getConnection.responseCode == 200) {
+ assert jsonSlurper.parseText(getConnection.content.text)?.headers?.host == "postman-echo.com"
+ }
+ }
+
+ void test_whenSendingPost_thenRespose200() {
+ def postmanPost = new URL('https://postman-echo.com/post')
+ def query = "q=This is post request form parameter."
+ def postConnection = postmanPost.openConnection()
+ postConnection.requestMethod = 'POST'
+ assert postConnection.responseCode == 200
+ }
+
+ void test_whenSendingPostWithParams_thenRespose200() {
+ def postmanPost = new URL('https://postman-echo.com/post')
+ def form = "param1=This is request parameter."
+ def postConnection = postmanPost.openConnection()
+ postConnection.requestMethod = 'POST'
+ postConnection.doOutput = true
+ def text
+ postConnection.with {
+ outputStream.withWriter { outputStreamWriter ->
+ outputStreamWriter << form
+ }
+ text = content.text
+ }
+ assert postConnection.responseCode == 200
+ assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter."
+ }
+
+ void test_whenReadingRSS_thenReceiveFeed() {
+ def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en")
+ def stories = []
+ (0..4).each {
+ def item = rssFeed.channel.item.get(it)
+ stories << item.title.text()
+ }
+ assert stories.size() == 5
+ }
+
+ void test_whenReadingAtom_thenReceiveFeed() {
+ def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en")
+ def stories = []
+ (0..4).each {
+ def entry = atomFeed.entry.get(it)
+ stories << entry.title.text()
+ }
+ assert stories.size() == 5
+ }
+
+ void test_whenConsumingSoap_thenReceiveResponse() {
+ def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso"
+ def soapClient = new SOAPClient(url)
+ def message = new SOAPMessageBuilder().build({
+ body {
+ NumberToWords(xmlns: "http://www.dataaccess.com/webservicesserver/") {
+ ubiNum(1234)
+ }
+ }
+ })
+ def response = soapClient.send(message.toString());
+ def words = response.NumberToWordsResponse
+ assert words == "one thousand two hundred and thirty four "
+ }
+
+ void test_whenConsumingRestGet_thenReceiveResponse() {
+ def path = "/get"
+ def response
+ try {
+ response = client.get(path: path)
+ assert response.statusCode == 200
+ assert response.json?.headers?.host == "postman-echo.com"
+ } catch (RESTClientException e) {
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenConsumingRestPost_thenReceiveResponse() {
+ def path = "/post"
+ def params = ["foo":1,"bar":2]
+ def response
+ try {
+ response = client.post(path: path) {
+ type ContentType.JSON
+ json params
+ }
+ assert response.json?.data == params
+ } catch (RESTClientException e) {
+ e.printStackTrace()
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenBasicAuthentication_thenReceive200() {
+ def path = "/basic-auth"
+ def response
+ try {
+ client.authorization = new HTTPBasicAuthorization("postman", "password")
+ response = client.get(path: path)
+ assert response.statusCode == 200
+ assert response.json?.authenticated == true
+ } catch (RESTClientException e) {
+ e.printStackTrace()
+ assert e?.response?.statusCode != 200
+ }
+ }
+
+ void test_whenOAuth_thenReceive200() {
+ RESTClient oAuthClient = new RESTClient("https://postman-echo.com")
+ oAuthClient.defaultAcceptHeader = ContentType.JSON
+ oAuthClient.httpClient.sslTrustAllCerts = true
+
+ def path = "/oauth1"
+ def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A=']
+ def response
+ try {
+ response = oAuthClient.get(path: path, query: params)
+ assert response.statusCode == 200
+ assert response.statusMessage == "OK"
+ assert response.json.status == "pass"
+ } catch (RESTClientException e) {
+ assert e?.response?.statusCode != 200
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-groovy-collections/README.md b/core-groovy-collections/README.md
index aeba8933be..aae8be508e 100644
--- a/core-groovy-collections/README.md
+++ b/core-groovy-collections/README.md
@@ -1,6 +1,10 @@
-# Groovy
+## Core Groovy Collections
+
+This module contains articles about Groovy core collections
## Relevant articles:
- [Maps in Groovy](https://www.baeldung.com/groovy-maps)
-
+- [Finding Elements in Collections in Groovy](https://www.baeldung.com/groovy-collections-find-elements)
+- [Lists in Groovy](https://www.baeldung.com/groovy-lists)
+- [A Quick Guide to Iterating a Map in Groovy](https://www.baeldung.com/groovy-map-iterating)
diff --git a/core-groovy/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy
similarity index 95%
rename from core-groovy/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy
index 9617c099ce..82a2138be4 100644
--- a/core-groovy/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/find/ListFindUnitTest.groovy
@@ -1,11 +1,11 @@
-package com.baeldung.lists
+package com.baeldung.find
-import com.baeldung.Person
+import com.baeldung.find.Person
import org.junit.Test
import static org.junit.Assert.*
-class ListUnitTest {
+class ListFindUnitTest {
private final personList = [
new Person("Regina", "Fitzpatrick", 25),
diff --git a/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy
similarity index 53%
rename from core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy
index 0d6bbed04b..16e231182b 100644
--- a/core-groovy/src/test/groovy/com/baeldung/map/MapUnitTest.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/find/MapFindUnitTest.groovy
@@ -1,11 +1,11 @@
-package com.baeldung.map
+package com.baeldung.find
-import com.baeldung.Person
+import com.baeldung.find.Person
import org.junit.Test
import static org.junit.Assert.*
-class MapUnitTest {
+class MapFindUnitTest {
private final personMap = [
Regina : new Person("Regina", "Fitzpatrick", 25),
@@ -13,84 +13,6 @@ class MapUnitTest {
Lucian : new Person("Lucian", "Walter", 30)
]
- @Test
- void whenUsingEach_thenMapIsIterated() {
- def map = [
- 'FF0000' : 'Red',
- '00FF00' : 'Lime',
- '0000FF' : 'Blue',
- 'FFFF00' : 'Yellow'
- ]
-
- map.each { println "Hex Code: $it.key = Color Name: $it.value" }
- }
-
- @Test
- void whenUsingEachWithEntry_thenMapIsIterated() {
- def map = [
- 'E6E6FA' : 'Lavender',
- 'D8BFD8' : 'Thistle',
- 'DDA0DD' : 'Plum',
- ]
-
- map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" }
- }
-
- @Test
- void whenUsingEachWithKeyAndValue_thenMapIsIterated() {
- def map = [
- '000000' : 'Black',
- 'FFFFFF' : 'White',
- '808080' : 'Gray'
- ]
-
- map.each { key, val ->
- println "Hex Code: $key = Color Name $val"
- }
- }
-
- @Test
- void whenUsingEachWithIndexAndEntry_thenMapIsIterated() {
- def map = [
- '800080' : 'Purple',
- '4B0082' : 'Indigo',
- '6A5ACD' : 'Slate Blue'
- ]
-
- map.eachWithIndex { entry, index ->
- def indent = ((index == 0 || index % 2 == 0) ? " " : "")
- println "$indent Hex Code: $entry.key = Color Name: $entry.value"
- }
- }
-
- @Test
- void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() {
- def map = [
- 'FFA07A' : 'Light Salmon',
- 'FF7F50' : 'Coral',
- 'FF6347' : 'Tomato',
- 'FF4500' : 'Orange Red'
- ]
-
- map.eachWithIndex { key, val, index ->
- def indent = ((index == 0 || index % 2 == 0) ? " " : "")
- println "$indent Hex Code: $key = Color Name: $val"
- }
- }
-
- @Test
- void whenUsingForLoop_thenMapIsIterated() {
- def map = [
- '2E8B57' : 'Seagreen',
- '228B22' : 'Forest Green',
- '008000' : 'Green'
- ]
-
- for (entry in map) {
- println "Hex Code: $entry.key = Color Name: $entry.value"
- }
- }
-
@Test
void whenMapContainsKeyElement_thenCheckReturnsTrue() {
def map = [a: 'd', b: 'e', c: 'f']
diff --git a/core-groovy/src/main/groovy/com/baeldung/Person.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy
similarity index 96%
rename from core-groovy/src/main/groovy/com/baeldung/Person.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy
index 6a009aeee0..e65826363a 100644
--- a/core-groovy/src/main/groovy/com/baeldung/Person.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/find/Person.groovy
@@ -1,4 +1,4 @@
-package com.baeldung
+package com.baeldung.find
class Person {
private String firstname
diff --git a/core-groovy/src/test/groovy/com/baeldung/set/SetUnitTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy
similarity index 83%
rename from core-groovy/src/test/groovy/com/baeldung/set/SetUnitTest.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy
index 1248c9ac91..d2d03d5427 100644
--- a/core-groovy/src/test/groovy/com/baeldung/set/SetUnitTest.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/find/SetFindUnitTest.groovy
@@ -1,10 +1,10 @@
-package com.baeldung.set
+package com.baeldung.find
import org.junit.Test
import static org.junit.Assert.assertTrue
-class SetUnitTest {
+class SetFindUnitTest {
@Test
void whenSetContainsElement_thenCheckReturnsTrue() {
diff --git a/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy
new file mode 100644
index 0000000000..970203ce85
--- /dev/null
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/iteratemap/IterateMapUnitTest.groovy
@@ -0,0 +1,87 @@
+package com.baeldung.iteratemap
+
+import com.baeldung.find.Person
+import org.junit.Test
+
+import static org.junit.Assert.*
+
+class IterateMapUnitTest {
+
+ @Test
+ void whenUsingEach_thenMapIsIterated() {
+ def map = [
+ 'FF0000' : 'Red',
+ '00FF00' : 'Lime',
+ '0000FF' : 'Blue',
+ 'FFFF00' : 'Yellow'
+ ]
+
+ map.each { println "Hex Code: $it.key = Color Name: $it.value" }
+ }
+
+ @Test
+ void whenUsingEachWithEntry_thenMapIsIterated() {
+ def map = [
+ 'E6E6FA' : 'Lavender',
+ 'D8BFD8' : 'Thistle',
+ 'DDA0DD' : 'Plum',
+ ]
+
+ map.each { entry -> println "Hex Code: $entry.key = Color Name: $entry.value" }
+ }
+
+ @Test
+ void whenUsingEachWithKeyAndValue_thenMapIsIterated() {
+ def map = [
+ '000000' : 'Black',
+ 'FFFFFF' : 'White',
+ '808080' : 'Gray'
+ ]
+
+ map.each { key, val ->
+ println "Hex Code: $key = Color Name $val"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndEntry_thenMapIsIterated() {
+ def map = [
+ '800080' : 'Purple',
+ '4B0082' : 'Indigo',
+ '6A5ACD' : 'Slate Blue'
+ ]
+
+ map.eachWithIndex { entry, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+
+ @Test
+ void whenUsingEachWithIndexAndKeyAndValue_thenMapIsIterated() {
+ def map = [
+ 'FFA07A' : 'Light Salmon',
+ 'FF7F50' : 'Coral',
+ 'FF6347' : 'Tomato',
+ 'FF4500' : 'Orange Red'
+ ]
+
+ map.eachWithIndex { key, val, index ->
+ def indent = ((index == 0 || index % 2 == 0) ? " " : "")
+ println "$indent Hex Code: $key = Color Name: $val"
+ }
+ }
+
+ @Test
+ void whenUsingForLoop_thenMapIsIterated() {
+ def map = [
+ '2E8B57' : 'Seagreen',
+ '228B22' : 'Forest Green',
+ '008000' : 'Green'
+ ]
+
+ for (entry in map) {
+ println "Hex Code: $entry.key = Color Name: $entry.value"
+ }
+ }
+}
diff --git a/core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy
similarity index 98%
rename from core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy
index 7771028132..e4c0a0c177 100644
--- a/core-groovy/src/test/groovy/com/baeldung/lists/ListTest.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/lists/ListUnitTest.groovy
@@ -1,9 +1,9 @@
-package com.baeldung.groovy.lists
+package com.baeldung.lists
import static groovy.test.GroovyAssert.*
import org.junit.Test
-class ListTest{
+class ListUnitTest {
@Test
void testCreateList() {
diff --git a/core-groovy-collections/src/test/groovy/com/baeldung/map/MapTest.groovy b/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy
similarity index 99%
rename from core-groovy-collections/src/test/groovy/com/baeldung/map/MapTest.groovy
rename to core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy
index c6105eb1c4..deb552c420 100644
--- a/core-groovy-collections/src/test/groovy/com/baeldung/map/MapTest.groovy
+++ b/core-groovy-collections/src/test/groovy/com/baeldung/maps/MapTest.groovy
@@ -1,4 +1,4 @@
-package com.baeldung.map;
+package com.baeldung.maps;
import static groovy.test.GroovyAssert.*
import org.junit.Test
diff --git a/core-groovy/README.md b/core-groovy/README.md
index 321c37be8d..25a0aece3a 100644
--- a/core-groovy/README.md
+++ b/core-groovy/README.md
@@ -1,15 +1,15 @@
-# Groovy
+# Core Groovy
+
+This module contains articles about core Groovy concepts
## Relevant articles:
-- [JDBC with Groovy](http://www.baeldung.com/jdbc-groovy)
-- [Working with JSON in Groovy](http://www.baeldung.com/groovy-json)
+- [JDBC with Groovy](https://www.baeldung.com/jdbc-groovy)
+- [Working with JSON in Groovy](https://www.baeldung.com/groovy-json)
- [Reading a File in Groovy](https://www.baeldung.com/groovy-file-read)
- [Types of Strings in Groovy](https://www.baeldung.com/groovy-strings)
-- [A Quick Guide to Iterating a Map in Groovy](https://www.baeldung.com/groovy-map-iterating)
- [An Introduction to Traits in Groovy](https://www.baeldung.com/groovy-traits)
- [Closures in Groovy](https://www.baeldung.com/groovy-closures)
-- [Finding Elements in Collections in Groovy](https://www.baeldung.com/groovy-collections-find-elements)
-- [Lists in Groovy](https://www.baeldung.com/groovy-lists)
- [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date)
-- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
\ No newline at end of file
+- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io)
+- [[More -->]](/core-groovy-2)
\ No newline at end of file
diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml
index 029e5460ab..80d6f8d2d5 100644
--- a/core-groovy/pom.xml
+++ b/core-groovy/pom.xml
@@ -109,9 +109,6 @@
1.0.0
-
-
-
2.5.6
2.5.6
2.5.6
diff --git a/core-groovy/src/test/groovy/com/baeldung/map/MapTest.groovy b/core-groovy/src/test/groovy/com/baeldung/map/MapTest.groovy
deleted file mode 100644
index f1d528207f..0000000000
--- a/core-groovy/src/test/groovy/com/baeldung/map/MapTest.groovy
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.baeldung.groovy.map;
-
-import static groovy.test.GroovyAssert.*
-import org.junit.Test
-
-class MapTest{
-
- @Test
- void createMap() {
-
- def emptyMap = [:]
- assertNotNull(emptyMap)
-
- assertTrue(emptyMap instanceof java.util.LinkedHashMap)
-
- def map = [name:"Jerry", age: 42, city: "New York"]
- assertTrue(map.size() == 3)
- }
-
- @Test
- void addItemsToMap() {
-
- def map = [name:"Jerry"]
-
- map["age"] = 42
-
- map.city = "New York"
-
- def hobbyLiteral = "hobby"
- def hobbyMap = [(hobbyLiteral): "Singing"]
- map.putAll(hobbyMap)
-
- assertTrue(map == [name:"Jerry", age: 42, city: "New York", hobby:"Singing"])
- assertTrue(hobbyMap.hobby == "Singing")
- assertTrue(hobbyMap[hobbyLiteral] == "Singing")
-
- map.plus([1:20]) // returns new map
-
- map << [2:30]
-
- }
-
- @Test
- void getItemsFromMap() {
-
- def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]
-
- assertTrue(map["name"] == "Jerry")
-
- assertTrue(map.name == "Jerry")
-
- def propertyAge = "age"
- assertTrue(map[propertyAge] == 42)
- }
-
- @Test
- void removeItemsFromMap() {
-
- def map = [1:20, a:30, 2:42, 4:34, ba:67, 6:39, 7:49]
-
- def minusMap = map.minus([2:42, 4:34]);
- assertTrue(minusMap == [1:20, a:30, ba:67, 6:39, 7:49])
-
- minusMap.removeAll{it -> it.key instanceof String}
- assertTrue( minusMap == [ 1:20, 6:39, 7:49])
-
- minusMap.retainAll{it -> it.value %2 == 0}
- assertTrue( minusMap == [1:20])
- }
-
- @Test
- void iteratingOnMaps(){
- def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]
-
- map.each{ entry -> println "$entry.key: $entry.value" }
-
- map.eachWithIndex{ entry, i -> println "$i $entry.key: $entry.value" }
-
- map.eachWithIndex{ key, value, i -> println "$i $key: $value" }
- }
-
- @Test
- void filteringAndSearchingMaps(){
- def map = [name:"Jerry", age: 42, city: "New York", hobby:"Singing"]
-
- assertTrue(map.find{ it.value == "New York"}.key == "city")
-
- assertTrue(map.findAll{ it.value == "New York"} == [city : "New York"])
-
- map.grep{it.value == "New York"}.each{ it -> assertTrue(it.key == "city" && it.value == "New York")}
-
- assertTrue(map.every{it -> it.value instanceof String} == false)
-
- assertTrue(map.any{it -> it.value instanceof String} == true)
- }
-
- @Test
- void collect(){
-
- def map = [1: [name:"Jerry", age: 42, city: "New York"],
- 2: [name:"Long", age: 25, city: "New York"],
- 3: [name:"Dustin", age: 29, city: "New York"],
- 4: [name:"Dustin", age: 34, city: "New York"]]
-
- def names = map.collect{entry -> entry.value.name} // returns only list
- assertTrue(names == ["Jerry", "Long", "Dustin", "Dustin"])
-
- def uniqueNames = map.collect([] as HashSet){entry -> entry.value.name}
- assertTrue(uniqueNames == ["Jerry", "Long", "Dustin"] as Set)
-
- def idNames = map.collectEntries{key, value -> [key, value.name]}
- assertTrue(idNames == [1:"Jerry", 2: "Long", 3:"Dustin", 4: "Dustin"])
-
- def below30Names = map.findAll{it.value.age < 30}.collect{key, value -> value.name}
- assertTrue(below30Names == ["Long", "Dustin"])
-
-
- }
-
- @Test
- void group(){
- def map = [1:20, 2: 40, 3: 11, 4: 93]
-
- def subMap = map.groupBy{it.value % 2}
- println subMap
- assertTrue(subMap == [0:[1:20, 2:40 ], 1:[3:11, 4:93]])
-
- def keySubMap = map.subMap([1, 2])
- assertTrue(keySubMap == [1:20, 2:40])
-
- }
-
- @Test
- void sorting(){
- def map = [ab:20, a: 40, cb: 11, ba: 93]
-
- def naturallyOrderedMap = map.sort()
- assertTrue([a:40, ab:20, ba:93, cb:11] == naturallyOrderedMap)
-
- def compSortedMap = map.sort({ k1, k2 -> k1 <=> k2 } as Comparator)
- assertTrue([a:40, ab:20, ba:93, cb:11] == compSortedMap)
-
- def cloSortedMap = map.sort({ it1, it2 -> it1.value <=> it1.value })
- assertTrue([cb:11, ab:20, a:40, ba:93] == cloSortedMap)
-
- }
-
-}
diff --git a/core-java-arrays/README.MD b/core-java-arrays/README.MD
deleted file mode 100644
index 9ee6998784..0000000000
--- a/core-java-arrays/README.MD
+++ /dev/null
@@ -1,3 +0,0 @@
-## Relevant Articles
-
-- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end)
diff --git a/core-java-modules/README.md b/core-java-modules/README.md
index 9ce6057f32..55dacca916 100644
--- a/core-java-modules/README.md
+++ b/core-java-modules/README.md
@@ -1,3 +1,7 @@
+## Core Java Modules
+
+This module contains modules about core Java
+
## Relevant articles:
- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms)
diff --git a/core-java-modules/core-java-10/README.md b/core-java-modules/core-java-10/README.md
index 8fb4f8a7dd..2b57ec9064 100644
--- a/core-java-modules/core-java-10/README.md
+++ b/core-java-modules/core-java-10/README.md
@@ -1,3 +1,6 @@
+## Core Java 10
+
+This module contains articles about Java 10 core features
### Relevant Articles:
diff --git a/core-java-modules/core-java-11/README.md b/core-java-modules/core-java-11/README.md
index 11c7d9d388..514f24a4ae 100644
--- a/core-java-modules/core-java-11/README.md
+++ b/core-java-modules/core-java-11/README.md
@@ -1,3 +1,7 @@
+## Core Java 11
+
+This module contains articles about Java 11 core features
+
### Relevant articles
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code)
diff --git a/core-java-modules/core-java-12/README.md b/core-java-modules/core-java-12/README.md
index 4514fd1a2b..6c603e4dea 100644
--- a/core-java-modules/core-java-12/README.md
+++ b/core-java-modules/core-java-12/README.md
@@ -1,3 +1,4 @@
-## Relevant articles:
+## Relevant Articles:
+
- [String API Updates in Java 12](https://www.baeldung.com/java12-string-api)
diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md
index 245fa93ba7..9201add1d7 100644
--- a/core-java-modules/core-java-8-2/README.md
+++ b/core-java-modules/core-java-8-2/README.md
@@ -1,9 +1,11 @@
-=========
+## Core Java 8 (part 2)
-## Core Java 8 Cookbooks and Examples (part 2)
+This module contains articles about Java 8 core features
### Relevant Articles:
- [Anonymous Classes in Java](http://www.baeldung.com/)
- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
-- [Run JAR Application With Command Line Arguments](https://www.baeldung.com/java-run-jar-with-arguments)
+- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments)
- [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit)
+- [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface)
+- [[<-- Prev]](/core-java-modules/core-java-8)
\ No newline at end of file
diff --git a/core-java-modules/core-java-8-2/pom.xml b/core-java-modules/core-java-8-2/pom.xml
index 07bb3b7543..269631e0dd 100644
--- a/core-java-modules/core-java-8-2/pom.xml
+++ b/core-java-modules/core-java-8-2/pom.xml
@@ -3,7 +3,6 @@
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
- com.baeldung
core-java-8-2
0.1.0-SNAPSHOT
core-java-8-2
@@ -30,24 +29,7 @@
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
- UTF-8
- 1.8
- 1.8
64.2
3.12.2
diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md
index b2ae48ea11..72bdafe5fa 100644
--- a/core-java-modules/core-java-8/README.md
+++ b/core-java-modules/core-java-8/README.md
@@ -1,43 +1,15 @@
-=========
+## Core Java 8
-## Core Java 8 Cookbooks and Examples
+This module contains articles about Java 8 core features
### Relevant Articles:
-- [Guide to Java 8’s Collectors](http://www.baeldung.com/java-8-collectors)
-- [Functional Interfaces in Java 8](http://www.baeldung.com/java-8-functional-interfaces)
-- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
-- [New Features in Java 8](http://www.baeldung.com/java-8-new-features)
-- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
-- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator)
-- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector)
-- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern)
-- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
-- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing)
-- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional)
-- [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java)
-- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap)
-- [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods)
-- [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency)
-- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator)
-- [Java 8 Math New Methods](http://www.baeldung.com/java-8-math)
-- [Overview of Java Built-in Annotations](http://www.baeldung.com/java-default-annotations)
-- [Finding Min/Max in an Array with Java](http://www.baeldung.com/java-array-min-max)
-- [Internationalization and Localization in Java 8](http://www.baeldung.com/java-8-localization)
-- [Java Optional – orElse() vs orElseGet()](http://www.baeldung.com/java-optional-or-else-vs-or-else-get)
-- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection)
-- [Java 8 Unsigned Arithmetic Support](http://www.baeldung.com/java-unsigned-arithmetic)
-- [Generalized Target-Type Inference in Java](http://www.baeldung.com/java-generalized-target-type-inference)
-- [Overriding System Time for Testing in Java](http://www.baeldung.com/java-override-system-time)
-- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone)
-- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
-- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
-- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
-- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements)
-- [Java @Override Annotation](https://www.baeldung.com/java-override)
-- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings)
-- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
-- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
-- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
-- [Method References in Java](https://www.baeldung.com/java-method-references)
-- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
-- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
+- [New Features in Java 8](https://www.baeldung.com/java-8-new-features)
+- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector)
+- [Strategy Design Pattern in Java 8](https://www.baeldung.com/java-strategy-pattern)
+- [Guide to Java 8 Comparator.comparing()](https://www.baeldung.com/java-8-comparator-comparing)
+- [Guide to the Java 8 forEach](https://www.baeldung.com/foreach-java)
+- [Introduction to Spliterator in Java](https://www.baeldung.com/java-spliterator)
+- [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max)
+- [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization)
+- [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference)
+- [[More -->]](/core-java-modules/core-java-8-2)
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index 28182e515b..074359ae54 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-8
0.1.0-SNAPSHOT
core-java-8
@@ -20,31 +19,11 @@
commons-collections4
${commons-collections4.version}
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
log4j
log4j
${log4j.version}
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
org.projectlombok
lombok
@@ -58,70 +37,6 @@
${assertj.version}
test
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator.version}
-
-
- org.openjdk.jmh
- jmh-generator-bytecode
- ${jmh-generator.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- joda-time
- joda-time
- ${joda.version}
-
-
- org.aspectj
- aspectjrt
- ${asspectj.version}
-
-
- org.aspectj
- aspectjweaver
- ${asspectj.version}
-
-
- org.powermock
- powermock-module-junit4
- ${powermock.version}
- test
-
-
- org.powermock
- powermock-api-mockito2
- ${powermock.version}
- test
-
-
- org.jmockit
- jmockit
- ${jmockit.version}
- test
-
@@ -134,16 +49,6 @@
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- 1.8
- 1.8
- -parameters
-
-
org.springframework.boot
spring-boot-maven-plugin
@@ -160,39 +65,15 @@
-
- maven-surefire-plugin
- ${maven-surefire-plugin.version}
-
-
- -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
-
- true
-
-
- 3.6.1
4.1
- 4.01
- 1.10
- 0.9.0
- 1.13
- 2.10
3.6.1
- 1.8.9
- 2.0.0-RC.4
- 1.44
- 1.7.0
- 1.19
- 1.19
- 2.0.4.RELEASE
- 3.8.0
- 2.22.1
+ 2.0.4.RELEASE
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
index 7a9f62341e..82a84bb2d6 100644
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
+++ b/core-java-modules/core-java-8/src/main/java/com/baeldung/java_8_features/groupingby/Tuple.java
@@ -1,12 +1,12 @@
package com.baeldung.java_8_features.groupingby;
-public class Tuple {
+import java.util.Objects;
+
+public class Tuple {
+ private final BlogPostType type;
+ private final String author;
- private BlogPostType type;
- private String author;
-
public Tuple(BlogPostType type, String author) {
- super();
this.type = type;
this.author = author;
}
@@ -15,20 +15,27 @@ public class Tuple {
return type;
}
- public void setType(BlogPostType type) {
- this.type = type;
- }
-
public String getAuthor() {
return author;
}
- public void setAuthor(String author) {
- this.author = author;
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ Tuple tuple = (Tuple) o;
+ return type == tuple.type && author.equals(tuple.author);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(type, author);
}
@Override
public String toString() {
- return "Tuple [type=" + type + ", author=" + author + ", getType()=" + getType() + ", getAuthor()=" + getAuthor() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";
+ return "Tuple{" + "type=" + type + ", author='" + author + '\'' + '}';
}
}
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java
deleted file mode 100644
index 46018faf80..0000000000
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.baeldung.optional;
-
-public class PersonRepository {
-
- public String findNameById(String id) {
- return id == null ? null : "Name";
- }
-
-}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
deleted file mode 100644
index 32879aed0c..0000000000
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.baeldung.java8;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Date;
-import java.util.Scanner;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class JavaTryWithResourcesLongRunningUnitTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(JavaTryWithResourcesLongRunningUnitTest.class);
-
- private static final String TEST_STRING_HELLO_WORLD = "Hello World";
- private Date resource1Date, resource2Date;
-
- // tests
-
- /* Example for using Try_with_resources */
- @Test
- public void whenWritingToStringWriter_thenCorrectlyWritten() {
- final StringWriter sw = new StringWriter();
- try (PrintWriter pw = new PrintWriter(sw, true)) {
- pw.print(TEST_STRING_HELLO_WORLD);
- }
-
- Assert.assertEquals(sw.getBuffer()
- .toString(), TEST_STRING_HELLO_WORLD);
- }
-
- /* Example for using multiple resources */
- @Test
- public void givenStringToScanner_whenWritingToStringWriter_thenCorrectlyWritten() {
-
- final StringWriter sw = new StringWriter();
- try (Scanner sc = new Scanner(TEST_STRING_HELLO_WORLD); PrintWriter pw = new PrintWriter(sw, true)) {
- while (sc.hasNext()) {
- pw.print(sc.nextLine());
- }
- }
-
- Assert.assertEquals(sw.getBuffer()
- .toString(), TEST_STRING_HELLO_WORLD);
- }
-
- /* Example to show order in which the resources are closed */
- @Test
- public void whenFirstAutoClosableResourceIsinitializedFirst_thenFirstAutoClosableResourceIsReleasedFirst() throws Exception {
- try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst(); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) {
- af.doSomething();
- as.doSomething();
- }
- Assert.assertTrue(resource1Date.after(resource2Date));
- }
-
- class AutoCloseableResourcesFirst implements AutoCloseable {
- public AutoCloseableResourcesFirst() {
- LOG.debug("Constructor -> AutoCloseableResources_First");
- }
-
- public void doSomething() {
- LOG.debug("Something -> AutoCloseableResources_First");
- }
-
- @Override
- public void close() throws Exception {
- LOG.debug("Closed AutoCloseableResources_First");
- resource1Date = new Date();
- }
- }
-
- class AutoCloseableResourcesSecond implements AutoCloseable {
- public AutoCloseableResourcesSecond() {
- LOG.debug("Constructor -> AutoCloseableResources_Second");
- }
-
- public void doSomething() {
- LOG.debug("Something -> AutoCloseableResources_Second");
- }
-
- @Override
- public void close() throws Exception {
- LOG.debug("Closed AutoCloseableResources_Second");
- resource2Date = new Date();
- Thread.sleep(10000);
- }
- }
-
-}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
similarity index 81%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
rename to core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
index eea019da2c..1da705294e 100644
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java
+++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java
@@ -1,15 +1,32 @@
-package com.baeldung.java8;
-
-import com.baeldung.java_8_features.groupingby.BlogPost;
-import com.baeldung.java_8_features.groupingby.BlogPostType;
-import org.junit.Test;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentMap;
+package com.baeldung.java_8_features.groupingby;
import static java.util.Comparator.comparingInt;
-import static java.util.stream.Collectors.*;
-import static org.junit.Assert.*;
+import static java.util.stream.Collectors.averagingInt;
+import static java.util.stream.Collectors.counting;
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.groupingByConcurrent;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.maxBy;
+import static java.util.stream.Collectors.summarizingInt;
+import static java.util.stream.Collectors.summingInt;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.IntSummaryStatistics;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
+
+import org.junit.Test;
public class Java8GroupingByCollectorUnitTest {
@@ -180,4 +197,19 @@ public class Java8GroupingByCollectorUnitTest {
assertEquals(15, newsLikeStatistics.getMin());
}
+ @Test
+ public void givenAListOfPosts_whenGroupedByComplexMapKeyType_thenGetAMapBetweenTupleAndList() {
+ Map> postsPerTypeAndAuthor = posts.stream()
+ .collect(groupingBy(post -> new Tuple(post.getType(), post.getAuthor())));
+
+ List result = postsPerTypeAndAuthor.get(new Tuple(BlogPostType.GUIDE, "Author 1"));
+
+ assertThat(result.size()).isEqualTo(1);
+
+ BlogPost blogPost = result.get(0);
+
+ assertThat(blogPost.getTitle()).isEqualTo("Programming guide");
+ assertThat(blogPost.getType()).isEqualTo(BlogPostType.GUIDE);
+ assertThat(blogPost.getAuthor()).isEqualTo("Author 1");
+ }
}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java
deleted file mode 100644
index 4efa625ccd..0000000000
--- a/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.baeldung.optional;
-
-import org.junit.Test;
-
-import java.util.Optional;
-
-import static org.junit.jupiter.api.Assertions.assertAll;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-public class PersonRepositoryUnitTest {
-
- PersonRepository personRepository = new PersonRepository();
-
- @Test
- public void whenIdIsNull_thenExceptionIsThrown() {
- assertThrows(IllegalArgumentException.class,
- () ->
- Optional
- .ofNullable(personRepository.findNameById(null))
- .orElseThrow(IllegalArgumentException::new));
- }
-
- @Test
- public void whenIdIsNonNull_thenNoExceptionIsThrown() {
- assertAll(
- () ->
- Optional
- .ofNullable(personRepository.findNameById("id"))
- .orElseThrow(RuntimeException::new));
- }
-
- @Test
- public void whenIdNonNull_thenReturnsNameUpperCase() {
- String name = Optional
- .ofNullable(personRepository.findNameById("id"))
- .map(String::toUpperCase)
- .orElseThrow(RuntimeException::new);
-
- assertEquals("NAME", name);
- }
-
-}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md
index 8b52ce79b4..f4939ae1e1 100644
--- a/core-java-modules/core-java-9/README.md
+++ b/core-java-modules/core-java-9/README.md
@@ -1,8 +1,6 @@
-=========
+## Core Java 9
-## Core Java 9 Examples
-
-[Java 9 New Features](http://www.baeldung.com/new-java-9)
+This module contains articles about Java 9 core features
### Relevant Articles:
diff --git a/core-java-modules/core-java-annotations/README.md b/core-java-modules/core-java-annotations/README.md
new file mode 100644
index 0000000000..a125e8abd5
--- /dev/null
+++ b/core-java-modules/core-java-annotations/README.md
@@ -0,0 +1,11 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java @Override Annotation](https://www.baeldung.com/java-override)
+- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings)
+- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs)
+- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated)
+- [Overview of Java Built-in Annotations](https://www.baeldung.com/java-default-annotations)
+- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation)
\ No newline at end of file
diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml
new file mode 100644
index 0000000000..92b5afbd47
--- /dev/null
+++ b/core-java-modules/core-java-annotations/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ core-java-annotations
+ 0.1.0-SNAPSHOT
+ core-java-annotations
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ core-java-annotations
+
+
+ src/main/resources
+ true
+
+
+
+
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java
rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java
diff --git a/java-dates/src/main/resources/logback.xml b/core-java-modules/core-java-annotations/src/main/resources/logback.xml
similarity index 100%
rename from java-dates/src/main/resources/logback.xml
rename to core-java-modules/core-java-annotations/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java b/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
rename to core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java
diff --git a/core-java-modules/core-java-arrays-2/README.md b/core-java-modules/core-java-arrays-2/README.md
new file mode 100644
index 0000000000..5fa2f2bf4c
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/README.md
@@ -0,0 +1,15 @@
+## Core Java Arrays (Part 2)
+
+This module contains articles about Java arrays
+
+## Relevant Articles
+
+- [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end)
+- [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array)
+- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array)
+- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array)
+- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations)
+- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
+- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element)
+- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
+- [[<-- Prev]](/core-java-modules/core-java-arrays)
diff --git a/core-java-modules/core-java-arrays-2/pom.xml b/core-java-modules/core-java-arrays-2/pom.xml
new file mode 100644
index 0000000000..a1da169f2f
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/pom.xml
@@ -0,0 +1,49 @@
+
+ 4.0.0
+ core-java-arrays-2
+ 0.1.0-SNAPSHOT
+ core-java-arrays-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ core-java-arrays-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+
+ 3.9
+
+ 3.10.0
+
+
+
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java
diff --git a/core-java-arrays/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java
similarity index 100%
rename from core-java-arrays/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/StreamArrayConversion.java
diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java
new file mode 100644
index 0000000000..71e2840f45
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/looping/LoopDiagonally.java
@@ -0,0 +1,45 @@
+package com.baeldung.array.looping;
+
+public class LoopDiagonally {
+
+
+ public String loopDiagonally(String[][] twoDArray) {
+
+ int length = twoDArray.length;
+ int diagonalLines = (length + length) - 1;
+ int itemsInDiagonal = 0;
+ int midPoint = (diagonalLines / 2) + 1;
+ StringBuilder output = new StringBuilder();
+
+ for (int i = 1; i <= diagonalLines; i++) {
+
+ StringBuilder items = new StringBuilder();
+ int rowIndex;
+ int columnIndex;
+
+ if (i <= midPoint) {
+ itemsInDiagonal++;
+ for (int j = 0; j < itemsInDiagonal; j++) {
+ rowIndex = (i - j) - 1;
+ columnIndex = j;
+ items.append(twoDArray[rowIndex][columnIndex]);
+ }
+ } else {
+ itemsInDiagonal--;
+ for (int j = 0; j < itemsInDiagonal; j++) {
+ rowIndex = (length - 1) - j;
+ columnIndex = (i - length) + j;
+ items.append(twoDArray[rowIndex][columnIndex]);
+ }
+ }
+
+ if (i != diagonalLines) {
+ output.append(items).append(" ");
+ } else {
+ output.append(items);
+ }
+ }
+
+ return output.toString();
+ }
+}
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
similarity index 83%
rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
index d8cc0afd61..4513dbf899 100644
--- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java
@@ -1,19 +1,14 @@
package com.baeldung.array.operations;
+import org.apache.commons.lang3.ArrayUtils;
+
import java.lang.reflect.Array;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.Random;
-import java.util.Set;
+import java.util.*;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
import java.util.stream.Stream;
-import org.apache.commons.lang3.ArrayUtils;
-
public class ArrayOperations {
// Get the first and last item of an array
@@ -197,15 +192,48 @@ public class ArrayOperations {
return array[new Random().nextInt(array.length)];
}
- public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(Arrays.asList(b)::contains).toArray(Integer[]::new);
+ public static Integer[] intersectionSimple(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(Arrays.asList(b)::contains)
+ .toArray(Integer[]::new);
}
- public static Integer[] intersectionSet(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(Arrays.asList(b)::contains).distinct().toArray(Integer[]::new);
+ public static Integer[] intersectionSet(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(Arrays.asList(b)::contains)
+ .distinct()
+ .toArray(Integer[]::new);
}
- public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b){
- return Stream.of(a).filter(new LinkedList<>(Arrays.asList(b))::remove).toArray(Integer[]::new);
+ public static Integer[] intersectionMultiSet(final Integer[] a, final Integer[] b) {
+ return Stream.of(a)
+ .filter(new LinkedList<>(Arrays.asList(b))::remove)
+ .toArray(Integer[]::new);
+ }
+
+ public static Integer[] addElementUsingPureJava(Integer[] srcArray, int elementToAdd) {
+ Integer[] destArray = new Integer[srcArray.length + 1];
+
+ for (int i = 0; i < srcArray.length; i++) {
+ destArray[i] = srcArray[i];
+ }
+
+ destArray[destArray.length - 1] = elementToAdd;
+ return destArray;
+ }
+
+ public static int[] insertAnElementAtAGivenIndex(final int[] srcArray, int index, int newElement) {
+ int[] destArray = new int[srcArray.length + 1];
+ int j = 0;
+ for (int i = 0; i < destArray.length - 1; i++) {
+
+ if (i == index) {
+ destArray[i] = newElement;
+ } else {
+ destArray[i] = srcArray[j];
+ j++;
+ }
+ }
+ return destArray;
}
}
diff --git a/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java
new file mode 100644
index 0000000000..b2aed553da
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/arraylist/operations/ArrayListOperations.java
@@ -0,0 +1,23 @@
+package com.baeldung.arraylist.operations;
+
+import java.util.ArrayList;
+
+public class ArrayListOperations {
+
+ public static Integer getAnIntegerElement(ArrayList anArrayList, int index) {
+ return anArrayList.get(index);
+ }
+
+ public static void modifyAnIntegerElement(ArrayList anArrayList, int index, Integer newElement) {
+ anArrayList.set(index, newElement);
+ }
+
+ public static void appendAnIntegerElement(ArrayList anArrayList, Integer newElement) {
+ anArrayList.add(newElement);
+ }
+
+ public static void insertAnIntegerElementAtIndex(ArrayList anArrayList, int index, Integer newElement) {
+ anArrayList.add(index, newElement);
+ }
+
+}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
index ea52cd17d9..567b870ef1 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java
@@ -1,13 +1,10 @@
package com.baeldung.array;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
import org.apache.commons.lang3.ArrayUtils;
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
class RemoveElementFromAnArrayUnitTest {
private final RemoveElementFromAnArray sut = new RemoveElementFromAnArray();
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
similarity index 80%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
index a2cd273f21..7656783052 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java
@@ -1,12 +1,10 @@
package com.baeldung.array.conversions;
-import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloat;
-import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloatWithByteBuffer;
-import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArray;
-import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArrayWithByteBuffer;
+import org.junit.Test;
+
+import static com.baeldung.array.conversions.FloatToByteArray.*;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
-import org.junit.Test;
public class FloatToByteArrayUnitTest {
diff --git a/core-java-arrays/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java
similarity index 100%
rename from core-java-arrays/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/StreamArrayConversionUnitTest.java
diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java
new file mode 100644
index 0000000000..5f670f4a59
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/looping/LoopDiagonallyUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.array.looping;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class LoopDiagonallyUnitTest {
+
+ @Test
+ public void twoArrayIsLoopedDiagonallyAsExpected() {
+
+ LoopDiagonally loopDiagonally = new LoopDiagonally();
+ String[][] twoDArray = {{"a", "b", "c"},
+ {"d", "e", "f"},
+ {"g", "h", "i"}};
+
+ String output = loopDiagonally.loopDiagonally(twoDArray);
+ assertEquals("a db gec hf i", output);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
index a9c6d97d9f..ea9bf2c5a9 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java
@@ -1,12 +1,11 @@
package com.baeldung.array.operations;
-import static org.assertj.core.api.Assertions.assertThat;
-
import java.util.Arrays;
-
import org.assertj.core.api.Condition;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertArrayEquals;
public class ArrayOperationsUnitTest {
@@ -262,8 +261,7 @@ public class ArrayOperationsUnitTest {
@Test
public void whenMapIntArrayToString_thenReturnArray() {
- String[] expectedArray = new String[] { "Value: 3", "Value: 5", "Value: 2", "Value: 5", "Value: 14",
- "Value: 4" };
+ String[] expectedArray = new String[] { "Value: 3", "Value: 5", "Value: 2", "Value: 5", "Value: 14", "Value: 4" };
String[] output = ArrayOperations.mapIntArrayToString(defaultIntArray);
assertThat(output).containsExactly(expectedArray);
@@ -313,13 +311,10 @@ public class ArrayOperationsUnitTest {
int[] output5 = ArrayOperations.shuffleIntArray(defaultIntArray);
int[] output6 = ArrayOperations.shuffleIntArray(defaultIntArray);
- Condition atLeastOneArraysIsNotEqual = new Condition(
- "at least one output should be different (order-wise)") {
+ Condition atLeastOneArraysIsNotEqual = new Condition("at least one output should be different (order-wise)") {
@Override
public boolean matches(int[] value) {
- return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
- || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
- || !Arrays.equals(value, output6);
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3) || !Arrays.equals(value, output4) || !Arrays.equals(value, output5) || !Arrays.equals(value, output6);
}
};
@@ -335,13 +330,10 @@ public class ArrayOperationsUnitTest {
Integer[] output5 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
Integer[] output6 = ArrayOperations.shuffleObjectArray(defaultObjectArray);
- Condition atLeastOneArraysIsNotEqual = new Condition(
- "at least one output should be different (order-wise)") {
+ Condition atLeastOneArraysIsNotEqual = new Condition("at least one output should be different (order-wise)") {
@Override
public boolean matches(Integer[] value) {
- return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3)
- || !Arrays.equals(value, output4) || !Arrays.equals(value, output5)
- || !Arrays.equals(value, output6);
+ return !Arrays.equals(value, output) || !Arrays.equals(value, output2) || !Arrays.equals(value, output3) || !Arrays.equals(value, output4) || !Arrays.equals(value, output5) || !Arrays.equals(value, output6);
}
};
@@ -362,4 +354,27 @@ public class ArrayOperationsUnitTest {
assertThat(defaultObjectArray).contains(output);
}
+
+ @Test
+ public void givenSourceArrayAndElement_whenAddElementUsingPureJavaIsInvoked_thenNewElementMustBeAdded() {
+ Integer[] sourceArray = { 1, 2, 3, 4 };
+ int elementToAdd = 5;
+
+ Integer[] destArray = ArrayOperations.addElementUsingPureJava(sourceArray, elementToAdd);
+
+ Integer[] expectedArray = { 1, 2, 3, 4, 5 };
+ assertArrayEquals(expectedArray, destArray);
+ }
+
+ @Test
+ public void whenInsertAnElementAtAGivenIndexCalled_thenShiftTheFollowingElementsAndInsertTheElementInArray() {
+ int[] expectedArray = { 1, 4, 2, 3, 0 };
+ int[] anArray = new int[4];
+ anArray[0] = 1;
+ anArray[1] = 2;
+ anArray[2] = 3;
+ int[] outputArray = ArrayOperations.insertAnElementAtAGivenIndex(anArray, 1, 4);
+
+ assertThat(outputArray).containsExactly(expectedArray);
+ }
}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
index 3c61060ea8..1560cc5701 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java
@@ -2,9 +2,7 @@ package com.baeldung.array.operations;
import org.junit.jupiter.api.Test;
-import static com.baeldung.array.operations.ArrayOperations.intersectionMultiSet;
-import static com.baeldung.array.operations.ArrayOperations.intersectionSet;
-import static com.baeldung.array.operations.ArrayOperations.intersectionSimple;
+import static com.baeldung.array.operations.ArrayOperations.*;
import static org.assertj.core.api.Assertions.assertThat;
class IntersectionUnitTest {
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
index f2b1bd9d88..83a97973f3 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.list.removefirst;
+package com.baeldung.array.removefirst;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
diff --git a/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java
new file mode 100644
index 0000000000..1ec7645d8f
--- /dev/null
+++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/arraylist/operations/ArrayListOperationsUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.arraylist.operations;
+
+import java.util.ArrayList;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ArrayListOperationsUnitTest {
+
+ private ArrayList anArrayList;
+
+ @BeforeEach
+ public void setupDefaults() {
+ anArrayList = new ArrayList<>();
+ anArrayList.add(2);
+ anArrayList.add(3);
+ anArrayList.add(4);
+ }
+
+ @Test
+ public void whenGetAnIntegerElementCalled_thenReturnTheIntegerElement() {
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 1);
+
+ assertThat(output).isEqualTo(3);
+ }
+
+ @Test
+ public void whenModifyAnIntegerElementCalled_thenModifyTheIntegerElement() {
+ ArrayListOperations.modifyAnIntegerElement(anArrayList, 2, 5);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 2);
+
+ assertThat(output).isEqualTo(5);
+ }
+
+ @Test
+ public void whenAppendAnIntegerElementCalled_thenTheIntegerElementIsAppendedToArrayList() {
+ ArrayListOperations.appendAnIntegerElement(anArrayList, 6);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, anArrayList.size() - 1);
+
+ assertThat(output).isEqualTo(6);
+ }
+
+ @Test
+ public void whenInsertAnIntegerAtIndexCalled_thenTheIntegerElementIsInseredToArrayList() {
+ ArrayListOperations.insertAnIntegerElementAtIndex(anArrayList, 1, 10);
+ Integer output = ArrayListOperations.getAnIntegerElement(anArrayList, 1);
+
+ assertThat(output).isEqualTo(10);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md
index b5f71cc253..42fe3f83a1 100644
--- a/core-java-modules/core-java-arrays/README.md
+++ b/core-java-modules/core-java-arrays/README.md
@@ -1,18 +1,17 @@
-=========
+## Core Java Arrays
-## Core Java Arrays Cookbooks and Examples
+This module contains articles about Java arrays
### Relevant Articles:
-- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy)
-- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value)
-- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array)
-- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays)
-- [Jagged Arrays In Java](http://www.baeldung.com/java-jagged-arrays)
-- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average)
+- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy)
+- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value)
+- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array)
+- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays)
+- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays)
+- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average)
- [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide)
-- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array)
-- [Array Operations in Java](http://www.baeldung.com/java-common-array-operations)
-- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection)
+- [Read and Write User Input in Java](https://www.baeldung.com/java-console-input-output)
+- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array)
- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
-- [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)
+- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array)
+- [[More -->]](/core-java-modules/core-java-arrays-2)
diff --git a/core-java-modules/core-java-arrays/pom.xml b/core-java-modules/core-java-arrays/pom.xml
index 23db608abc..ca4e262ff9 100644
--- a/core-java-modules/core-java-arrays/pom.xml
+++ b/core-java-modules/core-java-arrays/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-arrays
0.1.0-SNAPSHOT
core-java-arrays
@@ -20,16 +19,6 @@
commons-lang3
${commons-lang3.version}
-
- log4j
- log4j
- ${log4j.version}
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
org.assertj
@@ -47,11 +36,6 @@
jmh-generator-annprocess
${jmh-generator-annprocess.version}
-
- org.springframework
- spring-web
- ${springframework.spring-web.version}
-
@@ -64,21 +48,6 @@
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- **/*LiveTest.java
- **/*IntegrationTest.java
- **/*IntTest.java
- **/*LongRunningUnitTest.java
- **/*ManualTest.java
-
- true
-
-
-
org.apache.maven.plugins
maven-dependency-plugin
@@ -398,8 +367,6 @@
3.10.0
- 2.21.0
- 4.3.4.RELEASE
3.0.0-M1
3.0.2
1.4.4
diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java
index ec612fd53b..78a9a8f4d1 100644
--- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java
+++ b/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/SortedArrayChecker.java
@@ -2,7 +2,10 @@ package com.baeldung.array;
import com.baeldung.arraycopy.model.Employee;
+import java.util.Comparator;
+
public class SortedArrayChecker {
+
boolean isSorted(int[] array, int length) {
if (array == null || length < 2)
return true;
@@ -22,7 +25,7 @@ public class SortedArrayChecker {
return true;
}
- boolean isSorted(String[] array, int length) {
+ boolean isSorted(Comparable[] array, int length) {
if (array == null || length < 2)
return true;
@@ -32,40 +35,31 @@ public class SortedArrayChecker {
return isSorted(array, length - 1);
}
-boolean isSorted(String[] array) {
- for (int i = 0; i < array.length - 1; ++i) {
- if (array[i].compareTo(array[i + 1]) > 0)
- return false;
- }
-
- return true;
-}
-
- boolean isSortedByName(Employee[] array) {
+ boolean isSorted(Comparable[] array) {
for (int i = 0; i < array.length - 1; ++i) {
- if (array[i].getName().compareTo(array[i + 1].getName()) > 0)
+ if (array[i].compareTo(array[i + 1]) > 0)
return false;
}
return true;
}
-boolean isSortedByAge(Employee[] array) {
- for (int i = 0; i < array.length - 1; ++i) {
- if (array[i].getAge() > (array[i + 1].getAge()))
- return false;
+ boolean isSorted(Object[] array, Comparator comparator) {
+ for (int i = 0; i < array.length - 1; ++i) {
+ if (comparator.compare(array[i], (array[i + 1])) > 0)
+ return false;
+ }
+
+ return true;
}
- return true;
-}
-
- boolean isSortedByAge(Employee[] array, int length) {
+ boolean isSorted(Object[] array, Comparator comparator, int length) {
if (array == null || length < 2)
return true;
- if (array[length - 2].getAge() > array[length - 1].getAge())
+ if (comparator.compare(array[length - 2], array[length - 1]) > 0)
return false;
- return isSortedByAge(array, length - 1);
+ return isSorted(array, comparator, length - 1);
}
}
diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java
index 29866a3c22..7971e0eab7 100644
--- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java
+++ b/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/SortedArrayCheckerUnitTest.java
@@ -4,32 +4,33 @@ import com.baeldung.arraycopy.model.Employee;
import org.junit.Before;
import org.junit.Test;
+import java.util.Comparator;
+
import static org.assertj.core.api.Assertions.assertThat;
-class SortedArrayCheckerUnitTest {
-
+public class SortedArrayCheckerUnitTest {
private static final int[] INTEGER_SORTED = {1, 3, 5, 7, 9};
private static final int[] INTEGER_NOT_SORTED = {1, 3, 11, 7};
private static final String[] STRING_SORTED = {"abc", "cde", "fgh"};
private static final String[] STRING_NOT_SORTED = {"abc", "fgh", "cde", "ijk"};
- private final Employee[] EMPLOYEES_SORTED_BY_NAME = {
+ private static final Employee[] EMPLOYEES_SORTED_BY_NAME = {
new Employee(1, "Carlos", 26),
new Employee(2, "Daniel", 31),
new Employee(3, "Marta", 27)};
- private final Employee[] EMPLOYEES_NOT_SORTED_BY_NAME = {
+ private static final Employee[] EMPLOYEES_NOT_SORTED_BY_NAME = {
new Employee(1, "Daniel", 31),
new Employee(2, "Carlos", 26),
new Employee(3, "Marta", 27)};
- private final Employee[] EMPLOYEES_SORTED_BY_AGE = {
+ private static final Employee[] EMPLOYEES_SORTED_BY_AGE = {
new Employee(1, "Carlos", 26),
new Employee(2, "Marta", 27),
new Employee(3, "Daniel", 31)};
- private final Employee[] EMPLOYEES_NOT_SORTED_BY_AGE = {
+ private static final Employee[] EMPLOYEES_NOT_SORTED_BY_AGE = {
new Employee(1, "Marta", 27),
new Employee(2, "Carlos", 26),
new Employee(3, "Daniel", 31)};
@@ -61,13 +62,18 @@ class SortedArrayCheckerUnitTest {
@Test
public void givenEmployeeArray_thenReturnIfItIsSortedOrNot() {
- assertThat(sortedArrayChecker.isSortedByName(EMPLOYEES_SORTED_BY_NAME)).isEqualTo(true);
- assertThat(sortedArrayChecker.isSortedByName(EMPLOYEES_NOT_SORTED_BY_NAME)).isEqualTo(false);
+ assertThat(sortedArrayChecker.isSorted(EMPLOYEES_SORTED_BY_NAME, Comparator.comparing(Employee::getName))).isEqualTo(true);
+ assertThat(sortedArrayChecker.isSorted(EMPLOYEES_NOT_SORTED_BY_NAME, Comparator.comparing(Employee::getName))).isEqualTo(false);
- assertThat(sortedArrayChecker.isSortedByAge(EMPLOYEES_SORTED_BY_AGE)).isEqualTo(true);
- assertThat(sortedArrayChecker.isSortedByAge(EMPLOYEES_NOT_SORTED_BY_AGE)).isEqualTo(false);
+ assertThat(sortedArrayChecker.isSorted(EMPLOYEES_SORTED_BY_AGE, Comparator.comparingInt(Employee::getAge))).isEqualTo(true);
+ assertThat(sortedArrayChecker.isSorted(EMPLOYEES_NOT_SORTED_BY_AGE, Comparator.comparingInt(Employee::getAge))).isEqualTo(false);
- assertThat(sortedArrayChecker.isSortedByAge(EMPLOYEES_SORTED_BY_AGE, EMPLOYEES_SORTED_BY_AGE.length)).isEqualTo(true);
- assertThat(sortedArrayChecker.isSortedByAge(EMPLOYEES_NOT_SORTED_BY_AGE, EMPLOYEES_NOT_SORTED_BY_AGE.length)).isEqualTo(false);
+ assertThat(sortedArrayChecker
+ .isSorted(EMPLOYEES_SORTED_BY_AGE, Comparator.comparingInt(Employee::getAge), EMPLOYEES_SORTED_BY_AGE.length))
+ .isEqualTo(true);
+ assertThat(sortedArrayChecker
+ .isSorted(EMPLOYEES_NOT_SORTED_BY_AGE, Comparator.comparingInt(Employee::getAge), EMPLOYEES_NOT_SORTED_BY_AGE.length))
+ .isEqualTo(false);
}
+
}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md
new file mode 100644
index 0000000000..13ca191edb
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/README.md
@@ -0,0 +1,15 @@
+=========
+
+## Core Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
+- [How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering)
+- [Join and Split Arrays and Collections in Java](https://www.baeldung.com/java-join-and-split)
+- [Java – Combine Multiple Collections](https://www.baeldung.com/java-combine-multiple-collections)
+- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
+- [Shuffling Collections In Java](https://www.baeldung.com/java-shuffle-collection)
+- [Sorting in Java](https://www.baeldung.com/java-sorting)
+- [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size)
+- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections)
+
diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml
new file mode 100644
index 0000000000..217c1d9258
--- /dev/null
+++ b/core-java-modules/core-java-collections-2/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ core-java-collections-2
+ core-java-collections-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse.collections.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-exec
+ ${commons-exec.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
+
+
+
+ 7.1.0
+ 4.1
+ 3.11.1
+ 1.2.0
+ 1.3
+
+
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
index 2ad48033c0..5f63123f6a 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Arrays;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
index 3fdf672758..a45e9cdfe8 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
index d8bbd01ed3..d4d21d0dad 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Collection;
import java.util.HashMap;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
index 5f531c1d43..27a5681eee 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import java.util.Collection;
import java.util.HashSet;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
index 58f9f6af54..de5158e147 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
index 981d6ca241..a7b78b1f9b 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
index 88338fd6d4..0a2a782c33 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
index f074f74199..a9fb8481e5 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import java.util.Collection;
import java.util.function.Predicate;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
index 03864f16f2..b96e2bb571 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.iterable;
+package com.baeldung.collections.iterablesize;
import java.util.Collection;
import java.util.stream.StreamSupport;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
index 2405c26aac..ce5cbb39d6 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
index da767d4563..68d51c2d87 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.Optional;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
index 0c10f1cebc..6c606ebedd 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Collection;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
similarity index 91%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
index 2f5e91596f..4089382376 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
similarity index 93%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
index 86b91b3fdc..d551b04eae 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
similarity index 93%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
index bf6db68bae..e0dc75f428 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
index c77e996616..c01c334f01 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java
+++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
index 3b80d773ad..312f5582ba 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.junit.Assert.*;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
index c5851d7daf..5443e56e5f 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
index 3fa9cc7dc4..644f178f80 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
index 330827bdc2..c9976eb6de 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java
@@ -1,5 +1,5 @@
-package com.baeldung.combiningcollections;
+package com.baeldung.collections.combiningcollections;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
index b30805d471..db387818b8 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.filtering;
+package com.baeldung.collections.filtering;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
index 4bc413dee0..35702a74b3 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.iterable;
+package com.baeldung.collections.iterablesize;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
index c288cf499d..1904fd1587 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.joinsplit;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
index c594529f41..1fbe210ad4 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.joinsplit;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
index d43075c925..ebef8d6875 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.collections.multiplecollections;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -14,7 +14,7 @@ import java.util.stream.Stream;
import static java.util.Arrays.asList;
-public class CollectionsConcatenateUnitTest {
+public class CombineMultipleCollectionsUnitTest {
@Test
public void givenUsingJava8_whenConcatenatingUsingConcat_thenCorrect() {
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
index 875045946d..42cda7926c 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
index 402f1a6a19..666d5e7d04 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
index bb6152371d..2e8eeb35ad 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.nullsafecollectionstreams;
+package com.baeldung.collections.nullsafecollectionstreams;
import java.util.Arrays;
import java.util.Collection;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
index 1b379f32de..998dbe6cca 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.removal;
+package com.baeldung.collections.removal;
import org.junit.Before;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
index d013907c9a..041e67ba7f 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.shufflingcollections;
+package com.baeldung.collections.shufflingcollections;
import org.junit.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
index 99af49c8d3..e838dbea18 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.sorting;
+package com.baeldung.collections.sorting;
public class Employee implements Comparable {
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
index ca9c9b4b5d..2505adcea7 100644
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java
+++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.sorting;
+package com.baeldung.collections.sorting;
import com.google.common.primitives.Ints;
import org.apache.commons.lang3.ArrayUtils;
diff --git a/core-java-modules/core-java-collections-3/README.md b/core-java-modules/core-java-collections-3/README.md
new file mode 100644
index 0000000000..9218384640
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/README.md
@@ -0,0 +1,11 @@
+=========
+
+## Core Java Collections Cookbooks and Examples
+
+### Relevant Articles:
+- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint)
+- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector)
+- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
+- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
+- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
+- [Fail-Safe Iterator vs Fail-Fast Iterator](https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml
new file mode 100644
index 0000000000..84c7865e68
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/pom.xml
@@ -0,0 +1,34 @@
+
+ 4.0.0
+ core-java-collections-3
+ 0.1.0-SNAPSHOT
+ core-java-collections-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${openjdk.jmh.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 1.19
+ 3.11.1
+
+
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
index 331ae8d908..7fcadf019c 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.arraylistvsvector;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java
new file mode 100644
index 0000000000..02f25a7558
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java
@@ -0,0 +1,55 @@
+package com.baeldung.collections.arraylistvsvector;
+
+public class Employee {
+
+ private Long id;
+ private String name;
+
+ public Employee(Long id, String name) {
+ this.name = name;
+ this.id = id;
+ }
+
+ 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;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Employee employee = (Employee) o;
+
+ if (!id.equals(employee.id)) return false;
+ return name.equals(employee.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
similarity index 92%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
index 7debc07911..e82e47cdbb 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.list;
+package com.baeldung.collections.arraylistvsvector;
import java.util.Enumeration;
import java.util.Iterator;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
similarity index 96%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
index 921e1608ea..76edd10e92 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.containsperformance;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java
new file mode 100644
index 0000000000..6c60f8772c
--- /dev/null
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java
@@ -0,0 +1,55 @@
+package com.baeldung.collections.containsperformance;
+
+public class Employee {
+
+ private Long id;
+ private String name;
+
+ public Employee(Long id, String name) {
+ this.name = name;
+ this.id = id;
+ }
+
+ 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;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ Employee employee = (Employee) o;
+
+ if (!id.equals(employee.id)) return false;
+ return name.equals(employee.name);
+
+ }
+
+ @Override
+ public int hashCode() {
+ int result = id.hashCode();
+ result = 31 * result + name.hashCode();
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "Employee{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ '}';
+ }
+}
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
index 5e7cfdb54f..23e6bbda77 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java
@@ -1,4 +1,4 @@
-package com.baeldung.iterators;
+package com.baeldung.collections.iterators;
import java.util.ArrayList;
import java.util.Iterator;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
index b93f8e9cc2..1cd56aa29d 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java
@@ -1,4 +1,4 @@
-package com.baeldung.performance;
+package com.baeldung.collections.sortingcomparison;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
index 1eff522877..abe7a12a00 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java
+++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.sort;
+package com.baeldung.collections.sortingcomparison;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
index 8b0a7ef0db..9cd9c6aa50 100644
--- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.collection;
+package com.baeldung.collections.clearvsremoveall;
import org.junit.jupiter.api.Test;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
index 5218332d60..b00a7fd953 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.hashmapvshashtable;
+package com.baeldung.collections.hashmapvshashtable;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
similarity index 77%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java
rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
index 36e1f4a83c..95cf590857 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java
+++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java
@@ -1,8 +1,8 @@
-package com.baeldung.iterators;
+package com.baeldung.collections.iterators;
-import static com.baeldung.iterators.Iterators.failFast1;
-import static com.baeldung.iterators.Iterators.failFast2;
-import static com.baeldung.iterators.Iterators.failSafe1;
+import static com.baeldung.collections.iterators.Iterators.failFast1;
+import static com.baeldung.collections.iterators.Iterators.failFast2;
+import static com.baeldung.collections.iterators.Iterators.failSafe1;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md
index 3d1cdd5085..302ea82130 100644
--- a/core-java-modules/core-java-collections-array-list/README.md
+++ b/core-java-modules/core-java-collections-array-list/README.md
@@ -1,10 +1,12 @@
-=========
+## Core Java Collections ArrayList
-## Core Java Collections Array List Cookbooks and Examples
+This module contains articles about the Java ArrayList collection
### Relevant Articles:
- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
-- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
\ No newline at end of file
+- [Multi Dimensional ArrayList in Java](https://www.baeldung.com/java-multi-dimensional-arraylist)
+- [Removing an Element From an ArrayList](https://www.baeldung.com/java-arraylist-remove-element)
+
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 95a5f3ea36..249103152a 100644
--- a/core-java-modules/core-java-collections-array-list/pom.xml
+++ b/core-java-modules/core-java-collections-array-list/pom.xml
@@ -19,28 +19,16 @@
commons-collections4
${commons-collections4.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
org.assertj
assertj-core
${assertj.version}
test
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
4.1
- 3.8.1
3.11.1
diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java
new file mode 100644
index 0000000000..df9b3d987d
--- /dev/null
+++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java
@@ -0,0 +1,40 @@
+package com.baeldung.java.list;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class RemoveFromList {
+
+ public static void main(String[] args) {
+ List sports = new ArrayList<>();
+ sports.add("Football");
+ sports.add("Basketball");
+ sports.add("Baseball");
+ sports.add("Boxing");
+ sports.add("Cycling");
+
+ System.out.println("List before removing: " + sports);
+
+ // Remove with index
+ sports.remove(1);
+
+ // Remove with an element
+ sports.remove("Baseball");
+
+ // Iterator remove method
+ Iterator iterator = sports.iterator();
+ while (iterator.hasNext()) {
+ if (iterator.next().equals("Boxing")) {
+ iterator.remove();
+ break;
+ }
+ }
+
+ // ArrayList removeIf method (Java 8)
+ sports.removeIf(p -> p.equals("Cycling"));
+
+ System.out.println("List after removing: " + sports);
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md
index be10a0210c..fada9d96ac 100644
--- a/core-java-modules/core-java-collections-list-2/README.md
+++ b/core-java-modules/core-java-collections-list-2/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections List (Part 2)
-## Core Java Collections List Cookbooks and Examples
+This module contains articles about the Java List collection
### Relevant Articles:
- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
@@ -11,7 +11,4 @@
- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection)
-- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
-- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int)
-- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance)
-- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list)
\ No newline at end of file
+- [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3)
\ 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 d200a3c90c..9652a7d79f 100644
--- a/core-java-modules/core-java-collections-list-2/pom.xml
+++ b/core-java-modules/core-java-collections-list-2/pom.xml
@@ -19,11 +19,6 @@
commons-collections4
${commons-collections4.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
org.assertj
assertj-core
@@ -36,41 +31,10 @@
${lombok.version}
provided
-
-
- net.sf.trove4j
- trove4j
- ${trove4j.version}
-
-
- it.unimi.dsi
- fastutil
- ${fastutil.version}
-
-
- colt
- colt
- ${colt.version}
-
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-core.version}
-
- 4.1
- 3.8.1
+ 4.1
3.11.1
- 3.0.2
- 8.1.0
- 1.2.0
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/findastring/FindAStringInGivenList.java b/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/findastring/FindAStringInGivenList.java
new file mode 100644
index 0000000000..67c62fe009
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/findastring/FindAStringInGivenList.java
@@ -0,0 +1,72 @@
+package com.baeldung.findastring;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.IterableUtils;
+import org.apache.commons.collections4.IteratorUtils;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class FindAStringInGivenList {
+
+
+ public List findUsingLoopWithRegex(String search, List list) {
+
+ List matches = new ArrayList();
+
+ String pattern = ".*"+search+".*";
+ Pattern p = Pattern.compile(pattern);
+
+ for(String str: list) {
+ if (p.matcher(str).matches()) {
+ matches.add(str);
+ }
+ }
+
+ return matches;
+ }
+
+
+ public List findUsingLoop(String search, List list) {
+
+ List matches = new ArrayList();
+
+ for(String str: list) {
+ if (str.contains(search)) {
+ matches.add(str);
+ }
+ }
+
+ return matches;
+ }
+
+ public List findUsingStream(String search, List list) {
+
+ List matchingElements =
+ list.stream()
+ .filter(str -> str.trim().contains(search))
+ .collect(Collectors.toList());
+
+ return matchingElements;
+ }
+
+ public List findUsingGuava(String search, List list) {
+ Iterable result = Iterables.filter(list, Predicates.containsPattern(search));
+
+ return Lists.newArrayList(result.iterator());
+ }
+
+ public List findUsingCommonsCollection(String search, List list) {
+ Iterable result = IterableUtils.filteredIterable(list, new org.apache.commons.collections4.Predicate() {
+ public boolean evaluate(String listElement) {
+ return listElement.contains(search);
+ }
+ });
+
+ return IteratorUtils.toList(result.iterator());
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/findastring/FindAStringInListUnitTest.java b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/findastring/FindAStringInListUnitTest.java
new file mode 100644
index 0000000000..ff5ca21505
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/findastring/FindAStringInListUnitTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.findastring;
+
+import java.util.ArrayList;
+import java.util.List;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.Test;
+public class FindAStringInListUnitTest {
+
+ private static List list = new ArrayList<>();
+
+ static {
+ list.add("Jack and Jill");
+ list.add("James and Sarah");
+ list.add("Sam and Louise");
+ list.add("Jack");
+ list.add("");
+ }
+
+ private static FindAStringInGivenList findAStringInGivenList = new FindAStringInGivenList();
+
+ @Test
+ public void givenAString_whenFoundUsingLoopWithRegex_thenReturnList() {
+ List matchingElements = findAStringInGivenList.findUsingLoopWithRegex("Jack", list);
+ assertEquals(2, matchingElements.size());
+ assertEquals("Jack and Jill", matchingElements.get(0));
+ assertEquals("Jack", matchingElements.get(1));
+ }
+
+ @Test
+ public void givenAString_whenFoundUsingLoop_thenReturnList() {
+ List matchingElements = findAStringInGivenList.findUsingLoop("Jack", list);
+ assertEquals(2, matchingElements.size());
+ assertEquals("Jack and Jill", matchingElements.get(0));
+ assertEquals("Jack", matchingElements.get(1));
+ }
+
+
+ @Test
+ public void givenAString_whenFoundUsingStream_thenReturnList(){
+ List matchingElements = findAStringInGivenList.findUsingStream("Jack", list);
+ assertEquals(2, matchingElements.size());
+ assertEquals("Jack and Jill", matchingElements.get(0));
+ assertEquals("Jack", matchingElements.get(1));
+ }
+
+ @Test
+ public void givenAString_whenFoundUsingCommonsCollection_thenReturnList(){
+ List matchingElements = findAStringInGivenList.findUsingCommonsCollection("Jack", list);
+ assertEquals(2, matchingElements.size());
+ assertEquals("Jack and Jill", matchingElements.get(0));
+ assertEquals("Jack", matchingElements.get(1));
+ }
+
+ @Test
+ public void givenAString_whenFoundUsingGuava_thenReturnList(){
+ List matchingElements = findAStringInGivenList.findUsingGuava("Jack", list);
+ assertEquals(2, matchingElements.size());
+ assertEquals("Jack and Jill", matchingElements.get(0));
+ assertEquals("Jack", matchingElements.get(1));
+ }
+
+}
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
index b484eecef7..25f39e9a13 100644
--- a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
+++ b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
@@ -42,7 +42,7 @@ public class ListInitializationUnitTest {
}
@Test
- public void givenArrayAsList_whenCreated_thenShareReference() {
+ public void givenArraysAsList_whenCreated_thenShareReference() {
String[] array = { "foo", "bar" };
List list = Arrays.asList(array);
array[0] = "baz";
diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md
new file mode 100644
index 0000000000..3d4004de6f
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/README.md
@@ -0,0 +1,12 @@
+## Core Java Collections List (Part 3)
+
+This module contains articles about the Java List collection
+
+### Relevant Articles:
+- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
+- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
+- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal)
+- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int)
+- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance)
+- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list)
+- [[<-- Prev]](/core-java-modules/core-java-collections-list-2)
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
new file mode 100644
index 0000000000..dab5058cd3
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -0,0 +1,64 @@
+
+ 4.0.0
+ core-java-collections-list-3
+ 0.1.0-SNAPSHOT
+ core-java-collections-list-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+ net.sf.trove4j
+ trove4j
+ ${trove4j.version}
+
+
+ it.unimi.dsi
+ fastutil
+ ${fastutil.version}
+
+
+ colt
+ colt
+ ${colt.version}
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-core.version}
+
+
+
+
+ 4.1
+ 3.11.1
+ 3.0.2
+ 8.1.0
+ 1.2.0
+
+
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java
diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java
diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java
diff --git a/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java
new file mode 100644
index 0000000000..04e24e5fa1
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/DuplicatesCounter.java
@@ -0,0 +1,42 @@
+package com.baeldung.list;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * Demo different approaches to get count of duplicated elements in an
+ * arrayList
+ */
+public class DuplicatesCounter {
+
+ public static Map countByClassicalLoop(List inputList) {
+ Map resultMap = new HashMap<>();
+ for (T element : inputList) {
+ if (resultMap.containsKey(element)) {
+ resultMap.put(element, resultMap.get(element) + 1L);
+ } else {
+ resultMap.put(element, 1L);
+ }
+ }
+ return resultMap;
+ }
+
+ public static Map countByClassicalLoopWithMapCompute(List inputList) {
+ Map resultMap = new HashMap<>();
+ for (T element : inputList) {
+ resultMap.compute(element, (k, v) -> v == null ? 1 : v + 1);
+ }
+ return resultMap;
+ }
+
+ public static Map countByStreamToMap(List inputList) {
+ return inputList.stream().collect(Collectors.toMap(Function.identity(), v -> 1L, Long::sum));
+ }
+
+ public static Map countByStreamGroupBy(List inputList) {
+ return inputList.stream().collect(Collectors.groupingBy(k -> k, Collectors.counting()));
+ }
+}
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java
diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java
diff --git a/jenkins/hello-world/src/main/resources/logback.xml b/core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml
similarity index 100%
rename from jenkins/hello-world/src/main/resources/logback.xml
rename to core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java
diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java
diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java
new file mode 100644
index 0000000000..4b6a03aaef
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/DuplicatesCounterUnitTest.java
@@ -0,0 +1,55 @@
+package com.baeldung.list;
+
+import org.assertj.core.util.Lists;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.data.MapEntry.entry;
+
+class DuplicatesCounterUnitTest {
+
+
+ private static List INPUT_LIST = Lists.list(
+ "expect1",
+ "expect2", "expect2",
+ "expect3", "expect3", "expect3",
+ "expect4", "expect4", "expect4", "expect4");
+
+ @Test
+ void givenInput_whenCountByClassicalLoop_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByClassicalLoop(INPUT_LIST);
+ verifyResult(result);
+ }
+
+
+ @Test
+ void givenInput_whenCountByClassicalLoopWithMapCompute_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByClassicalLoopWithMapCompute(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ @Test
+ void givenInput_whenCountByStreamToMap_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByStreamToMap(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ @Test
+ void givenInput_whenCountByStreamGroupBy_thenGetResultMap() {
+ Map result = DuplicatesCounter.countByStreamGroupBy(INPUT_LIST);
+ verifyResult(result);
+ }
+
+ private void verifyResult(Map resultMap) {
+ assertThat(resultMap)
+ .isNotEmpty().hasSize(4)
+ .containsExactly(
+ entry("expect1", 1L),
+ entry("expect2", 2L),
+ entry("expect3", 3L),
+ entry("expect4", 4L));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md
index 4bc1c5fb57..ff7a9876a2 100644
--- a/core-java-modules/core-java-collections-list/README.md
+++ b/core-java-modules/core-java-collections-list/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections List
-## Core Java Collections List Cookbooks and Examples
+This module contains articles about the Java List collection
### Relevant Articles:
- [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element)
@@ -10,7 +10,6 @@
- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards)
- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list)
- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java)
-- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another)
- [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max)
-- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
-- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
\ No newline at end of file
+- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
+- [[Next -->]](/core-java-modules/core-java-collections-list-2)
diff --git a/core-java-modules/core-java-collections-list/pom.xml b/core-java-modules/core-java-collections-list/pom.xml
index 581505dc1e..c8e881110e 100644
--- a/core-java-modules/core-java-collections-list/pom.xml
+++ b/core-java-modules/core-java-collections-list/pom.xml
@@ -30,18 +30,11 @@
${assertj.version}
test
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
4.1
3.8.1
3.11.1
- 3.0.2
diff --git a/core-java-modules/core-java-collections-set/README.md b/core-java-modules/core-java-collections-set/README.md
index 618b4e932c..2b34ef3449 100644
--- a/core-java-modules/core-java-collections-set/README.md
+++ b/core-java-modules/core-java-collections-set/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Collections Set
-## Core Java Sets Cookbooks and Examples
+This module contains articles about the Java Set collection
### Relevant Articles:
- [Set Operations in Java](http://www.baeldung.com/set-operations-in-java)
diff --git a/core-java-modules/core-java-collections-set/pom.xml b/core-java-modules/core-java-collections-set/pom.xml
index 101ed79de0..1dd1e06ca1 100644
--- a/core-java-modules/core-java-collections-set/pom.xml
+++ b/core-java-modules/core-java-collections-set/pom.xml
@@ -14,11 +14,6 @@
-
- com.google.guava
- guava
- ${guava.version}
-
org.apache.commons
commons-collections4
@@ -38,7 +33,6 @@
4.3
- 27.1-jre
2.8.5
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md
index b34293769d..340c2b286e 100644
--- a/core-java-modules/core-java-collections/README.md
+++ b/core-java-modules/core-java-collections/README.md
@@ -1,31 +1,16 @@
-=========
+## Core Java Collections
-## Core Java Collections Cookbooks and Examples
+This module contains articles about Java collections
### Relevant Articles:
-- [Java – Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections)
-- [Collect a Java Stream to an Immutable Collection](http://www.baeldung.com/java-stream-immutable-collection)
-- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque)
-- [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size)
-- [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering)
-- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
-- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
-- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection)
-- [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table)
-- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections)
+- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection)
+- [Introduction to the Java ArrayDeque](https://www.baeldung.com/java-array-deque)
+- [An Introduction to Java.util.Hashtable Class](https://www.baeldung.com/java-hash-table)
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
-- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall)
-- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance)
- [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity)
-- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
-- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
-- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
-- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
-- [Sorting in Java](http://www.baeldung.com/java-sorting)
-- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
-- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
-- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
-- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector)
+- [A Guide to Iterator in Java](https://www.baeldung.com/java-iterator)
- [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack)
-- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint)
+- [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)
\ No newline at end of file
diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml
index e5b89c3d16..62b42b53e7 100644
--- a/core-java-modules/core-java-collections/pom.xml
+++ b/core-java-modules/core-java-collections/pom.xml
@@ -14,33 +14,12 @@
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.eclipse.collections
- eclipse-collections
- ${eclipse.collections.version}
-
org.assertj
assertj-core
${assertj.version}
test
-
- org.junit.platform
- junit-platform-runner
- ${junit.platform.version}
- test
-
org.openjdk.jmh
jmh-core
@@ -51,28 +30,10 @@
jmh-generator-annprocess
${openjdk.jmh.version}
-
- org.apache.commons
- commons-exec
- ${commons-exec.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
1.19
- 1.2.0
- 3.8.1
- 4.1
- 4.01
- 1.7.0
3.11.1
- 7.1.0
- 1.3
diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
similarity index 90%
rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java
rename to core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
index 093308a34a..f974a24839 100644
--- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java
+++ b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.application;
+package com.baeldung.synchronizedcollections;
import java.util.Arrays;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java
deleted file mode 100644
index d0d8c3923c..0000000000
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.baeldung.java.collections;
-
-import org.junit.Test;
-
-import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertEquals;
-
-public class ConcurrentModificationExceptionUnitTest {
-
- @Test
- public void changingContentWithSetDoesNotThrowConcurrentModificationException() throws Exception {
- ArrayList array = new ArrayList<>(asList(0, "one", 2, "three"));
-
- for (Object item : array) {
- array.set(3, 3);
- }
- }
-
- @Test
- public void removingElementUsingIteratorAPI() throws Exception {
- List originalList = new ArrayList<>(asList("zero", "one", "two", "three"));
-
- Iterator iterator = originalList.iterator();
-
- while (iterator.hasNext()) {
- String next = iterator.next();
- if (Objects.equals(next, "one")) iterator.remove();
- }
-
- assertEquals(originalList, asList("zero", "two", "three"));
- }
-
- @Test
- public void modifyingContentAndIteratingUsingListIteratorAPI() throws Exception {
- List originalList = new ArrayList<>(asList("zero", "one", "two", "three"));
-
- ListIterator iterator = originalList.listIterator();
-
- while (iterator.hasNext()) {
- String next = iterator.next();
- if (Objects.equals(next, "one")) {
- iterator.set("another");
- }
-
- if (Objects.equals(next, "two")) {
- iterator.remove();
- }
-
- if (Objects.equals(next, "three")) {
- iterator.add("four");
- }
- }
-
- assertEquals(originalList, asList("zero", "another", "three", "four"));
- }
-
- @Test
- public void removingElementUsingCopyAndListAPI() throws Exception {
- List originalList = new ArrayList<>(asList("zero", "one", "two", "three"));
-
- List listCopy = new ArrayList<>(originalList);
-
- for (String next : listCopy) {
- if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1);
- }
-
- assertEquals(originalList, asList("one", "two", "three"));
- }
-
- @Test
- public void copyOnWriteList() throws Exception {
- List originalList = new CopyOnWriteArrayList<>(asList("zero", "one", "two", "three"));
-
- for (String next : originalList) {
- if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1);
- }
-
- assertEquals(originalList, asList("one", "two", "three"));
- }
-}
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java
index fd84503226..29b1ab9e70 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java
index 72354622ae..0e3c9cd217 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java
index 842e253e9e..9a4d80b403 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.Collections;
import java.util.HashMap;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java
index f88f58a55b..88fd343f56 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.Arrays;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java
index 23933b2b4b..7cbfa9bfa9 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.Collections;
import java.util.Map;
diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java
rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java
index 3ce1e6ed26..98820665c1 100644
--- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java
+++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.synchronizedcollections.test;
+package com.baeldung.synchronizedcollections;
import java.util.Arrays;
import java.util.Collections;
diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md b/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md
deleted file mode 100644
index 317d81fae7..0000000000
--- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant Articles:
-- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
-- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets)
diff --git a/core-java-modules/core-java-concurrency-advanced/.gitignore b/core-java-modules/core-java-concurrency-2/.gitignore
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/.gitignore
rename to core-java-modules/core-java-concurrency-2/.gitignore
diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md
new file mode 100644
index 0000000000..749d174968
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/README.md
@@ -0,0 +1,7 @@
+=========
+
+## Core Java Concurrency 2 Examples
+
+### Relevant Articles:
+- [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex)
+
diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml
new file mode 100644
index 0000000000..6b179a29c7
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/pom.xml
@@ -0,0 +1,27 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-concurrency-2
+ 0.1.0-SNAPSHOT
+ core-java-concurrency-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ core-java-concurrency-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java
new file mode 100644
index 0000000000..26354de0a9
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java
@@ -0,0 +1,12 @@
+package com.baeldung.concurrent.mutex;
+
+public class SequenceGenerator {
+
+ private int currentValue = 0;
+
+ public int getNextSequence() {
+ currentValue = currentValue + 1;
+ return currentValue;
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java
new file mode 100644
index 0000000000..2824237e24
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.mutex;
+
+import com.google.common.util.concurrent.Monitor;
+
+public class SequenceGeneratorUsingMonitor extends SequenceGenerator {
+
+ private Monitor mutex = new Monitor();
+
+ @Override
+ public int getNextSequence() {
+ mutex.enter();
+ try {
+ return super.getNextSequence();
+ } finally {
+ mutex.leave();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java
new file mode 100644
index 0000000000..d57b0c4a52
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.mutex;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class SequenceGeneratorUsingReentrantLock extends SequenceGenerator {
+
+ private ReentrantLock mutex = new ReentrantLock();
+
+ @Override
+ public int getNextSequence() {
+ try {
+ mutex.lock();
+ return super.getNextSequence();
+ } finally {
+ mutex.unlock();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java
new file mode 100644
index 0000000000..50f2538646
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java
@@ -0,0 +1,21 @@
+package com.baeldung.concurrent.mutex;
+
+import java.util.concurrent.Semaphore;
+
+public class SequenceGeneratorUsingSemaphore extends SequenceGenerator {
+
+ private Semaphore mutex = new Semaphore(1);
+
+ @Override
+ public int getNextSequence() {
+ try {
+ mutex.acquire();
+ return super.getNextSequence();
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Exception in critical section.", e);
+ } finally {
+ mutex.release();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java
new file mode 100644
index 0000000000..9933c302cb
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java
@@ -0,0 +1,14 @@
+package com.baeldung.concurrent.mutex;
+
+public class SequenceGeneratorUsingSynchronizedBlock extends SequenceGenerator {
+
+ private Object mutex = new Object();
+
+ @Override
+ public int getNextSequence() {
+ synchronized (mutex) {
+ return super.getNextSequence();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java
new file mode 100644
index 0000000000..6de8725d73
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java
@@ -0,0 +1,10 @@
+package com.baeldung.concurrent.mutex;
+
+public class SequenceGeneratorUsingSynchronizedMethod extends SequenceGenerator {
+
+ @Override
+ public synchronized int getNextSequence() {
+ return super.getNextSequence();
+ }
+
+}
diff --git a/spring-all/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml
similarity index 100%
rename from spring-all/src/main/resources/logback.xml
rename to core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java
new file mode 100644
index 0000000000..462f910718
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.concurrent.mutex;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MutexUnitTest {
+
+ // @Test
+ // This test verifies the race condition use case, it may pass or fail based on execution environment
+ // Uncomment @Test to run it
+ public void givenUnsafeSequenceGenerator_whenRaceCondition_thenUnexpectedBehavior() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGenerator(), count);
+ Assert.assertNotEquals(count, uniqueSequences.size());
+ }
+
+ @Test
+ public void givenSequenceGeneratorUsingSynchronizedMethod_whenRaceCondition_thenSuccess() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSynchronizedMethod(), count);
+ Assert.assertEquals(count, uniqueSequences.size());
+ }
+
+ @Test
+ public void givenSequenceGeneratorUsingSynchronizedBlock_whenRaceCondition_thenSuccess() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSynchronizedBlock(), count);
+ Assert.assertEquals(count, uniqueSequences.size());
+ }
+
+ @Test
+ public void givenSequenceGeneratorUsingReentrantLock_whenRaceCondition_thenSuccess() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingReentrantLock(), count);
+ Assert.assertEquals(count, uniqueSequences.size());
+ }
+
+ @Test
+ public void givenSequenceGeneratorUsingSemaphore_whenRaceCondition_thenSuccess() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSemaphore(), count);
+ Assert.assertEquals(count, uniqueSequences.size());
+ }
+
+ @Test
+ public void givenSequenceGeneratorUsingMonitor_whenRaceCondition_thenSuccess() throws Exception {
+ int count = 1000;
+ Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingMonitor(), count);
+ Assert.assertEquals(count, uniqueSequences.size());
+ }
+
+ private Set getUniqueSequences(SequenceGenerator generator, int count) throws Exception {
+ ExecutorService executor = Executors.newFixedThreadPool(3);
+ Set uniqueSequences = new LinkedHashSet<>();
+ List> futures = new ArrayList<>();
+
+ for (int i = 0; i < count; i++) {
+ futures.add(executor.submit(generator::getNextSequence));
+ }
+
+ for (Future future : futures) {
+ uniqueSequences.add(future.get());
+ }
+
+ executor.awaitTermination(1, TimeUnit.SECONDS);
+ executor.shutdown();
+
+ return uniqueSequences;
+ }
+
+}
diff --git a/guava-collections/.gitignore b/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore
similarity index 100%
rename from guava-collections/.gitignore
rename to core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore
diff --git a/core-java-modules/core-java-concurrency-advanced-2/README.md b/core-java-modules/core-java-concurrency-advanced-2/README.md
new file mode 100644
index 0000000000..988ada9e4a
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-2/README.md
@@ -0,0 +1,19 @@
+=========
+
+## Core Java Concurrency Advanced Examples
+
+This module contains articles about advanced topics about multithreading with core Java.
+
+### Relevant Articles:
+- [Semaphores in Java](https://www.baeldung.com/java-semaphore)
+- [Daemon Threads in Java](https://www.baeldung.com/java-daemon-thread)
+- [Priority-based Job Scheduling in Java](https://www.baeldung.com/java-priority-job-schedule)
+- [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield)
+- [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads)
+- [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch)
+- [Guide to the Fork/Join Framework in Java](https://www.baeldung.com/java-fork-join)
+- [Guide to ThreadLocalRandom in Java](https://www.baeldung.com/java-thread-local-random)
+- [The Thread.join() Method in Java](https://www.baeldung.com/java-thread-join)
+- [Passing Parameters to Java Threads](https://www.baeldung.com/java-thread-parameters)
+
+[[<-- previous]](/core-java-modules/core-java-concurrency-advanced)[[next -->]](/core-java-modules/core-java-concurrency-advanced-3)
diff --git a/core-java-modules/core-java-concurrency-advanced-2/pom.xml b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
new file mode 100644
index 0000000000..cad492b1ea
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-2/pom.xml
@@ -0,0 +1,59 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-concurrency-advanced-2
+ 0.1.0-SNAPSHOT
+ core-java-concurrency-advanced-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator-annprocess.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-concurrency-advanced-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.19
+ 1.19
+
+ 3.6.1
+
+
+
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
similarity index 88%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
index 76b6198bc4..cf497687cc 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
@@ -4,6 +4,7 @@ import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class CyclicBarrierResetExample {
@@ -36,6 +37,11 @@ public class CyclicBarrierResetExample {
});
}
es.shutdown();
+ try {
+ es.awaitTermination(1, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
return updateCount.get();
}
diff --git a/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
new file mode 100644
index 0000000000..370ce99c09
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.daemon;
+
+public class NewThread extends Thread {
+ public void run() {
+ long startTime = System.currentTimeMillis();
+ while (true) {
+ for (int i = 0; i < 10; i++) {
+ System.out.println(this.getName() + ": New Thread is running..." + i);
+ try {
+ //Wait for one sec so it doesn't print too fast
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ // prevent the Thread to run forever. It will finish it's execution after 2 seconds
+ if (System.currentTimeMillis() - startTime > 2000) {
+ Thread.currentThread().interrupt();
+ break;
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/AverageCalculator.java
similarity index 90%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/AverageCalculator.java
index a548b5d4a7..f0997b30bd 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/AverageCalculator.java
@@ -1,4 +1,4 @@
-package com.baeldung.concurrent.parameter;
+package com.baeldung.concurrent.parameters;
import java.util.concurrent.Callable;
import java.util.stream.IntStream;
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/ParameterizedThreadExample.java
similarity index 95%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/ParameterizedThreadExample.java
index 73c61f3fb1..177bf14dae 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/parameters/ParameterizedThreadExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.concurrent.parameter;
+package com.baeldung.concurrent.parameters;
import java.util.concurrent.Callable;
import java.util.stream.IntStream;
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/parameters/ParameterizedThreadUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/parameters/ParameterizedThreadUnitTest.java
index 21b374e609..4185d77dc3 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/parameters/ParameterizedThreadUnitTest.java
@@ -1,14 +1,13 @@
-package com.baeldung.parameters;
+package com.baeldung.concurrent.parameters;
-import com.baeldung.concurrent.parameter.AverageCalculator;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.stream.IntStream;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
public class ParameterizedThreadUnitTest {
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/forkjoin/Java8ForkJoinIntegrationTest.java
similarity index 98%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/forkjoin/Java8ForkJoinIntegrationTest.java
index 6778fd782b..c469fe0195 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java
+++ b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/forkjoin/Java8ForkJoinIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.forkjoin;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
rename to core-java-modules/core-java-concurrency-advanced-2/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md
new file mode 100644
index 0000000000..d1622b5fe1
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced-3/README.md
@@ -0,0 +1,9 @@
+=========
+
+## Core Java Concurrency Advanced Examples
+
+This module contains articles about advanced topics about multithreading with core Java.
+
+### Relevant Articles:
+
+[[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2)
diff --git a/testing-modules/mocks/jmockit/pom.xml b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
similarity index 55%
rename from testing-modules/mocks/jmockit/pom.xml
rename to core-java-modules/core-java-concurrency-advanced-3/pom.xml
index 12bbe6b60d..cc7b7b1e70 100644
--- a/testing-modules/mocks/jmockit/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced-3/pom.xml
@@ -1,27 +1,24 @@
4.0.0
- jmockit
- jmockit
+ com.baeldung
+ core-java-concurrency-advanced-3
+ 0.1.0-SNAPSHOT
+ core-java-concurrency-advanced-3
+ jar
com.baeldung
- mocks
- 1.0.0-SNAPSHOT
- ../
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
-
- org.jmockit
- jmockit
- ${jmockit.version}
- test
-
- jmockit
+ core-java-concurrency-advanced-3
src/main/resources
@@ -31,7 +28,6 @@
- 1.24
-
\ No newline at end of file
+
diff --git a/core-java-modules/core-java-concurrency-advanced/README.md b/core-java-modules/core-java-concurrency-advanced/README.md
index 8e99858693..0da59c88fb 100644
--- a/core-java-modules/core-java-concurrency-advanced/README.md
+++ b/core-java-modules/core-java-concurrency-advanced/README.md
@@ -1,25 +1,16 @@
-=========
-
## Core Java Concurrency Advanced Examples
+This module contains articles about advanced topics about multithreading with core Java.
+
### Relevant Articles:
-- [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava)
-- [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch)
-- [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks)
-- [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal)
-- [LongAdder and LongAccumulator in Java](http://www.baeldung.com/java-longadder-and-longaccumulator)
-- [The Dining Philosophers Problem in Java](http://www.baeldung.com/java-dining-philoshophers)
-- [Guide to the Java Phaser](http://www.baeldung.com/java-phaser)
-- [An Introduction to Atomic Variables in Java](http://www.baeldung.com/java-atomic-variables)
-- [CyclicBarrier in Java](http://www.baeldung.com/java-cyclic-barrier)
-- [Guide to the Volatile Keyword in Java](http://www.baeldung.com/java-volatile)
-- [Semaphores in Java](http://www.baeldung.com/java-semaphore)
-- [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread)
-- [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule)
-- [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield)
-- [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads)
-- [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch)
-- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join)
-- [Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random)
-- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join)
-- [Passing Parameters to Java Threads](https://www.baeldung.com/java-thread-parameters)
+- [Introduction to Thread Pools in Java](https://www.baeldung.com/thread-pool-java-and-guava)
+- [Guide to CountDownLatch in Java](https://www.baeldung.com/java-countdown-latch)
+- [Guide to java.util.concurrent.Locks](https://www.baeldung.com/java-concurrent-locks)
+- [An Introduction to ThreadLocal in Java](https://www.baeldung.com/java-threadlocal)
+- [LongAdder and LongAccumulator in Java](https://www.baeldung.com/java-longadder-and-longaccumulator)
+- [The Dining Philosophers Problem in Java](https://www.baeldung.com/java-dining-philoshophers)
+- [Guide to the Java Phaser](https://www.baeldung.com/java-phaser)
+- [An Introduction to Atomic Variables in Java](https://www.baeldung.com/java-atomic-variables)
+- [CyclicBarrier in Java](https://www.baeldung.com/java-cyclic-barrier)
+- [Guide to the Volatile Keyword in Java](https://www.baeldung.com/java-volatile)
+- More Articles: [[next -->]](/core-java-modules/core-java-concurrency-advanced-2)
diff --git a/core-java-modules/core-java-concurrency-advanced/pom.xml b/core-java-modules/core-java-concurrency-advanced/pom.xml
index 5d41909ed3..4a9ee30d65 100644
--- a/core-java-modules/core-java-concurrency-advanced/pom.xml
+++ b/core-java-modules/core-java-concurrency-advanced/pom.xml
@@ -47,16 +47,6 @@
${avaitility.version}
test
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator-annprocess.version}
-
@@ -78,8 +68,6 @@
3.6.1
1.7.0
- 1.19
- 1.19
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
index 7c1299da62..00cf314706 100644
--- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
+++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
@@ -4,6 +4,7 @@ import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class CyclicBarrierCompletionMethodExample {
@@ -35,6 +36,11 @@ public class CyclicBarrierCompletionMethodExample {
});
}
es.shutdown();
+ try {
+ es.awaitTermination(1, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
return updateCount.get();
}
diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md
new file mode 100644
index 0000000000..e72725b7cb
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/README.md
@@ -0,0 +1,10 @@
+=========
+
+## Core Java Concurrency Basic 2 Examples
+
+### Relevant Articles:
+- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
+- [wait and notify() Methods in Java](https://www.baeldung.com/java-wait-notify)
+- [Difference Between Wait and Sleep in Java](https://www.baeldung.com/java-wait-and-sleep)
+- [Guide to the Synchronized Keyword in Java](https://www.baeldung.com/java-synchronized)
+- [Life Cycle of a Thread in Java](https://www.baeldung.com/java-thread-lifecycle)
diff --git a/core-java-modules/core-java-concurrency-basic-2/pom.xml b/core-java-modules/core-java-concurrency-basic-2/pom.xml
new file mode 100644
index 0000000000..396447ff75
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-basic-2/pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+ core-java-concurrency-basic-2
+ 0.1.0-SNAPSHOT
+ core-java-concurrency-basic-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+
+ core-java-concurrency-basic-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
diff --git a/core-java-modules/core-java-concurrency-basic/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
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
diff --git a/spring-security-mvc-session/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml
similarity index 100%
rename from spring-security-mvc-session/src/main/resources/logback.xml
rename to core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
index e2bc328df3..473fe6ff8e 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
+++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
@@ -1,15 +1,15 @@
package com.baeldung.concurrent.waitandnotify;
-import static org.junit.Assert.assertEquals;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class NetworkIntegrationTest {
diff --git a/core-java-modules/core-java-concurrency-basic/README.md b/core-java-modules/core-java-concurrency-basic/README.md
index c498bed315..846687b8dd 100644
--- a/core-java-modules/core-java-concurrency-basic/README.md
+++ b/core-java-modules/core-java-concurrency-basic/README.md
@@ -1,20 +1,16 @@
-=========
+## Core Java Concurrency Basic
-## Core Java Concurrency Basic Examples
+This module contains articles about basic Java concurrency
### Relevant Articles:
-- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture)
-- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial)
-- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future)
-- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep)
-- [Guide to the Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized)
-- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent)
-- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread)
-- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop)
-- [ExecutorService – Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads)
-- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify)
-- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle)
-- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable)
+- [Guide To CompletableFuture](https://www.baeldung.com/java-completablefuture)
+- [A Guide to the Java ExecutorService](https://www.baeldung.com/java-executor-service-tutorial)
+- [Guide to java.util.concurrent.Future](https://www.baeldung.com/java-future)
+- [Overview of the java.util.concurrent](https://www.baeldung.com/java-util-concurrent)
+- [Implementing a Runnable vs Extending a Thread](https://www.baeldung.com/java-runnable-vs-extending-thread)
+- [How to Kill a Java Thread](https://www.baeldung.com/java-thread-stop)
+- [ExecutorService – Waiting for Threads to Finish](https://www.baeldung.com/java-executor-wait-for-threads)
+- [Runnable vs. Callable in Java](https://www.baeldung.com/java-runnable-callable)
- [What is Thread-Safety and How to Achieve it?](https://www.baeldung.com/java-thread-safety)
- [How to Start a Thread in Java](https://www.baeldung.com/java-start-thread)
-- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution)
+- [[Next -->]](/core-java-modules/core-java-concurrency-basic-2)
diff --git a/core-java-modules/core-java-concurrency-basic/pom.xml b/core-java-modules/core-java-concurrency-basic/pom.xml
index 96b3ef76f7..93b8523eb4 100644
--- a/core-java-modules/core-java-concurrency-basic/pom.xml
+++ b/core-java-modules/core-java-concurrency-basic/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-concurrency-basic
0.1.0-SNAPSHOT
core-java-concurrency-basic
diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
index 3a1d8555d3..43261e5ee4 100644
--- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
+++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
@@ -12,9 +12,11 @@ public class SemaPhoreDemo {
System.out.println("Number of threads waiting to acquire: " + semaphore.getQueueLength());
if (semaphore.tryAcquire()) {
- semaphore.acquire();
+ try {
// perform some critical operations
- semaphore.release();
+ } finally {
+ semaphore.release();
+ }
}
}
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java
similarity index 99%
rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java
index a1f5b6f1e2..998152c452 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.concurrent.executorservice;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java
index 176151083c..6761b05282 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java
@@ -1,14 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
-import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
import com.baeldung.concurrent.threadsafety.callables.CounterCallable;
import com.baeldung.concurrent.threadsafety.services.Counter;
+import org.junit.Test;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-public class CounterTest {
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CounterUnitTest {
@Test
public void whenCalledIncrementCounter_thenCorrect() throws Exception {
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java
index e34eb250bf..2dcb846bf4 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java
@@ -1,14 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
-import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable;
import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter;
+import org.junit.Test;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-public class ExtrinsicLockCounterTest {
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ExtrinsicLockCounterUnitTest {
@Test
public void whenCalledIncrementCounter_thenCorrect() throws Exception {
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java
similarity index 55%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java
index 2708152906..018d4164f0 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java
@@ -1,13 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
import com.baeldung.concurrent.threadsafety.mathutils.MathUtils;
import org.junit.Test;
+
+import java.math.BigInteger;
+
import static org.assertj.core.api.Assertions.assertThat;
-public class MathUtilsTest {
+public class MathUtilsUnitTest {
@Test
public void whenCalledFactorialMethod_thenCorrect() {
- assertThat(MathUtils.factorial(2)).isEqualTo(2);
+ assertThat(MathUtils.factorial(2)).isEqualTo(new BigInteger("2"));
}
}
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java
index e62206c09a..4df695a537 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java
@@ -1,14 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
-import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable;
import com.baeldung.concurrent.threadsafety.services.MessageService;
+import org.junit.Test;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-public class MessageServiceTest {
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MessageServiceUnitTest {
@Test
public void whenCalledgetMessage_thenCorrect() throws Exception {
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java
similarity index 91%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java
index 20fa2c74da..330d2d4c86 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java
@@ -1,14 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable;
import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter;
+import org.junit.Test;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-public class ReentrantLockCounterTest {
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ReentrantLockCounterUnitTest {
@Test
public void whenCalledIncrementCounter_thenCorrect() throws Exception {
diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java
similarity index 90%
rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java
rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java
index 6113473cac..71fad2c87f 100644
--- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java
+++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java
@@ -1,14 +1,16 @@
-package com.baeldung.concurrent.threadsafety.tests;
+package com.baeldung.concurrent.threadsafety;
import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable;
import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter;
+import org.junit.Test;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.junit.Test;
-public class ReentrantReadWriteLockCounterTest {
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ReentrantReadWriteLockCounterUnitTest {
@Test
public void whenCalledIncrementCounter_thenCorrect() throws Exception {
@@ -16,9 +18,9 @@ public class ReentrantReadWriteLockCounterTest {
ReentrantReadWriteLockCounter counter = new ReentrantReadWriteLockCounter();
Future future1 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter));
Future future2 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter));
-
- assertThat(future1.get()).isEqualTo(1);
+
assertThat(future2.get()).isEqualTo(2);
+ assertThat(future1.get()).isEqualTo(1);
}
}
diff --git a/core-java-modules/core-java-concurrency-collections/README.md b/core-java-modules/core-java-concurrency-collections/README.md
index b982a91861..80a21ee533 100644
--- a/core-java-modules/core-java-concurrency-collections/README.md
+++ b/core-java-modules/core-java-concurrency-collections/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java Concurrency Collections
-## Core Java Concurrency Collections Examples
+This module contains articles about concurrent Java collections
### Relevant Articles:
- [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue)
diff --git a/core-java-modules/core-java-concurrency-collections/pom.xml b/core-java-modules/core-java-concurrency-collections/pom.xml
index ea3bbe44f3..0d3a6042ac 100644
--- a/core-java-modules/core-java-concurrency-collections/pom.xml
+++ b/core-java-modules/core-java-concurrency-collections/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-concurrency-collections
0.1.0-SNAPSHOT
core-java-concurrency-collections
@@ -15,38 +14,12 @@
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
org.assertj
assertj-core
${assertj.version}
test
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
@@ -60,14 +33,8 @@
-
- 21.0
- 3.6.1
- 4.1
- 4.01
3.6.1
- 1.7.0
diff --git a/core-java-modules/core-java-datetime-computations/README.md b/core-java-modules/core-java-datetime-computations/README.md
new file mode 100644
index 0000000000..591ddeaa94
--- /dev/null
+++ b/core-java-modules/core-java-datetime-computations/README.md
@@ -0,0 +1,15 @@
+## Java Date/time computations Cookbooks and Examples
+
+This module contains articles about date and time computations in Java.
+
+### Relevant Articles:
+- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
+- [Get Date Without Time in Java](http://www.baeldung.com/java-date-without-time)
+- [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates)
+- [Extracting Year, Month and Day from Date in Java](http://www.baeldung.com/java-year-month-day)
+- [Guide to java.util.GregorianCalendar](http://www.baeldung.com/java-gregorian-calendar)
+- [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings)
+- [Calculate Age in Java](http://www.baeldung.com/java-get-age)
+- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
+- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
+- [Introduction to Joda-Time](http://www.baeldung.com/joda-time)
diff --git a/java-dates-2/pom.xml b/core-java-modules/core-java-datetime-computations/pom.xml
similarity index 74%
rename from java-dates-2/pom.xml
rename to core-java-modules/core-java-datetime-computations/pom.xml
index c1419514ef..934df8018f 100644
--- a/java-dates-2/pom.xml
+++ b/core-java-modules/core-java-datetime-computations/pom.xml
@@ -1,17 +1,16 @@
4.0.0
- com.baeldung
- java-dates-2
- 0.1.0-SNAPSHOT
+ core-java-datetime-computations
+ ${project.parent.version}
+ core-java-datetime-computations
jar
- java-dates-2
com.baeldung
parent-java
0.0.1-SNAPSHOT
- ../parent-java
+ ../../parent-java
@@ -20,25 +19,28 @@
joda-time
${joda-time.version}
-
-
- commons-validator
- commons-validator
- ${commons-validator.version}
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
-
org.assertj
assertj-core
${assertj.version}
test
+
+ com.darwinsys
+ hirondelle-date4j
+ RELEASE
+ test
+
- java-dates-2
+ core-java-datetime-computations
src/main/resources
@@ -60,10 +62,9 @@
+ 2.10
3.6.1
- 2.10
- 1.6
1.9
1.9
diff --git a/java-dates/src/main/java/com/baeldung/date/AgeCalculator.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/AgeCalculator.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/date/AgeCalculator.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/AgeCalculator.java
diff --git a/java-dates/src/main/java/com/baeldung/date/DateWithoutTime.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/DateWithoutTime.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/date/DateWithoutTime.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/date/DateWithoutTime.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/AddHoursToDate.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/AddHoursToDate.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetime/AddHoursToDate.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/AddHoursToDate.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
similarity index 95%
rename from java-dates/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
index a6cef94377..8b6d9885af 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
+++ b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValues.java
@@ -1,28 +1,28 @@
-package com.baeldung.datetime;
-
-import java.util.Calendar;
-import java.util.Date;
-
-public class DateExtractYearMonthDayIntegerValues {
-
- int getYear(Date date) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
-
- return calendar.get(Calendar.YEAR);
- }
-
- int getMonth(Date date) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
-
- return calendar.get(Calendar.MONTH);
- }
-
- int getDay(Date date) {
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(date);
-
- return calendar.get(Calendar.DAY_OF_MONTH);
- }
-}
+package com.baeldung.datetime;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class DateExtractYearMonthDayIntegerValues {
+
+ int getYear(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ return calendar.get(Calendar.YEAR);
+ }
+
+ int getMonth(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ return calendar.get(Calendar.MONTH);
+ }
+
+ int getDay(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+
+ return calendar.get(Calendar.DAY_OF_MONTH);
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
similarity index 95%
rename from java-dates/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
index b40e10f6ad..6daa86130d 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
+++ b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValues.java
@@ -1,18 +1,18 @@
-package com.baeldung.datetime;
-
-import java.time.LocalDate;
-
-public class LocalDateExtractYearMonthDayIntegerValues {
-
- int getYear(LocalDate localDate) {
- return localDate.getYear();
- }
-
- int getMonth(LocalDate localDate) {
- return localDate.getMonthValue();
- }
-
- int getDay(LocalDate localDate) {
- return localDate.getDayOfMonth();
- }
-}
+package com.baeldung.datetime;
+
+import java.time.LocalDate;
+
+public class LocalDateExtractYearMonthDayIntegerValues {
+
+ int getYear(LocalDate localDate) {
+ return localDate.getYear();
+ }
+
+ int getMonth(LocalDate localDate) {
+ return localDate.getMonthValue();
+ }
+
+ int getDay(LocalDate localDate) {
+ return localDate.getDayOfMonth();
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
similarity index 95%
rename from java-dates/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
index 404a62d2f4..bb4415fbc7 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
+++ b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValues.java
@@ -1,18 +1,18 @@
-package com.baeldung.datetime;
-
-import java.time.LocalDateTime;
-
-public class LocalDateTimeExtractYearMonthDayIntegerValues {
-
- int getYear(LocalDateTime localDateTime) {
- return localDateTime.getYear();
- }
-
- int getMonth(LocalDateTime localDateTime) {
- return localDateTime.getMonthValue();
- }
-
- int getDay(LocalDateTime localDateTime) {
- return localDateTime.getDayOfMonth();
- }
-}
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+
+public class LocalDateTimeExtractYearMonthDayIntegerValues {
+
+ int getYear(LocalDateTime localDateTime) {
+ return localDateTime.getYear();
+ }
+
+ int getMonth(LocalDateTime localDateTime) {
+ return localDateTime.getMonthValue();
+ }
+
+ int getDay(LocalDateTime localDateTime) {
+ return localDateTime.getDayOfMonth();
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
similarity index 96%
rename from java-dates/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
index e686b05493..398c03102c 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
+++ b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValues.java
@@ -1,18 +1,18 @@
-package com.baeldung.datetime;
-
-import java.time.OffsetDateTime;
-
-public class OffsetDateTimeExtractYearMonthDayIntegerValues {
-
- int getYear(OffsetDateTime offsetDateTime) {
- return offsetDateTime.getYear();
- }
-
- int getMonth(OffsetDateTime offsetDateTime) {
- return offsetDateTime.getMonthValue();
- }
-
- int getDay(OffsetDateTime offsetDateTime) {
- return offsetDateTime.getDayOfMonth();
- }
-}
+package com.baeldung.datetime;
+
+import java.time.OffsetDateTime;
+
+public class OffsetDateTimeExtractYearMonthDayIntegerValues {
+
+ int getYear(OffsetDateTime offsetDateTime) {
+ return offsetDateTime.getYear();
+ }
+
+ int getMonth(OffsetDateTime offsetDateTime) {
+ return offsetDateTime.getMonthValue();
+ }
+
+ int getDay(OffsetDateTime offsetDateTime) {
+ return offsetDateTime.getDayOfMonth();
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
similarity index 95%
rename from java-dates/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
index 3e790b2b3f..86bce90f75 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
+++ b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValues.java
@@ -1,18 +1,18 @@
-package com.baeldung.datetime;
-
-import java.time.ZonedDateTime;
-
-public class ZonedDateTimeExtractYearMonthDayIntegerValues {
-
- int getYear(ZonedDateTime zonedDateTime) {
- return zonedDateTime.getYear();
- }
-
- int getMonth(ZonedDateTime zonedDateTime) {
- return zonedDateTime.getMonthValue();
- }
-
- int getDay(ZonedDateTime zonedDateTime) {
- return zonedDateTime.getDayOfMonth();
- }
-}
+package com.baeldung.datetime;
+
+import java.time.ZonedDateTime;
+
+public class ZonedDateTimeExtractYearMonthDayIntegerValues {
+
+ int getYear(ZonedDateTime zonedDateTime) {
+ return zonedDateTime.getYear();
+ }
+
+ int getMonth(ZonedDateTime zonedDateTime) {
+ return zonedDateTime.getMonthValue();
+ }
+
+ int getDay(ZonedDateTime zonedDateTime) {
+ return zonedDateTime.getDayOfMonth();
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/datetime/modify/DateIncrementer.java
diff --git a/java-dates/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/gregorian/calendar/GregorianCalendarExample.java
diff --git a/java-dates/src/main/java/com/baeldung/java9/time/TimeApi.java b/core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/java9/time/TimeApi.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/java9/time/TimeApi.java
rename to core-java-modules/core-java-datetime-computations/src/main/java/com/baeldung/java9/time/TimeApi.java
diff --git a/java-dates/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/AgeCalculatorUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateDiffUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateDiffUnitTest.java
index a35699e469..226556d4bb 100644
--- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateDiffUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.date;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -16,7 +16,7 @@ import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
public class DateDiffUnitTest {
@@ -31,14 +31,14 @@ public class DateDiffUnitTest {
assertEquals(diff, 6);
}
-
+
@Test
public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDate now = LocalDate.now();
LocalDate sixDaysBehind = now.minusDays(6);
Period period = Period.between(now, sixDaysBehind);
- int diff = period.getDays();
+ int diff = Math.abs(period.getDays());
assertEquals(diff, 6);
}
@@ -68,7 +68,8 @@ public class DateDiffUnitTest {
public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime now = ldt.atZone(ZoneId.of("America/Montreal"));
- ZonedDateTime sixDaysBehind = now.withZoneSameInstant(ZoneId.of("Asia/Singapore")).minusDays(6);
+ ZonedDateTime sixDaysBehind = now.withZoneSameInstant(ZoneId.of("Asia/Singapore"))
+ .minusDays(6);
long diff = ChronoUnit.DAYS.between(sixDaysBehind, now);
assertEquals(diff, 6);
}
diff --git a/java-dates/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/date/DateWithoutTimeUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/AddHoursToDateUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
index 3b1fcfa6c5..5914b5a727 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/DateExtractYearMonthDayIntegerValuesUnitTest.java
@@ -1,45 +1,45 @@
-package com.baeldung.datetime;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class DateExtractYearMonthDayIntegerValuesUnitTest {
-
- DateExtractYearMonthDayIntegerValues extractYearMonthDateIntegerValues = new DateExtractYearMonthDayIntegerValues();
-
- Date date;
-
- @Before
- public void setup() throws ParseException
- {
- date=new SimpleDateFormat("dd-MM-yyyy").parse("01-03-2018");
- }
-
- @Test
- public void whenGetYear_thenCorrectYear()
- {
- int actualYear=extractYearMonthDateIntegerValues.getYear(date);
- assertThat(actualYear,is(2018));
- }
-
- @Test
- public void whenGetMonth_thenCorrectMonth()
- {
- int actualMonth=extractYearMonthDateIntegerValues.getMonth(date);
- assertThat(actualMonth,is(02));
- }
-
- @Test
- public void whenGetDay_thenCorrectDay()
- {
- int actualDayOfMonth=extractYearMonthDateIntegerValues.getDay(date);
- assertThat(actualDayOfMonth,is(01));
- }
-}
+package com.baeldung.datetime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class DateExtractYearMonthDayIntegerValuesUnitTest {
+
+ DateExtractYearMonthDayIntegerValues extractYearMonthDateIntegerValues = new DateExtractYearMonthDayIntegerValues();
+
+ Date date;
+
+ @Before
+ public void setup() throws ParseException
+ {
+ date=new SimpleDateFormat("dd-MM-yyyy").parse("01-03-2018");
+ }
+
+ @Test
+ public void whenGetYear_thenCorrectYear()
+ {
+ int actualYear=extractYearMonthDateIntegerValues.getYear(date);
+ assertThat(actualYear,is(2018));
+ }
+
+ @Test
+ public void whenGetMonth_thenCorrectMonth()
+ {
+ int actualMonth=extractYearMonthDateIntegerValues.getMonth(date);
+ assertThat(actualMonth,is(02));
+ }
+
+ @Test
+ public void whenGetDay_thenCorrectDay()
+ {
+ int actualDayOfMonth=extractYearMonthDateIntegerValues.getDay(date);
+ assertThat(actualDayOfMonth,is(01));
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
index 05de6ed0b9..641d45a536 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateExtractYearMonthDayIntegerValuesUnitTest.java
@@ -1,36 +1,36 @@
-package com.baeldung.datetime;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.time.LocalDate;
-
-import org.junit.Test;
-
-public class LocalDateExtractYearMonthDayIntegerValuesUnitTest {
-
- LocalDateExtractYearMonthDayIntegerValues localDateExtractYearMonthDayIntegerValues=new LocalDateExtractYearMonthDayIntegerValues();
-
- LocalDate localDate=LocalDate.parse("2007-12-03");
-
- @Test
- public void whenGetYear_thenCorrectYear()
- {
- int actualYear=localDateExtractYearMonthDayIntegerValues.getYear(localDate);
- assertThat(actualYear,is(2007));
- }
-
- @Test
- public void whenGetMonth_thenCorrectMonth()
- {
- int actualMonth=localDateExtractYearMonthDayIntegerValues.getMonth(localDate);
- assertThat(actualMonth,is(12));
- }
-
- @Test
- public void whenGetDay_thenCorrectDay()
- {
- int actualDayOfMonth=localDateExtractYearMonthDayIntegerValues.getDay(localDate);
- assertThat(actualDayOfMonth,is(03));
- }
-}
+package com.baeldung.datetime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.time.LocalDate;
+
+import org.junit.Test;
+
+public class LocalDateExtractYearMonthDayIntegerValuesUnitTest {
+
+ LocalDateExtractYearMonthDayIntegerValues localDateExtractYearMonthDayIntegerValues=new LocalDateExtractYearMonthDayIntegerValues();
+
+ LocalDate localDate=LocalDate.parse("2007-12-03");
+
+ @Test
+ public void whenGetYear_thenCorrectYear()
+ {
+ int actualYear=localDateExtractYearMonthDayIntegerValues.getYear(localDate);
+ assertThat(actualYear,is(2007));
+ }
+
+ @Test
+ public void whenGetMonth_thenCorrectMonth()
+ {
+ int actualMonth=localDateExtractYearMonthDayIntegerValues.getMonth(localDate);
+ assertThat(actualMonth,is(12));
+ }
+
+ @Test
+ public void whenGetDay_thenCorrectDay()
+ {
+ int actualDayOfMonth=localDateExtractYearMonthDayIntegerValues.getDay(localDate);
+ assertThat(actualDayOfMonth,is(03));
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
index 70544ea970..295a4018c2 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
@@ -1,36 +1,36 @@
-package com.baeldung.datetime;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.time.LocalDateTime;
-
-import org.junit.Test;
-
-public class LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest {
-
- LocalDateTimeExtractYearMonthDayIntegerValues localDateTimeExtractYearMonthDayIntegerValues = new LocalDateTimeExtractYearMonthDayIntegerValues();
-
- LocalDateTime localDateTime=LocalDateTime.parse("2007-12-03T10:15:30");
-
- @Test
- public void whenGetYear_thenCorrectYear()
- {
- int actualYear=localDateTimeExtractYearMonthDayIntegerValues.getYear(localDateTime);
- assertThat(actualYear,is(2007));
- }
-
- @Test
- public void whenGetMonth_thenCorrectMonth()
- {
- int actualMonth=localDateTimeExtractYearMonthDayIntegerValues.getMonth(localDateTime);
- assertThat(actualMonth,is(12));
- }
-
- @Test
- public void whenGetDay_thenCorrectDay()
- {
- int actualDayOfMonth=localDateTimeExtractYearMonthDayIntegerValues.getDay(localDateTime);
- assertThat(actualDayOfMonth,is(03));
- }
-}
+package com.baeldung.datetime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.time.LocalDateTime;
+
+import org.junit.Test;
+
+public class LocalDateTimeExtractYearMonthDayIntegerValuesUnitTest {
+
+ LocalDateTimeExtractYearMonthDayIntegerValues localDateTimeExtractYearMonthDayIntegerValues = new LocalDateTimeExtractYearMonthDayIntegerValues();
+
+ LocalDateTime localDateTime=LocalDateTime.parse("2007-12-03T10:15:30");
+
+ @Test
+ public void whenGetYear_thenCorrectYear()
+ {
+ int actualYear=localDateTimeExtractYearMonthDayIntegerValues.getYear(localDateTime);
+ assertThat(actualYear,is(2007));
+ }
+
+ @Test
+ public void whenGetMonth_thenCorrectMonth()
+ {
+ int actualMonth=localDateTimeExtractYearMonthDayIntegerValues.getMonth(localDateTime);
+ assertThat(actualMonth,is(12));
+ }
+
+ @Test
+ public void whenGetDay_thenCorrectDay()
+ {
+ int actualDayOfMonth=localDateTimeExtractYearMonthDayIntegerValues.getDay(localDateTime);
+ assertThat(actualDayOfMonth,is(03));
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
index efb01c49a5..3e1044e4be 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
@@ -1,36 +1,36 @@
-package com.baeldung.datetime;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.time.OffsetDateTime;
-
-import org.junit.Test;
-
-public class OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest {
-
- OffsetDateTimeExtractYearMonthDayIntegerValues offsetDateTimeExtractYearMonthDayIntegerValues = new OffsetDateTimeExtractYearMonthDayIntegerValues();
-
- OffsetDateTime offsetDateTime=OffsetDateTime.parse("2007-12-03T10:15:30+01:00");
-
- @Test
- public void whenGetYear_thenCorrectYear()
- {
- int actualYear=offsetDateTimeExtractYearMonthDayIntegerValues.getYear(offsetDateTime);
- assertThat(actualYear,is(2007));
- }
-
- @Test
- public void whenGetMonth_thenCorrectMonth()
- {
- int actualMonth=offsetDateTimeExtractYearMonthDayIntegerValues.getMonth(offsetDateTime);
- assertThat(actualMonth,is(12));
- }
-
- @Test
- public void whenGetDay_thenCorrectDay()
- {
- int actualDayOfMonth=offsetDateTimeExtractYearMonthDayIntegerValues.getDay(offsetDateTime);
- assertThat(actualDayOfMonth,is(03));
- }
-}
+package com.baeldung.datetime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.time.OffsetDateTime;
+
+import org.junit.Test;
+
+public class OffsetDateTimeExtractYearMonthDayIntegerValuesUnitTest {
+
+ OffsetDateTimeExtractYearMonthDayIntegerValues offsetDateTimeExtractYearMonthDayIntegerValues = new OffsetDateTimeExtractYearMonthDayIntegerValues();
+
+ OffsetDateTime offsetDateTime=OffsetDateTime.parse("2007-12-03T10:15:30+01:00");
+
+ @Test
+ public void whenGetYear_thenCorrectYear()
+ {
+ int actualYear=offsetDateTimeExtractYearMonthDayIntegerValues.getYear(offsetDateTime);
+ assertThat(actualYear,is(2007));
+ }
+
+ @Test
+ public void whenGetMonth_thenCorrectMonth()
+ {
+ int actualMonth=offsetDateTimeExtractYearMonthDayIntegerValues.getMonth(offsetDateTime);
+ assertThat(actualMonth,is(12));
+ }
+
+ @Test
+ public void whenGetDay_thenCorrectDay()
+ {
+ int actualDayOfMonth=offsetDateTimeExtractYearMonthDayIntegerValues.getDay(offsetDateTime);
+ assertThat(actualDayOfMonth,is(03));
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
index a9ed3d2b74..2f2c0a99be 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
+++ b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest.java
@@ -1,36 +1,36 @@
-package com.baeldung.datetime;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.time.ZonedDateTime;
-
-import org.junit.Test;
-
-public class ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest {
-
- ZonedDateTimeExtractYearMonthDayIntegerValues zonedDateTimeExtractYearMonthDayIntegerValues = new ZonedDateTimeExtractYearMonthDayIntegerValues();
-
- ZonedDateTime zonedDateTime=ZonedDateTime.parse("2007-12-03T10:15:30+01:00");
-
- @Test
- public void whenGetYear_thenCorrectYear()
- {
- int actualYear=zonedDateTimeExtractYearMonthDayIntegerValues.getYear(zonedDateTime);
- assertThat(actualYear,is(2007));
- }
-
- @Test
- public void whenGetMonth_thenCorrectMonth()
- {
- int actualMonth=zonedDateTimeExtractYearMonthDayIntegerValues.getMonth(zonedDateTime);
- assertThat(actualMonth,is(12));
- }
-
- @Test
- public void whenGetDay_thenCorrectDay()
- {
- int actualDayOfMonth=zonedDateTimeExtractYearMonthDayIntegerValues.getDay(zonedDateTime);
- assertThat(actualDayOfMonth,is(03));
- }
-}
+package com.baeldung.datetime;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.time.ZonedDateTime;
+
+import org.junit.Test;
+
+public class ZonedDateTimeExtractYearMonthDayIntegerValuesUnitTest {
+
+ ZonedDateTimeExtractYearMonthDayIntegerValues zonedDateTimeExtractYearMonthDayIntegerValues = new ZonedDateTimeExtractYearMonthDayIntegerValues();
+
+ ZonedDateTime zonedDateTime=ZonedDateTime.parse("2007-12-03T10:15:30+01:00");
+
+ @Test
+ public void whenGetYear_thenCorrectYear()
+ {
+ int actualYear=zonedDateTimeExtractYearMonthDayIntegerValues.getYear(zonedDateTime);
+ assertThat(actualYear,is(2007));
+ }
+
+ @Test
+ public void whenGetMonth_thenCorrectMonth()
+ {
+ int actualMonth=zonedDateTimeExtractYearMonthDayIntegerValues.getMonth(zonedDateTime);
+ assertThat(actualMonth,is(12));
+ }
+
+ @Test
+ public void whenGetDay_thenCorrectDay()
+ {
+ int actualDayOfMonth=zonedDateTimeExtractYearMonthDayIntegerValues.getDay(zonedDateTime);
+ assertThat(actualDayOfMonth,is(03));
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/datetime/modify/DateIncrementerUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeExamplesUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/dst/DaylightSavingTimeJavaTimeExamplesUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/gregorian/calendar/GregorianCalendarTester.java
diff --git a/java-dates/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/java9/time/TimeApiUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java b/core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
rename to core-java-modules/core-java-datetime-computations/src/test/java/com/baeldung/jodatime/JodaTimeUnitTest.java
diff --git a/core-java-modules/core-java-datetime-conversion/README.md b/core-java-modules/core-java-datetime-conversion/README.md
new file mode 100644
index 0000000000..2503459f50
--- /dev/null
+++ b/core-java-modules/core-java-datetime-conversion/README.md
@@ -0,0 +1,9 @@
+## Java Date/time conversion Cookbooks and Examples
+
+This module contains articles about converting between Java date and time objects.
+
+### Relevant Articles:
+- [Converting Between LocalDate and XMLGregorianCalendar](https://www.baeldung.com/java-localdate-to-xmlgregoriancalendar)
+- [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds)
+- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime)
+- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
diff --git a/core-java-modules/core-java-datetime-conversion/pom.xml b/core-java-modules/core-java-datetime-conversion/pom.xml
new file mode 100644
index 0000000000..a93eca00af
--- /dev/null
+++ b/core-java-modules/core-java-datetime-conversion/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+ core-java-datetime-conversion
+ ${project.parent.version}
+ core-java-datetime-conversion
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-datetime-conversion
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 2.10
+
+ 3.6.1
+ 1.9
+ 1.9
+
+
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
similarity index 96%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
index c794c57e87..80bccb399a 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java
+++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.Instant;
import java.time.LocalDate;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
similarity index 96%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
index 17ca5b1122..1d1e3b7d92 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java
+++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.Instant;
import java.time.LocalDateTime;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
similarity index 94%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
index f219dcf038..9a6bb248fa 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java
+++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.LocalDateTime;
import java.time.ZoneId;
diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
similarity index 94%
rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
rename to core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
index f9893da5d0..f679ffb77a 100644
--- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java
+++ b/core-java-modules/core-java-datetime-conversion/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import java.time.LocalDate;
import java.time.ZoneId;
diff --git a/java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/convert/ConvertDateTimeUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
index 3ba01a591a..e5fd80285c 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java
@@ -1,15 +1,14 @@
package com.baeldung.datetime;
-import static org.assertj.core.api.Assertions.assertThat;
+import org.junit.Test;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Instant;
-import java.time.ZoneId;
import java.util.TimeZone;
-import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
public class ConvertInstantToTimestampUnitTest {
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
index f7f07500f1..b5a54e28eb 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -12,7 +12,7 @@ import java.util.Date;
import org.junit.Test;
-import com.baeldung.java9.datetime.DateToLocalDateConverter;
+import com.baeldung.datetolocaldate.DateToLocalDateConverter;
/**
* JUnits for {@link DateToLocalDateConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
index 9ad29ea673..e6098cec1c 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -12,7 +12,7 @@ import java.util.Date;
import org.junit.Test;
-import com.baeldung.java9.datetime.DateToLocalDateTimeConverter;
+import com.baeldung.datetolocaldate.DateToLocalDateTimeConverter;
/**
* JUnits for {@link DateToLocalDateTimeConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
similarity index 94%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
index e5a541c546..c8e596c220 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -11,6 +11,8 @@ import java.util.Date;
import org.junit.Test;
+import com.baeldung.datetolocaldate.LocalDateTimeToDateConverter;
+
/**
*
* JUnits for {@link LocalDateTimeToDateConverter} class.
diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
index 4e4dd20f2f..4ff3682158 100644
--- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java
+++ b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java
@@ -1,7 +1,7 @@
/**
*
*/
-package com.baeldung.java9.datetime;
+package com.baeldung.datetolocaldate;
import static org.junit.Assert.assertEquals;
@@ -11,6 +11,8 @@ import java.util.Date;
import org.junit.Test;
+import com.baeldung.datetolocaldate.LocalDateToDateConverter;
+
/**
*
* JUnits for {@link LocalDateToDateConverter} class.
diff --git a/java-dates-2/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java b/core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
rename to core-java-modules/core-java-datetime-conversion/src/test/java/com/baeldung/xmlgregoriancalendar/XmlGregorianCalendarConverterUnitTest.java
diff --git a/core-java-modules/core-java-datetime-java8/README.md b/core-java-modules/core-java-datetime-java8/README.md
new file mode 100644
index 0000000000..044f6f3fe3
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/README.md
@@ -0,0 +1,15 @@
+## Java 8+ Date and Time API
+
+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)
+- [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)
+- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
+- [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end)
+- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone)
+- [Comparing Dates in Java](https://www.baeldung.com/java-comparing-dates)
diff --git a/core-java-modules/core-java-datetime-java8/pom.xml b/core-java-modules/core-java-datetime-java8/pom.xml
new file mode 100644
index 0000000000..72d51b5f10
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+ core-java-datetime-java8
+ ${project.parent.version}
+ core-java-datetime-java8
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ joda-time
+ joda-time
+ ${joda-time.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ log4j
+ log4j
+ ${log4j.version}
+ test
+
+
+
+
+ core-java-datetime-java8
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 1.9
+ 1.9
+ 2.10
+
+ 3.6.1
+
+
diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
new file mode 100644
index 0000000000..4d732df795
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java
@@ -0,0 +1,35 @@
+package com.baeldung.date.comparison;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import static java.time.temporal.ChronoUnit.*;
+
+public class DateTimeComparisonUtils {
+
+ public static boolean isSameDay(LocalDateTime timestamp, LocalDate localDateToCompare) {
+ return timestamp.toLocalDate().isEqual(localDateToCompare);
+ }
+
+ public static boolean isSameDay(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(DAYS).isEqual(timestampToCompare.truncatedTo(DAYS));
+ }
+
+ public static boolean isSameHour(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(HOURS).isEqual(timestampToCompare.truncatedTo(HOURS));
+ }
+
+ public static boolean isSameMinute(LocalDateTime timestamp, LocalDateTime timestampToCompare) {
+ return timestamp.truncatedTo(MINUTES).isEqual(timestampToCompare.truncatedTo(MINUTES));
+ }
+
+ public static boolean isSameHour(ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) {
+ return zonedTimestamp.truncatedTo(HOURS).isEqual(zonedTimestampToCompare.truncatedTo(HOURS));
+ }
+
+ public static boolean isSameHour(ZonedDateTime zonedDateTime, LocalDateTime localDateTime, ZoneId zoneId) {
+ return isSameHour(zonedDateTime, localDateTime.atZone(zoneId));
+ }
+}
diff --git a/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
new file mode 100644
index 0000000000..9519bc316a
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java
@@ -0,0 +1,17 @@
+package com.baeldung.date.comparison;
+
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class LegacyDateComparisonUtils {
+
+ public static boolean isSameDay(Date date, Date dateToCompare) {
+ return DateUtils.isSameDay(date, dateToCompare);
+ }
+
+ public static boolean isSameHour(Date date, Date dateToCompare) {
+ return DateUtils.truncatedEquals(date, dateToCompare, Calendar.HOUR);
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseDuration.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDuration.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetime/UseDuration.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseDuration.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDate.java
similarity index 91%
rename from java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDate.java
index b380c04fc2..ec8dfa2fc4 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDate.java
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDate.java
@@ -36,10 +36,15 @@ class UseLocalDate {
}
LocalDate getFirstDayOfMonth() {
- LocalDate firstDayOfMonth = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+ LocalDate firstDayOfMonth = LocalDate.now()
+ .with(TemporalAdjusters.firstDayOfMonth());
return firstDayOfMonth;
}
+ boolean isLeapYear(LocalDate localDate) {
+ return localDate.isLeapYear();
+ }
+
LocalDateTime getStartOfDay(LocalDate localDate) {
LocalDateTime startofDay = localDate.atStartOfDay();
return startofDay;
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
similarity index 80%
rename from java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
index b2ff11ba16..267a9412eb 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
@@ -2,6 +2,7 @@ package com.baeldung.datetime;
import java.time.LocalDateTime;
import java.time.LocalTime;
+import java.time.ZoneOffset;
import java.time.temporal.ChronoField;
public class UseLocalDateTime {
@@ -21,4 +22,7 @@ public class UseLocalDateTime {
return endOfDate;
}
+ LocalDateTime ofEpochSecond(int epochSecond, ZoneOffset zoneOffset) {
+ return LocalDateTime.ofEpochSecond(epochSecond, 0, zoneOffset);
+ }
}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalTime.java
similarity index 87%
rename from java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalTime.java
index 8d166c413f..876516e365 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseLocalTime.java
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseLocalTime.java
@@ -9,6 +9,10 @@ public class UseLocalTime {
return LocalTime.of(hour, min, seconds);
}
+ LocalTime getLocalTimeUsingFactoryOfMethod(int hour, int min) {
+ return LocalTime.of(hour, min);
+ }
+
LocalTime getLocalTimeUsingParseMethod(String timeRepresentation) {
return LocalTime.parse(timeRepresentation);
}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UsePeriod.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UsePeriod.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetime/UsePeriod.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UsePeriod.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseToInstant.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseToInstant.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/datetime/UseToInstant.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseToInstant.java
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
similarity index 61%
rename from java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
index 505bfa741f..a8948e5ce1 100644
--- a/java-dates/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
+++ b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/datetime/UseZonedDateTime.java
@@ -12,31 +12,35 @@ class UseZonedDateTime {
return ZonedDateTime.of(localDateTime, zoneId);
}
+ ZonedDateTime getZonedDateTimeUsingParseMethod(String parsableString) {
+ return ZonedDateTime.parse(parsableString);
+ }
+
ZonedDateTime getStartOfDay(LocalDate localDate, ZoneId zone) {
- ZonedDateTime startofDay = localDate.atStartOfDay()
+ ZonedDateTime startOfDay = localDate.atStartOfDay()
.atZone(zone);
- return startofDay;
+ return startOfDay;
}
ZonedDateTime getStartOfDayShorthand(LocalDate localDate, ZoneId zone) {
- ZonedDateTime startofDay = localDate.atStartOfDay(zone);
- return startofDay;
+ ZonedDateTime startOfDay = localDate.atStartOfDay(zone);
+ return startOfDay;
}
ZonedDateTime getStartOfDayFromZonedDateTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.toLocalDateTime()
+ ZonedDateTime startOfDay = zonedDateTime.toLocalDateTime()
.toLocalDate()
.atStartOfDay(zonedDateTime.getZone());
- return startofDay;
+ return startOfDay;
}
ZonedDateTime getStartOfDayAtMinTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
- return startofDay;
+ ZonedDateTime startOfDay = zonedDateTime.with(ChronoField.HOUR_OF_DAY, 0);
+ return startOfDay;
}
ZonedDateTime getStartOfDayAtMidnightTime(ZonedDateTime zonedDateTime) {
- ZonedDateTime startofDay = zonedDateTime.with(ChronoField.NANO_OF_DAY, 0);
- return startofDay;
+ ZonedDateTime startOfDay = zonedDateTime.with(ChronoField.NANO_OF_DAY, 0);
+ return startOfDay;
}
}
diff --git a/java-dates/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java b/core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
rename to core-java-modules/core-java-datetime-java8/src/main/java/com/baeldung/temporaladjuster/CustomTemporalAdjuster.java
diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
new file mode 100644
index 0000000000..0db0d1e8d7
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java
@@ -0,0 +1,75 @@
+package com.baeldung.date.comparison;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+class DateTimeComparisonUtilsUnitTest {
+
+ @Test
+ void givenLocalDateTimes_whenIsSameDay_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 00, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusHours(5);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusDays(1);
+
+ assertThat(DateTimeComparisonUtils.isSameDay(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameDay(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenLocalDateAndLocalDateTime_whenIsSameDay_thenCompareTrue() {
+ LocalDate localDate = LocalDate.of(2019, 8, 10);
+ LocalDateTime localDateTime = LocalDateTime.of(2019, 8, 10, 11, 30, 0);
+
+ assertThat(DateTimeComparisonUtils.isSameDay(localDateTime, localDate), is(true));
+ }
+
+ @Test
+ void givenLocalDateTimes_whenIsSameHour_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 00, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusMinutes(15);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusHours(2);
+
+ assertThat(DateTimeComparisonUtils.isSameHour(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameHour(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenLocalDateTimes_whenIsSameMinute_thenCompareTrue() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 15, 0);
+ LocalDateTime secondTimestamp = firstTimestamp.plusSeconds(30);
+ LocalDateTime thirdTimestamp = firstTimestamp.plusMinutes(5);
+
+ assertThat(DateTimeComparisonUtils.isSameMinute(firstTimestamp, secondTimestamp), is(true));
+
+ assertThat(DateTimeComparisonUtils.isSameMinute(secondTimestamp, thirdTimestamp), is(false));
+ }
+
+ @Test
+ void givenZonedDateTimes_whenIsSameHour_thenCompareTrue() {
+ ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 30,
+ ZoneId.of("America/New_York"));
+ ZonedDateTime zonedTimestampToCompare = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0,
+ ZoneId.of("Europe/Berlin"));
+
+ assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, zonedTimestampToCompare), is(true));
+ }
+
+ @Test
+ void givenZonedDateTimeAndLocalDateTime_whenIsSameHour_thenCompareTrue() {
+ ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 15, 0, 0,
+ ZoneId.of("America/New_York"));
+ LocalDateTime localTimestamp = LocalDateTime.of(2019, 8, 10, 14, 20, 0);
+ ZoneId zoneId = ZoneId.of("Europe/Berlin");
+
+ assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, localTimestamp, zoneId), is(true));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
new file mode 100644
index 0000000000..af72f9e58a
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java
@@ -0,0 +1,95 @@
+package com.baeldung.date.comparison;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+
+import org.junit.Test;
+
+public class Java8DateTimeApiGeneralComparisonsUnitTest {
+
+ @Test
+ public void givenLocalDates_whenComparing_thenAssertsPass() {
+ LocalDate firstDate = LocalDate.of(2019, 8, 10);
+ LocalDate secondDate = LocalDate.of(2019, 7, 1);
+ LocalDate thirdDate = LocalDate.of(2019, 7, 1); // same date as secondDate
+
+ assertThat(firstDate.isAfter(secondDate), is(true));
+ assertThat(firstDate.isBefore(secondDate), is(false));
+
+ assertThat(firstDate.isEqual(secondDate), is(false));
+ assertThat(firstDate.equals(secondDate), is(false));
+
+ assertThat(firstDate.compareTo(secondDate), is(1));
+ assertThat(secondDate.compareTo(firstDate), is(-1));
+
+ assertThat(secondDate.isAfter(thirdDate), is(false));
+ assertThat(secondDate.isBefore(thirdDate), is(false));
+ assertThat(secondDate.isEqual(thirdDate), is(true));
+ assertThat(secondDate.equals(thirdDate), is(true));
+ assertThat(secondDate.compareTo(thirdDate), is(0));
+ }
+
+ @Test
+ public void givenLocalDateTimes_whenComparing_thenAssertsPass() {
+ LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 30, 0);
+ LocalDateTime secondTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0);
+ LocalDateTime thirdTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0); // same as secondTimestamp
+
+ assertThat(firstTimestamp.isAfter(secondTimestamp), is(true));
+ assertThat(firstTimestamp.isBefore(secondTimestamp), is(false));
+
+ assertThat(firstTimestamp.isEqual(secondTimestamp), is(false));
+ assertThat(firstTimestamp.equals(secondTimestamp), is(false));
+
+ assertThat(firstTimestamp.compareTo(secondTimestamp), is(1));
+ assertThat(secondTimestamp.compareTo(firstTimestamp), is(-1));
+
+ assertThat(secondTimestamp.isAfter(thirdTimestamp), is(false));
+ assertThat(secondTimestamp.isBefore(thirdTimestamp), is(false));
+ assertThat(secondTimestamp.isEqual(thirdTimestamp), is(true));
+ assertThat(secondTimestamp.compareTo(thirdTimestamp), is(0));
+ }
+
+ @Test
+ public void givenZonedDateTimes_whenComparing_thenAssertsPass() {
+ ZonedDateTime timeInNewYork = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0, ZoneId.of("America/New_York"));
+ ZonedDateTime timeInBerlin = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, ZoneId.of("Europe/Berlin"));
+
+ assertThat(timeInNewYork.isAfter(timeInBerlin), is(false));
+ assertThat(timeInNewYork.isBefore(timeInBerlin), is(false));
+
+ assertThat(timeInNewYork.isEqual(timeInBerlin), is(true));
+ assertThat(timeInNewYork.equals(timeInBerlin), is(false));
+
+ assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1));
+ }
+
+ @Test
+ public void givenLocalTimes_whenComparing_thenAssertsPass() {
+ LocalTime firstTime = LocalTime.of(8, 30);
+ LocalTime secondTime = LocalTime.of(9, 45);
+
+ assertThat(firstTime.isAfter(secondTime), is(false));
+ assertThat(firstTime.isBefore(secondTime), is(true));
+
+ assertThat(firstTime.equals(secondTime), is(false));
+
+ assertThat(firstTime.compareTo(secondTime), is(-1));
+ }
+
+ @Test
+ public void givenMinMaxLocalTimes_whenComparing_thenAssertsPass() {
+ LocalTime minTime = LocalTime.MIN;
+ LocalTime time = LocalTime.of(8, 30);
+ LocalTime maxTime = LocalTime.MAX;
+
+ assertThat(minTime.isBefore(time), is(true));
+ assertThat(time.isBefore(maxTime), is(true));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
new file mode 100644
index 0000000000..a501cb8888
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.date.comparison;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+class LegacyDateComparisonUtilsUnitTest {
+
+ private Date toDate(LocalDateTime localDateTime) {
+ return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ @Test
+ void givenDatesWithDifferentHours_whenIsSameDay_thenReturnsTrue() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 12, 00, 00));
+
+ assertThat(LegacyDateComparisonUtils.isSameDay(firstDate, secondDate), is(true));
+ assertThat(LegacyDateComparisonUtils.isSameDay(secondDate, thirdDate), is(false));
+ }
+
+ @Test
+ void givenDatesWithingSameHour_whenIsSameHour_thenReturnsTrue() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 15, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00));
+
+ assertThat(LegacyDateComparisonUtils.isSameHour(firstDate, secondDate), is(true));
+ assertThat(LegacyDateComparisonUtils.isSameHour(secondDate, thirdDate), is(false));
+ }
+
+ @Test
+ void givenDates__whenComparing_thenAssertsPass() {
+ Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 0, 00, 00));
+ Date secondDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00));
+ Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00)); // same date as secondDate
+
+ assertThat(firstDate.after(secondDate), is(false));
+ assertThat(firstDate.before(secondDate), is(true));
+ assertThat(firstDate.compareTo(secondDate), is(-1));
+ assertThat(firstDate.equals(secondDate), is(false));
+
+ assertThat(thirdDate.after(secondDate), is(false));
+ assertThat(thirdDate.before(secondDate), is(false));
+ assertThat(thirdDate.compareTo(secondDate), is(0));
+ assertThat(thirdDate.equals(secondDate), is(true));
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/ConversionExample.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/ConversionExample.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/dateapi/ConversionExample.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/ConversionExample.java
diff --git a/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
new file mode 100644
index 0000000000..be43fb609a
--- /dev/null
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.dateapi;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
+
+import org.junit.Test;
+
+public class JavaDurationUnitTest {
+
+ @Test
+ public void givenATimePlus30Seconds_whenRequestingDuration_thenExpect30() {
+ LocalTime initialTime = LocalTime.of(6, 30, 0);
+ LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
+
+ long seconds = Duration.between(initialTime, finalTime)
+ .getSeconds();
+
+ assertThat(seconds).isEqualTo(30);
+ }
+
+ @Test
+ public void givenATimePlus30Seconds_whenRequestingSecondsBetween_thenExpect30() {
+ LocalTime initialTime = LocalTime.of(6, 30, 0);
+ LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
+
+ long seconds = ChronoUnit.SECONDS.between(initialTime, finalTime);
+
+ assertThat(seconds).isEqualTo(30);
+ }
+
+ @Test
+ public void test2() {
+ Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
+ Instant end = Instant.parse("2017-10-03T10:16:30.00Z");
+
+ Duration duration = Duration.between(start, end);
+
+ assertFalse(duration.isNegative());
+
+ assertEquals(60, duration.getSeconds());
+ assertEquals(1, duration.toMinutes());
+
+ Duration fromDays = Duration.ofDays(1);
+ assertEquals(86400, fromDays.getSeconds());
+
+ Duration fromMinutes = Duration.ofMinutes(60);
+ assertEquals(1, fromMinutes.toHours());
+
+ assertEquals(120, duration.plusSeconds(60)
+ .getSeconds());
+ assertEquals(30, duration.minusSeconds(30)
+ .getSeconds());
+
+ assertEquals(120, duration.plus(60, ChronoUnit.SECONDS)
+ .getSeconds());
+ assertEquals(30, duration.minus(30, ChronoUnit.SECONDS)
+ .getSeconds());
+
+ Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
+ Duration fromChar2 = Duration.parse("PT10M");
+ }
+
+}
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
similarity index 57%
rename from java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
index 81e9153a51..6dfbbe8c24 100644
--- a/java-dates/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaPeriodUnitTest.java
@@ -1,18 +1,41 @@
package com.baeldung.dateapi;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.temporal.ChronoUnit;
+
import org.apache.log4j.Logger;
import org.junit.Test;
-import java.time.LocalDate;
-import java.time.Period;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
public class JavaPeriodUnitTest {
private static final Logger LOG = Logger.getLogger(JavaPeriodUnitTest.class);
+ @Test
+ public void givenADatePlus5Days_whenRequestingPeriod_thenExpectFive() {
+ LocalDate initialDate = LocalDate.parse("2007-05-10");
+ LocalDate finalDate = initialDate.plus(Period.ofDays(5));
+
+ int days = Period.between(initialDate, finalDate)
+ .getDays();
+
+ assertThat(days).isEqualTo(5);
+ }
+
+ @Test
+ public void givenADatePlus5Days_whenRequestingDaysBetween_thenExpectFive() {
+ LocalDate initialDate = LocalDate.parse("2007-05-10");
+ LocalDate finalDate = initialDate.plus(Period.ofDays(5));
+
+ long days = ChronoUnit.DAYS.between(initialDate, finalDate);
+
+ assertThat(days).isEqualTo(5);
+ }
+
@Test
public void whenTestPeriod_thenOk() {
@@ -24,8 +47,10 @@ public class JavaPeriodUnitTest {
LOG.info(String.format("Years:%d months:%d days:%d", period.getYears(), period.getMonths(), period.getDays()));
assertFalse(period.isNegative());
- assertEquals(56, period.plusDays(50).getDays());
- assertEquals(9, period.minusMonths(2).getMonths());
+ assertEquals(56, period.plusDays(50)
+ .getDays());
+ assertEquals(9, period.minusMonths(2)
+ .getMonths());
Period fromUnits = Period.of(3, 10, 10);
Period fromDays = Period.ofDays(50);
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/dateapi/JavaUtilTimeUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
similarity index 55%
rename from java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
index 5709fc7209..2bbee16e25 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateTimeUnitTest.java
@@ -7,12 +7,13 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;
+import java.time.ZoneOffset;
import org.junit.Test;
public class UseLocalDateTimeUnitTest {
- UseLocalDateTime useLocalDateTime = new UseLocalDateTime();
+ private UseLocalDateTime useLocalDateTime = new UseLocalDateTime();
@Test
public void givenString_whenUsingParse_thenLocalDateTime() {
@@ -33,4 +34,28 @@ public class UseLocalDateTimeUnitTest {
assertThat(endOfDayFromGivenDirectly.toLocalTime()).isEqualTo(LocalTime.MAX);
assertThat(endOfDayFromGivenDirectly.toString()).isEqualTo("2018-06-23T23:59:59.999999999");
}
+
+ @Test
+ public void givenLocalDateTimeInFebruary_whenRequestingMonth_thenMonthIsFebruary() {
+ LocalDateTime givenLocalDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 6, 30);
+
+ assertThat(givenLocalDateTime.getMonth()).isEqualTo(Month.FEBRUARY);
+ }
+
+ @Test
+ public void givenLocalDateTime_whenManipulating_thenResultIsAsExpected() {
+ LocalDateTime givenLocalDateTime = LocalDateTime.parse("2015-02-20T06:30:00");
+
+ LocalDateTime manipulatedLocalDateTime = givenLocalDateTime.plusDays(1);
+ manipulatedLocalDateTime = manipulatedLocalDateTime.minusHours(2);
+
+ assertThat(manipulatedLocalDateTime).isEqualTo(LocalDateTime.of(2015, Month.FEBRUARY, 21, 4, 30));
+ }
+
+ @Test
+ public void whenRequestTimeFromEpoch_thenResultIsAsExpected() {
+ LocalDateTime result = useLocalDateTime.ofEpochSecond(1465817690, ZoneOffset.UTC);
+
+ assertThat(result.toString()).isEqualTo("2016-06-13T11:34:50");
+ }
}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
similarity index 79%
rename from java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
index bb9b60956d..fd22be9260 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalDateUnitTest.java
@@ -12,7 +12,7 @@ import org.junit.Test;
public class UseLocalDateUnitTest {
- UseLocalDate useLocalDate = new UseLocalDate();
+ private UseLocalDate useLocalDate = new UseLocalDate();
@Test
public void givenValues_whenUsingFactoryOf_thenLocalDate() {
@@ -88,4 +88,31 @@ public class UseLocalDateUnitTest {
assertThat(endOfDayWithMax.toString()).isEqualTo("2018-06-23T23:59:59.999999999");
}
+ @Test
+ public void givenTheYear2000_whenCheckingForLeapYear_thenReturnTrue() {
+ LocalDate given = LocalDate.parse("2000-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(true);
+ }
+
+ @Test
+ public void givenTheYear2004_whenCheckingForLeapYear_thenReturnTrue() {
+ LocalDate given = LocalDate.parse("2004-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(true);
+ }
+
+ @Test
+ public void givenTheYear2019_whenCheckingForLeapYear_thenReturnFalse() {
+ LocalDate given = LocalDate.parse("2019-06-23");
+
+ boolean leapYear = useLocalDate.isLeapYear(given);
+
+ assertThat(leapYear).isEqualTo(false);
+ }
+
}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
similarity index 68%
rename from java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
index 996e200ae9..afee9126f9 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseLocalTimeUnitTest.java
@@ -7,21 +7,30 @@ import org.junit.Test;
public class UseLocalTimeUnitTest {
- UseLocalTime useLocalTime = new UseLocalTime();
+ private UseLocalTime useLocalTime = new UseLocalTime();
@Test
public void givenValues_whenUsingFactoryOf_thenLocalTime() {
- Assert.assertEquals("07:07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7, 7).toString());
+ Assert.assertEquals("07:07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7, 7)
+ .toString());
+ }
+
+ @Test
+ public void givenValues_whenUsingFactoryOfWithoutSeconds_thenLocalTime() {
+ Assert.assertEquals("07:07", useLocalTime.getLocalTimeUsingFactoryOfMethod(7, 7)
+ .toString());
}
@Test
public void givenString_whenUsingParse_thenLocalTime() {
- Assert.assertEquals("06:30", useLocalTime.getLocalTimeUsingParseMethod("06:30").toString());
+ Assert.assertEquals("06:30", useLocalTime.getLocalTimeUsingParseMethod("06:30")
+ .toString());
}
@Test
public void givenTime_whenAddHour_thenLocalTime() {
- Assert.assertEquals("07:30", useLocalTime.addAnHour(LocalTime.of(6, 30)).toString());
+ Assert.assertEquals("07:30", useLocalTime.addAnHour(LocalTime.of(6, 30))
+ .toString());
}
@Test
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UsePeriodUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java
similarity index 97%
rename from java-dates/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java
index 4423ac6ce0..7e403ddcab 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseTimeZoneUnitTest.java
@@ -1,72 +1,72 @@
-package com.baeldung.datetime;
-
-import java.text.SimpleDateFormat;
-import java.time.Instant;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class UseTimeZoneUnitTest {
-
- /* https://en.wikipedia.org/wiki/List_of_tz_database_time_zones */
-
- String timeZone = "Asia/Singapore";
-
- private static final String PATTERN = "E yyyy-MM-dd HH:mm:ss a";
-
- @Test
- public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJava7_ThenTimeZoneIsSetSuccessfully() {
- Date nowUtc = new Date();
- TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);
-
- Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
- nowAsiaSingapore.setTime(nowUtc);
-
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PATTERN);
- simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
-
- System.out.println(String.format("Java7: Time now in '%s' is '%s'", nowAsiaSingapore.getTimeZone()
- .getID(), simpleDateFormat.format(nowAsiaSingapore.getTime())));
-
- Assert.assertEquals(nowUtc.toInstant().getEpochSecond(), nowAsiaSingapore.toInstant().getEpochSecond());
- Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getTimeZone());
-
- }
-
- @Test
- public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJava8_ThenTimeZoneIsSetSuccessfully() {
- Instant nowUtc = Instant.now();
- ZoneId asiaSingapore = ZoneId.of(timeZone);
-
- ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);
-
- System.out.println(String.format("Java8: Time now in '%s' is '%s'", nowAsiaSingapore.getZone(),
- nowAsiaSingapore.format(DateTimeFormatter.ofPattern(PATTERN))));
-
- Assert.assertEquals(nowUtc.getEpochSecond(), nowAsiaSingapore.toEpochSecond());
- Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getZone());
- }
-
- @Test
- public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJodaTime_ThenTimeZoneIsSetSuccessfully() {
- org.joda.time.Instant nowUtc = org.joda.time.Instant.now();
- DateTimeZone asiaSingapore = DateTimeZone.forID(timeZone);
-
- DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);
-
- System.out.println(String.format("Joda-time: Time now in '%s' is '%s'", nowAsiaSingapore.getZone(),
- nowAsiaSingapore.toString(PATTERN)));
-
- Assert.assertEquals(nowUtc.toInstant().getMillis(), nowAsiaSingapore.toInstant().getMillis());
- Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getZone());
- }
-
-}
+package com.baeldung.datetime;
+
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class UseTimeZoneUnitTest {
+
+ /* https://en.wikipedia.org/wiki/List_of_tz_database_time_zones */
+
+ String timeZone = "Asia/Singapore";
+
+ private static final String PATTERN = "E yyyy-MM-dd HH:mm:ss a";
+
+ @Test
+ public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJava7_ThenTimeZoneIsSetSuccessfully() {
+ Date nowUtc = new Date();
+ TimeZone asiaSingapore = TimeZone.getTimeZone(timeZone);
+
+ Calendar nowAsiaSingapore = Calendar.getInstance(asiaSingapore);
+ nowAsiaSingapore.setTime(nowUtc);
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PATTERN);
+ simpleDateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
+
+ System.out.println(String.format("Java7: Time now in '%s' is '%s'", nowAsiaSingapore.getTimeZone()
+ .getID(), simpleDateFormat.format(nowAsiaSingapore.getTime())));
+
+ Assert.assertEquals(nowUtc.toInstant().getEpochSecond(), nowAsiaSingapore.toInstant().getEpochSecond());
+ Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getTimeZone());
+
+ }
+
+ @Test
+ public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJava8_ThenTimeZoneIsSetSuccessfully() {
+ Instant nowUtc = Instant.now();
+ ZoneId asiaSingapore = ZoneId.of(timeZone);
+
+ ZonedDateTime nowAsiaSingapore = ZonedDateTime.ofInstant(nowUtc, asiaSingapore);
+
+ System.out.println(String.format("Java8: Time now in '%s' is '%s'", nowAsiaSingapore.getZone(),
+ nowAsiaSingapore.format(DateTimeFormatter.ofPattern(PATTERN))));
+
+ Assert.assertEquals(nowUtc.getEpochSecond(), nowAsiaSingapore.toEpochSecond());
+ Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getZone());
+ }
+
+ @Test
+ public void givenDateWithoutTimeZone_WhenSetTimeZoneUsingJodaTime_ThenTimeZoneIsSetSuccessfully() {
+ org.joda.time.Instant nowUtc = org.joda.time.Instant.now();
+ DateTimeZone asiaSingapore = DateTimeZone.forID(timeZone);
+
+ DateTime nowAsiaSingapore = nowUtc.toDateTime(asiaSingapore);
+
+ System.out.println(String.format("Joda-time: Time now in '%s' is '%s'", nowAsiaSingapore.getZone(),
+ nowAsiaSingapore.toString(PATTERN)));
+
+ Assert.assertEquals(nowUtc.toInstant().getMillis(), nowAsiaSingapore.toInstant().getMillis());
+ Assert.assertEquals(asiaSingapore, nowAsiaSingapore.getZone());
+ }
+
+}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
similarity index 67%
rename from java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
index f9b4008888..4a39f6056e 100644
--- a/java-dates/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
+++ b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/datetime/UseZonedDateTimeUnitTest.java
@@ -7,13 +7,14 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
+import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
public class UseZonedDateTimeUnitTest {
- UseZonedDateTime zonedDateTime = new UseZonedDateTime();
+ private UseZonedDateTime zonedDateTime = new UseZonedDateTime();
@Test
public void givenZoneId_thenZonedDateTime() {
@@ -22,6 +23,13 @@ public class UseZonedDateTimeUnitTest {
Assert.assertEquals(zoneId, ZoneId.from(zonedDatetime));
}
+ @Test
+ public void whenRequestingZones_thenAtLeastOneIsReturned() {
+ Set allZoneIds = ZoneId.getAvailableZoneIds();
+
+ assertThat(allZoneIds.size()).isGreaterThan(1);
+ }
+
@Test
public void givenLocalDateOrZoned_whenSettingStartOfDay_thenReturnMidnightInAllCases() {
LocalDate given = LocalDate.parse("2018-06-23");
@@ -42,4 +50,15 @@ public class UseZonedDateTimeUnitTest {
assertThat(startOfOfDayWithMethod.toLocalTime()
.toString()).isEqualTo("00:00");
}
+
+ @Test
+ public void givenAStringWithTimeZone_whenParsing_thenEqualsExpected() {
+ ZonedDateTime resultFromString = zonedDateTime.getZonedDateTimeUsingParseMethod("2015-05-03T10:15:30+01:00[Europe/Paris]");
+ ZonedDateTime resultFromLocalDateTime = ZonedDateTime.of(2015, 5, 3, 11, 15, 30, 0, ZoneId.of("Europe/Paris"));
+
+ assertThat(resultFromString.getZone()).isEqualTo(ZoneId.of("Europe/Paris"));
+ assertThat(resultFromLocalDateTime.getZone()).isEqualTo(ZoneId.of("Europe/Paris"));
+
+ assertThat(resultFromString).isEqualTo(resultFromLocalDateTime);
+ }
}
diff --git a/java-dates/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/CustomTemporalAdjusterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java b/core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java
rename to core-java-modules/core-java-datetime-java8/src/test/java/com/baeldung/temporaladjusters/TemporalAdjustersUnitTest.java
diff --git a/core-java-modules/core-java-datetime-string/README.md b/core-java-modules/core-java-datetime-string/README.md
new file mode 100644
index 0000000000..cf00bdeb1f
--- /dev/null
+++ b/core-java-modules/core-java-datetime-string/README.md
@@ -0,0 +1,13 @@
+## Java Dates Parsing and Formatting Cookbooks and Examples
+
+This module contains articles about parsing and formatting Java date and time objects.
+
+### Relevant Articles:
+- [Check If a String Is a Valid Date in Java](https://www.baeldung.com/java-string-valid-date)
+- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions)
+- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
+- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
+- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
+- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
+- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp)
+- [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date)
diff --git a/java-dates/pom.xml b/core-java-modules/core-java-datetime-string/pom.xml
similarity index 81%
rename from java-dates/pom.xml
rename to core-java-modules/core-java-datetime-string/pom.xml
index 3fddf3f0f8..b4e7aff524 100644
--- a/java-dates/pom.xml
+++ b/core-java-modules/core-java-datetime-string/pom.xml
@@ -1,17 +1,16 @@
4.0.0
- com.baeldung
- java-dates
- 0.1.0-SNAPSHOT
- java-dates
+ core-java-datetime-string
+ ${project.parent.version}
+ core-java-datetime-string
jar
com.baeldung
parent-java
0.0.1-SNAPSHOT
- ../parent-java
+ ../../parent-java
@@ -20,17 +19,17 @@
commons-lang3
${commons-lang3.version}
+
+
+ commons-validator
+ commons-validator
+ ${commons-validator.version}
+
log4j
log4j
${log4j.version}
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
@@ -52,7 +51,7 @@
- java-dates
+ core-java-datetime-string
src/main/resources
@@ -74,6 +73,7 @@
+ 1.6
2.10
3.6.1
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidator.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidator.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidator.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingApacheValidator.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateFormat.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatter.java
diff --git a/java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
similarity index 100%
rename from java-dates-2/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/date/validation/DateValidatorUsingLocalDate.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/DateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/FormattedDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/RangedDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/regexp/datepattern/optmization/OptimizedMatcher.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplay.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayApp.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7.java
diff --git a/java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
similarity index 100%
rename from java-dates/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/timezonedisplay/TimezoneDisplayJava7App.java
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
similarity index 89%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
index fb92eb8d0d..90077795f0 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetDateTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
similarity index 89%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
index 58e2d4d5ad..e280d365c2 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/OffsetTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.OffsetTime;
import java.time.ZoneOffset;
diff --git a/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
similarity index 93%
rename from java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java
rename to core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
index b54b8c5225..a0dd304876 100644
--- a/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java
+++ b/core-java-modules/core-java-datetime-string/src/main/java/com/baeldung/zonedatetime/ZoneDateTimeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
diff --git a/java-dates/src/test/java/com/baeldung/date/StringToDateUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/StringToDateUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/date/StringToDateUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/StringToDateUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingApacheValidatorUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateFormatUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingDateTimeFormatterUnitTest.java
diff --git a/java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
similarity index 100%
rename from java-dates-2/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/date/validation/DateValidatorUsingLocalDateUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/datetime/DateTimeFormatterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/FormattedDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/RangedDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/February29thMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/FebruaryGeneralMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/GregorianDateMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf30DaysMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/MonthsOf31DaysMatcherUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/regexp/datepattern/gregorian/testhelper/GregorianDateTestHelper.java
diff --git a/java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/StringToTimestampConverterUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/timestamp/TimestampToStringConverterTest.java
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
index a08d3737cd..7634ff1572 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetDateTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
similarity index 93%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
index 488f934179..6134e48f70 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/OffsetTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
similarity index 96%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
index e78ff3e3fd..cc19055beb 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZoneDateTimeExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.Assert.assertTrue;
diff --git a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
similarity index 98%
rename from java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java
rename to core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
index 65f63bc787..150983c61b 100644
--- a/java-dates/src/test/java/com/baeldung/zoneddatetime/ZonedDateTimeUnitTest.java
+++ b/core-java-modules/core-java-datetime-string/src/test/java/com/baeldung/zonedatetime/ZonedDateTimeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.zoneddatetime;
+package com.baeldung.zonedatetime;
import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md
index 5338789a2f..ba327b06f2 100644
--- a/core-java-modules/core-java-exceptions/README.md
+++ b/core-java-modules/core-java-exceptions/README.md
@@ -1,3 +1,15 @@
-## Relevant articles:
+## Core Java Exceptions
+
+This module contains articles about core java exceptions
+
+### Relevant articles:
+- [Chained Exceptions in Java](https://www.baeldung.com/java-chained-exceptions)
+- [ClassNotFoundException vs NoClassDefFoundError](https://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
+- [Create a Custom Exception in Java](https://www.baeldung.com/java-new-custom-exception)
+- [Exception Handling in Java](https://www.baeldung.com/java-exceptions)
+- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
+- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
+- [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws)
+- [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error)
+- [Checked and Unchecked Exceptions in Java](https://www.baeldung.com/java-checked-unchecked-exceptions)
-- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch)
diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml
index 2e5200944a..da5ec76622 100644
--- a/core-java-modules/core-java-exceptions/pom.xml
+++ b/core-java-modules/core-java-exceptions/pom.xml
@@ -1,35 +1,46 @@
+
- 4.0.0
- com.baeldung.exception.numberformat
- core-java-exceptions
- 0.0.1-SNAPSHOT
- core-java-exceptions
+ 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">
+ com.baeldung.exceptions
+ 4.0.0
+ core-java-exceptions
+ 0.1.0-SNAPSHOT
+ core-java-exceptions
+ jar
-
- com.baeldung
- parent-java
- 0.0.1-SNAPSHOT
- ../../parent-java
-
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
-
-
- junit
- junit
- ${junit.version}
- test
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
+
+
+ javax.mail
+ mail
+ ${javax.mail.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
-
- 3.9
-
+
+ 1.5.0-b01
+
+ 3.10.0
+
-
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
deleted file mode 100644
index cf449110e6..0000000000
--- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.time.LocalDate;
-import java.time.Period;
-import java.time.format.DateTimeParseException;
-import java.util.Objects;
-
-/**
- * Utility class to find root cause exceptions.
- */
-public class RootCauseFinder {
-
- private RootCauseFinder() {
- }
-
- public static Throwable findCauseUsingPlainJava(Throwable throwable) {
- Objects.requireNonNull(throwable);
- Throwable rootCause = throwable;
- while (rootCause.getCause() != null && rootCause.getCause() != rootCause) {
- rootCause = rootCause.getCause();
- }
- return rootCause;
- }
-
- /**
- * Calculates the age of a person from a given date.
- */
- static class AgeCalculator {
-
- private AgeCalculator() {
- }
-
- public static int calculateAge(String birthDate) {
- if (birthDate == null || birthDate.isEmpty()) {
- throw new IllegalArgumentException();
- }
-
- try {
- return Period
- .between(parseDate(birthDate), LocalDate.now())
- .getYears();
- } catch (DateParseException ex) {
- throw new CalculationException(ex);
- }
- }
-
- private static LocalDate parseDate(String birthDateAsString) {
-
- LocalDate birthDate;
- try {
- birthDate = LocalDate.parse(birthDateAsString);
- } catch (DateTimeParseException ex) {
- throw new InvalidFormatException(birthDateAsString, ex);
- }
-
- if (birthDate.isAfter(LocalDate.now())) {
- throw new DateOutOfRangeException(birthDateAsString);
- }
-
- return birthDate;
- }
-
- }
-
- static class CalculationException extends RuntimeException {
-
- CalculationException(DateParseException ex) {
- super(ex);
- }
- }
-
- static class DateParseException extends RuntimeException {
-
- DateParseException(String input) {
- super(input);
- }
-
- DateParseException(String input, Throwable thr) {
- super(input, thr);
- }
- }
-
- static class InvalidFormatException extends DateParseException {
-
- InvalidFormatException(String input, Throwable thr) {
- super("Invalid date format: " + input, thr);
- }
- }
-
- static class DateOutOfRangeException extends DateParseException {
-
- DateOutOfRangeException(String date) {
- super("Date out of range: " + date);
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java
similarity index 73%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java
index 3d66c2b535..a2eae50108 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java
@@ -1,9 +1,9 @@
-package com.baeldung.chainedexception;
+package com.baeldung.exceptions.chainedexception;
-import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException;
-import com.baeldung.chainedexception.exceptions.ManagerUpsetException;
-import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException;
-import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException;
+import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException;
public class LogWithChain {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java
similarity index 75%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java
index 7556e30663..8c37db0307 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java
@@ -1,9 +1,9 @@
-package com.baeldung.chainedexception;
+package com.baeldung.exceptions.chainedexception;
-import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException;
-import com.baeldung.chainedexception.exceptions.ManagerUpsetException;
-import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException;
-import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException;
+import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException;
+import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException;
public class LogWithoutChain {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
similarity index 82%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
index e20c58ea5b..91537b58d4 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java
@@ -1,4 +1,4 @@
-package com.baeldung.chainedexception.exceptions;
+package com.baeldung.exceptions.chainedexception.exceptions;
public class GirlFriendOfManagerUpsetException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java
similarity index 80%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java
index e95a3921a4..351521a522 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java
@@ -1,4 +1,4 @@
-package com.baeldung.chainedexception.exceptions;
+package com.baeldung.exceptions.chainedexception.exceptions;
public class ManagerUpsetException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java
similarity index 80%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java
index b9521858b3..dd84baae74 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java
@@ -1,4 +1,4 @@
-package com.baeldung.chainedexception.exceptions;
+package com.baeldung.exceptions.chainedexception.exceptions;
public class NoLeaveGrantedException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java
similarity index 80%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java
index f874620f00..4ea8c3db7a 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java
@@ -1,4 +1,4 @@
-package com.baeldung.chainedexception.exceptions;
+package com.baeldung.exceptions.chainedexception.exceptions;
public class TeamLeadUpsetException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java
similarity index 96%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java
index b6f4d960aa..adc1b1613c 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java
@@ -1,4 +1,4 @@
-package com.baeldung.customexception;
+package com.baeldung.exceptions.customexception;
import java.io.File;
import java.io.FileNotFoundException;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java
similarity index 83%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java
index c6dc6d6964..4e8fece145 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java
@@ -1,4 +1,4 @@
-package com.baeldung.customexception;
+package com.baeldung.exceptions.customexception;
public class IncorrectFileExtensionException extends RuntimeException{
private static final long serialVersionUID = 1L;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java
similarity index 82%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java
index a804cadb84..f7f6a9dd8c 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java
@@ -1,4 +1,4 @@
-package com.baeldung.customexception;
+package com.baeldung.exceptions.customexception;
public class IncorrectFileNameException extends Exception {
private static final long serialVersionUID = 1L;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java
similarity index 99%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java
index 32d88cfd12..14483b3489 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
import java.io.File;
import java.io.FileNotFoundException;
diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java
new file mode 100644
index 0000000000..bc2c6baffb
--- /dev/null
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java
@@ -0,0 +1,5 @@
+package com.baeldung.exceptions.exceptionhandling;
+
+public class MyException extends Throwable {
+
+}
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java
similarity index 72%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java
index e866802fe3..1251cd58e6 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
public class Player {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java
similarity index 75%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java
index d92edeebbd..432232c23e 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
import java.io.IOException;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java
similarity index 71%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java
index 299370ee86..ba2a6d74e4 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
public class PlayerScoreException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java
similarity index 71%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java
index 0211284e5d..0f926ccf58 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
public class TimeoutException extends Exception {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java
similarity index 88%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java
index af0449c0da..9e5e7461ea 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java
@@ -1,4 +1,4 @@
-package com.baeldung.keywords.finalize;
+package com.baeldung.exceptions.keywords.finalize;
public class FinalizeObject {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java
index 8615c78652..b006850199 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java
@@ -1,4 +1,4 @@
-package com.baeldung.keywords.finalkeyword;
+package com.baeldung.exceptions.keywords.finalkeyword;
public final class Child extends Parent {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java
similarity index 56%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java
index 1530c5037f..f8adf27914 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java
@@ -1,4 +1,4 @@
-package com.baeldung.keywords.finalkeyword;
+package com.baeldung.exceptions.keywords.finalkeyword;
/*public class GrandChild extends Child {
// Compilation error
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java
similarity index 87%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java
index 5cd2996e7a..2a5d19a32f 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java
@@ -1,4 +1,4 @@
-package com.baeldung.keywords.finalkeyword;
+package com.baeldung.exceptions.keywords.finalkeyword;
public class Parent {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java
index 3c0aee3196..8f9d9a29d2 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.keywords.finallykeyword;
+package com.baeldung.exceptions.keywords.finallykeyword;
public class FinallyExample {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java
similarity index 55%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java
index b5b357a322..a82f430959 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java
@@ -1,4 +1,4 @@
-package com.baeldung.noclassdeffounderror;
+package com.baeldung.exceptions.noclassdeffounderror;
public class ClassWithInitErrors {
static int data = 1 / 0;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java
index 7bcefbdbd3..0dc74a9d01 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.noclassdeffounderror;
+package com.baeldung.exceptions.noclassdeffounderror;
public class NoClassDefFoundErrorExample {
public ClassWithInitErrors getClassWithInitErrors() {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java
similarity index 90%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java
index 88a8696053..06b587d0e0 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java
@@ -1,4 +1,4 @@
-package com.baeldung.sneakythrows;
+package com.baeldung.exceptions.sneakythrows;
import lombok.SneakyThrows;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java
similarity index 90%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java
index 847aaa7249..e86ef53733 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java
@@ -1,4 +1,4 @@
-package com.baeldung.sneakythrows;
+package com.baeldung.exceptions.sneakythrows;
import java.io.IOException;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java
similarity index 74%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java
index 91b8a3bbb0..5beac1cd04 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class AccountHolder {
private String firstName;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java
index 3b95fd1368..e290a1fe38 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class ClassOne {
private int oneValue;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java
index 0adf075b43..fc6a89e1fb 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class ClassTwo {
private int twoValue;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
index c67eeb30d1..858871cb9d 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class InfiniteRecursionWithTerminationCondition {
public int calculateFactorial(final int number) {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
index 8d10c65dcc..69b1c0b5ab 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class RecursionWithCorrectTerminationCondition {
public int calculateFactorial(final int number) {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java
similarity index 75%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java
index 0b7fb3cf94..c07fdcb01b 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
public class UnintendedInfiniteRecursion {
public int calculateFactorial(int number) {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java
index 0b371dcedb..448c8e2213 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
public class DataAccessException extends RuntimeException {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java
similarity index 95%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java
index 17fbf5a582..dfe8fcbd5a 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
import com.sun.mail.iap.ConnectionException;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java
similarity index 79%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java
index 7d8345c3c1..73453f4fc0 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
import java.sql.SQLException;
import java.util.List;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java
similarity index 90%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java
index 6bb8b90bf1..605d900633 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
import java.sql.SQLException;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java
similarity index 85%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java
index 2fd87f124d..f8a603f013 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java
+++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
import com.sun.mail.iap.ConnectionException;
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java
deleted file mode 100644
index 6dcd0d72e0..0000000000
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exception.error;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class ErrorGeneratorUnitTest {
-
- @Test(expected = AssertionError.class)
- public void whenError_thenIsNotCaughtByCatchException() {
- try {
- throw new AssertionError();
- } catch (Exception e) {
- Assert.fail(); // errors are not caught by catch exception
- }
- }
-
- @Test
- public void whenError_thenIsCaughtByCatchError() {
- try {
- throw new AssertionError();
- } catch (Error e) {
- // caught! -> test pass
- }
- }
-}
\ No newline at end of file
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java
deleted file mode 100644
index cb26bf451a..0000000000
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package com.baeldung.exception.numberformat;
-
-import static org.junit.Assert.assertEquals;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.text.NumberFormat;
-import java.text.ParseException;
-import java.util.Locale;
-import java.util.logging.Logger;
-
-import org.junit.Test;
-
-/**
- * A set of examples tested to show cases where NumberFormatException is thrown and not thrown.
- */
-public class NumberFormatExceptionUnitTest {
-
- Logger LOG = Logger.getLogger(NumberFormatExceptionUnitTest.class.getName());
-
- /* ---INTEGER FAIL CASES--- */
- @Test(expected = NumberFormatException.class)
- public void givenByteConstructor_whenAlphabetAsInput_thenFail() {
- Byte byteInt = new Byte("one");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenShortConstructor_whenSpaceInInput_thenFail() {
- Short shortInt = new Short("2 ");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenParseIntMethod_whenSpaceInInput_thenFail() {
- Integer aIntPrim = Integer.parseInt("6000 ");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenParseIntMethod_whenUnderscoreInInput_thenFail() {
- int bIntPrim = Integer.parseInt("_6000");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenIntegerValueOfMethod_whenCommaInInput_thenFail() {
- Integer cIntPrim = Integer.valueOf("6,000");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenBigIntegerConstructor_whenDecimalInInput_thenFail() {
- BigInteger bigInteger = new BigInteger("4.0");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenDecodeMethod_whenAlphabetInInput_thenFail() {
- Long decodedLong = Long.decode("64403L");
- }
-
- /* ---INTEGER PASS CASES--- */
- @Test
- public void givenInvalidNumberInputs_whenOptimized_thenPass() {
- Byte byteInt = new Byte("1");
- assertEquals(1, byteInt.intValue());
-
- Short shortInt = new Short("2 ".trim());
- assertEquals(2, shortInt.intValue());
-
- Integer aIntObj = Integer.valueOf("6");
- assertEquals(6, aIntObj.intValue());
-
- BigInteger bigInteger = new BigInteger("4");
- assertEquals(4, bigInteger.intValue());
-
- int aIntPrim = Integer.parseInt("6000 ".trim());
- assertEquals(6000, aIntPrim);
-
- int bIntPrim = Integer.parseInt("_6000".replaceAll("_", ""));
- assertEquals(6000, bIntPrim);
-
- int cIntPrim = Integer.parseInt("-6000");
- assertEquals(-6000, cIntPrim);
-
- Long decodeInteger = Long.decode("644032334");
- assertEquals(644032334L, decodeInteger.longValue());
- }
-
- /* ---DOUBLE FAIL CASES--- */
- @Test(expected = NumberFormatException.class)
- public void givenFloatConstructor_whenAlphabetInInput_thenFail() {
- Float floatDecimalObj = new Float("one.1");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenDoubleConstructor_whenAlphabetInInput_thenFail() {
- Double doubleDecimalObj = new Double("two.2");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenBigDecimalConstructor_whenSpecialCharsInInput_thenFail() {
- BigDecimal bigDecimalObj = new BigDecimal("3_0.3");
- }
-
- @Test(expected = NumberFormatException.class)
- public void givenParseDoubleMethod_whenCommaInInput_thenFail() {
- double aDoublePrim = Double.parseDouble("4000,1");
- }
-
- /* ---DOUBLE PASS CASES--- */
- @Test
- public void givenDoubleConstructor_whenDecimalInInput_thenPass() {
- Double doubleDecimalObj = new Double("2.2");
- assertEquals(2.2, doubleDecimalObj.doubleValue(), 0);
- }
-
- @Test
- public void givenDoubleValueOfMethod_whenMinusInInput_thenPass() {
- Double aDoubleObj = Double.valueOf("-6000");
- assertEquals(-6000, aDoubleObj.doubleValue(), 0);
- }
-
- @Test
- public void givenUsDecimalNumber_whenParsedWithNumberFormat_thenPass() throws ParseException {
- Number parsedNumber = parseNumberWithLocale("4000.1", Locale.US);
- assertEquals(4000.1, parsedNumber);
- assertEquals(4000.1, parsedNumber.doubleValue(), 0);
- assertEquals(4000, parsedNumber.intValue());
- }
-
- /**
- * In most European countries (for example, France), comma is used as decimal in place of period.
- * @throws ParseException if the input string contains special characters other than comma or decimal.
- * In this test case, anything after decimal (period) is dropped when a European locale is set.
- */
- @Test
- public void givenEuDecimalNumberHasComma_whenParsedWithNumberFormat_thenPass() throws ParseException {
- Number parsedNumber = parseNumberWithLocale("4000,1", Locale.FRANCE);
- LOG.info("Number parsed is: " + parsedNumber);
- assertEquals(4000.1, parsedNumber);
- assertEquals(4000.1, parsedNumber.doubleValue(), 0);
- assertEquals(4000, parsedNumber.intValue());
- }
-
- /**
- * Converts a string into a number retaining all decimals, and symbols valid in a locale.
- * @param number the input string for a number.
- * @param locale the locale to consider while parsing a number.
- * @return the generic number object which can represent multiple number types.
- * @throws ParseException when input contains invalid characters.
- */
- private Number parseNumberWithLocale(String number, Locale locale) throws ParseException {
- locale = locale == null ? Locale.getDefault() : locale;
- NumberFormat numberFormat = NumberFormat.getInstance(locale);
- return numberFormat.parse(number);
- }
-
-}
diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
deleted file mode 100644
index 5d0f3b9c3e..0000000000
--- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package com.baeldung.exceptions;
-
-import com.google.common.base.Throwables;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeParseException;
-import java.time.temporal.ChronoUnit;
-
-import static com.baeldung.exceptions.RootCauseFinder.*;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Tests the {@link RootCauseFinder}.
- */
-public class RootCauseFinderUnitTest {
-
- @Test
- public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {
- try {
- int age = AgeCalculator.calculateAge("1990-01-01");
- Assertions.assertEquals(1990, LocalDate
- .now()
- .minus(age, ChronoUnit.YEARS)
- .getYear());
- } catch (CalculationException e) {
- Assertions.fail(e.getMessage());
- }
- }
-
- @Test
- public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("010102");
- } catch (CalculationException ex) {
- assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
- }
- }
-
- @Test
- public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("2020-04-04");
- } catch (CalculationException ex) {
- assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
- }
- }
-
- @Test
- public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge(null);
- } catch (Exception ex) {
- assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
- }
- }
-
- @Test
- public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("010102");
- } catch (CalculationException ex) {
- assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException);
- }
- }
-
- @Test
- public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("2020-04-04");
- } catch (CalculationException ex) {
- assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException);
- }
- }
-
- @Test
- public void givenNullDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseNotFound() {
- try {
- AgeCalculator.calculateAge(null);
- } catch (Exception ex) {
- assertTrue(ExceptionUtils.getRootCause(ex) instanceof IllegalArgumentException);
- }
- }
-
- @Test
- public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("010102");
- } catch (CalculationException ex) {
- assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException);
- }
- }
-
- @Test
- public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge("2020-04-04");
- } catch (CalculationException ex) {
- assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException);
- }
- }
-
- @Test
- public void givenNullDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
- try {
- AgeCalculator.calculateAge(null);
- } catch (Exception ex) {
- assertTrue(Throwables.getRootCause(ex) instanceof IllegalArgumentException);
- }
- }
-
-}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
similarity index 84%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
index 59605fb1c9..9311a9d886 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.classnotfoundexception;
+package com.baeldung.exceptions.classnotfoundexception;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java
index 230698f719..80787daaaa 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.customexception;
+package com.baeldung.exceptions.customexception;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java
index acb05eb763..8e135c1cec 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.customexception;
+package com.baeldung.exceptions.customexception;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java
index 29c690133d..3551de3631 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.exceptionhandling;
+package com.baeldung.exceptions.exceptionhandling;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
similarity index 85%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
index 521c50098a..135a51f9dd 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.noclassdeffounderror;
+package com.baeldung.exceptions.noclassdeffounderror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java
similarity index 89%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java
index 8d8e4f14fe..086c4eaef0 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.sneakythrows;
+package com.baeldung.exceptions.sneakythrows;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java
similarity index 89%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java
index da1b2e617b..3b70128a9b 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.sneakythrows;
+package com.baeldung.exceptions.sneakythrows;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java
similarity index 82%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java
index 180b7723ac..dac8698bf8 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java
similarity index 81%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java
index 95164ac935..db6b1d45f8 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
similarity index 95%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
index ccf8c25271..2c7289cd5c 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
similarity index 89%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
index 40c2c4799e..e7fb0874ea 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
similarity index 94%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
index f4e2e5221a..0f1d71034d 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stackoverflowerror;
+package com.baeldung.exceptions.stackoverflowerror;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java
index b9a658a960..87f6224217 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java
+++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.throwsexception;
+package com.baeldung.exceptions.throwvsthrows;
import org.junit.jupiter.api.Test;
diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css b/core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension
similarity index 100%
rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css
rename to core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension
diff --git a/core-java-modules/core-java-function/README.md b/core-java-modules/core-java-function/README.md
new file mode 100644
index 0000000000..677f148bdb
--- /dev/null
+++ b/core-java-modules/core-java-function/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain)
\ 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
new file mode 100644
index 0000000000..22b2fd9bda
--- /dev/null
+++ b/core-java-modules/core-java-function/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ core-java-function
+ 0.1.0-SNAPSHOT
+ core-java-function
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-function
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+
+
diff --git a/maven/src/main/resources/logback.xml b/core-java-modules/core-java-function/src/main/resources/logback.xml
similarity index 100%
rename from maven/src/main/resources/logback.xml
rename to core-java-modules/core-java-function/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java
rename to core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java
diff --git a/core-java-modules/core-java-io-2/.gitignore b/core-java-modules/core-java-io-2/.gitignore
new file mode 100644
index 0000000000..de044ef20f
--- /dev/null
+++ b/core-java-modules/core-java-io-2/.gitignore
@@ -0,0 +1,3 @@
+# Intellij
+.idea/
+*.iml
diff --git a/core-java-modules/core-java-io-2/README.md b/core-java-modules/core-java-io-2/README.md
new file mode 100644
index 0000000000..2299320f32
--- /dev/null
+++ b/core-java-modules/core-java-io-2/README.md
@@ -0,0 +1,6 @@
+
+### Relevant Articles:
+
+- [Create a File in a Specific Directory in Java](https://www.baeldung.com/java-create-file-in-directory)
+- [A Guide to the Java FileReader Class](https://www.baeldung.com/java-filereader)
+
diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml
new file mode 100644
index 0000000000..64d9434beb
--- /dev/null
+++ b/core-java-modules/core-java-io-2/pom.xml
@@ -0,0 +1,279 @@
+
+ 4.0.0
+ core-java-io-2
+ 0.1.0-SNAPSHOT
+ core-java-io-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ net.sourceforge.collections
+ collections-generic
+ ${collections-generic.version}
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.apache.commons
+ commons-math3
+ ${commons-math3.version}
+
+
+ org.decimal4j
+ decimal4j
+ ${decimal4j.version}
+
+
+ org.bouncycastle
+ bcprov-jdk15on
+ ${bouncycastle.version}
+
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ ${jackson.version}
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ org.javamoney
+ moneta
+ ${moneta.version}
+
+
+ org.owasp.esapi
+ esapi
+ ${esapi.version}
+
+
+ com.sun.messaging.mq
+ fscontext
+ ${fscontext.version}
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator-annprocess.version}
+
+
+ org.hsqldb
+ hsqldb
+ ${hsqldb.version}
+ runtime
+
+
+
+ org.asynchttpclient
+ async-http-client
+ ${async-http-client.version}
+
+
+ com.opencsv
+ opencsv
+ ${opencsv.version}
+ test
+
+
+
+ org.apache.tika
+ tika-core
+ ${tika.version}
+
+
+ net.sf.jmimemagic
+ jmimemagic
+ ${jmime-magic.version}
+
+
+
+
+ core-java-io-2
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.55
+ 1.10
+ 3.6.1
+ 1.0.3
+ 4.1
+ 4.01
+ 0.4
+ 1.8.7
+ 4.6-b01
+ 1.13
+ 0.6.5
+ 0.9.0
+ 4.1
+
+ 3.6.1
+ 1.7.0
+
+
+ 3.0.0-M1
+ 2.4.0
+ 2.1.0.1
+ 1.19
+ 2.4.5
+
+ 1.18
+ 0.1.5
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java
new file mode 100644
index 0000000000..34a8f61615
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java
@@ -0,0 +1,57 @@
+package com.baeldung.filereader;
+
+import java.io.*;
+
+public class FileReaderExample {
+
+ public static String readAllCharactersOneByOne(Reader reader) throws IOException {
+ StringBuilder content = new StringBuilder();
+ int nextChar;
+ while ((nextChar = reader.read()) != -1) {
+ content.append((char) nextChar);
+ }
+ return String.valueOf(content);
+ }
+
+ public static String readMultipleCharacters(Reader reader, int length) throws IOException {
+ char[] buffer = new char[length];
+ int charactersRead = reader.read(buffer, 0, length);
+
+
+ if (charactersRead != -1) {
+ return new String(buffer, 0, charactersRead);
+ } else {
+ return "";
+ }
+ }
+
+ public static String readFile(String path) {
+ FileReader fileReader = null;
+ try {
+ fileReader = new FileReader(path);
+ return readAllCharactersOneByOne(fileReader);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (fileReader != null) {
+ try {
+ fileReader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return null;
+ }
+
+ public static String readFileUsingTryWithResources(String path) {
+ try (FileReader fileReader = new FileReader(path)) {
+ return readAllCharactersOneByOne(fileReader);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java
new file mode 100644
index 0000000000..338d53c597
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.createfiles;
+
+import com.google.common.io.Files;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class CreateFilesUnitTest {
+ @Test
+ public void givenAnExistingDirectory_whenCreatingAFileWithAbsolutePath_thenFileIsCreated() throws IOException {
+ File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
+ File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/myDirectory/testFile.txt");
+
+ assertFalse(fileWithAbsolutePath.exists());
+
+ Files.touch(fileWithAbsolutePath);
+
+ assertTrue(fileWithAbsolutePath.exists());
+ }
+
+ @Test
+ public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFileWithRelativePath_thenFileIsCreated() throws IOException {
+ File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
+ File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt");
+
+ assertFalse(fileWithRelativePath.exists());
+
+ Files.touch(fileWithRelativePath);
+
+ assertTrue(fileWithRelativePath.exists());
+ }
+
+ @Test
+ public void whenCreatingAFileWithFileSeparator_thenFileIsCreated() throws IOException {
+ File tempDirectory = new File(System.getProperty("java.io.tmpdir"));
+ File newFile = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile.txt");
+
+ assertFalse(newFile.exists());
+
+ Files.touch(newFile);
+
+ assertTrue(newFile.exists());
+ }
+}
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java
new file mode 100644
index 0000000000..b60a12d208
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java
@@ -0,0 +1,179 @@
+package com.baeldung.file;
+
+import org.junit.Test;
+
+import java.io.*;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+public class FileClassDemoUnitTest {
+
+ @Test
+ public void givenDirectoryCreated_whenMkdirIsInvoked_thenDirectoryIsDeleted() {
+ File directory = new File("testDirectory");
+ if (!directory.isDirectory() || !directory.exists()) {
+ directory.mkdir();
+ }
+
+ assertTrue(directory.delete());
+ }
+
+ @Test
+ public void givenFileCreated_whenCreateNewFileIsInvoked_thenFileIsDeleted() throws IOException {
+ File file = new File("testFile.txt");
+ if (!file.isFile() || !file.exists()) {
+ file.createNewFile();
+ }
+
+ assertTrue(file.delete());
+ }
+
+
+ @Test
+ public void givenFileCreated_whenCreateNewFileInvoked_thenMetadataIsAsExpected() throws IOException {
+
+ // different Operating systems have different separator characters
+ String separatorCharacter = System.getProperty("file.separator");
+
+ File parentDirectory = makeDirectory("filesDirectory");
+
+ File childFile = new File(parentDirectory, "file1.txt");
+ childFile.createNewFile();
+
+ assertTrue(childFile.getName().equals("file1.txt"));
+ assertTrue(childFile.getParentFile().getName().equals(parentDirectory.getName()));
+ assertTrue(childFile.getPath().equals(parentDirectory.getPath() + separatorCharacter + "file1.txt"));
+
+ removeDirectory(parentDirectory);
+ }
+
+
+ @Test(expected = FileNotFoundException.class)
+ public void givenReadOnlyFileCreated_whenCreateNewFileInvoked_thenFileCannotBeWrittenTo() throws IOException {
+ File parentDirectory = makeDirectory("filesDirectory");
+
+ File childFile = new File(parentDirectory, "file1.txt");
+ childFile.createNewFile();
+
+ childFile.setWritable(false);
+
+ FileOutputStream fos = new FileOutputStream(childFile);
+ fos.write("Hello World".getBytes()); // write operation
+ fos.flush();
+ fos.close();
+
+ removeDirectory(parentDirectory);
+ }
+
+ @Test(expected = FileNotFoundException.class)
+ public void givenWriteOnlyFileCreated_whenCreateNewFileInvoked_thenFileCannotBeReadFrom() throws IOException {
+ File parentDirectory = makeDirectory("filesDirectory");
+
+ File childFile = new File(parentDirectory, "file1.txt");
+ childFile.createNewFile();
+
+ childFile.setReadable(false);
+
+ FileInputStream fis = new FileInputStream(childFile);
+ fis.read(); // read operation
+ fis.close();
+
+ removeDirectory(parentDirectory);
+ }
+
+ @Test
+ public void givenFilesCreatedInDirectory_whenCreateNewFileInvoked_thenTheyCanBeListedAsExpected() throws IOException {
+ File directory = makeDirectory("filtersDirectory");
+
+ File csvFile = new File(directory, "csvFile.csv");
+ csvFile.createNewFile();
+
+ File txtFile = new File(directory, "txtFile.txt");
+ txtFile.createNewFile();
+
+ //normal listing
+ assertEquals(2, directory.list().length);
+
+ //filtered listing
+ FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv");
+ assertEquals(1, directory.list(csvFilter).length);
+
+ removeDirectory(directory);
+ }
+
+ @Test
+ public void givenDirectoryIsCreated_whenMkdirInvoked_thenDirectoryCanBeRenamed() {
+
+ File source = makeDirectory("source");
+ File destination = makeDirectory("destination");
+ source.renameTo(destination);
+
+ assertFalse(source.isDirectory());
+ assertTrue(destination.isDirectory());
+
+ removeDirectory(destination);
+ }
+
+ @Test
+ public void givenDataIsWrittenToFile_whenWriteIsInvoked_thenFreeSpaceOnSystemDecreases() throws IOException {
+
+ String name = System.getProperty("user.home") + System.getProperty("file.separator") + "test";
+ File testDir = makeDirectory(name);
+ File sample = new File(testDir, "sample.txt");
+
+ long freeSpaceBeforeWrite = testDir.getFreeSpace();
+ writeSampleDataToFile(sample);
+
+ long freeSpaceAfterWrite = testDir.getFreeSpace();
+ assertTrue(freeSpaceAfterWrite < freeSpaceBeforeWrite);
+
+ removeDirectory(testDir);
+ }
+
+ private static File makeDirectory(String directoryName) {
+ File directory = new File(directoryName);
+ directory.mkdir();
+ if (directory.isDirectory()) {
+ return directory;
+ }
+ throw new RuntimeException("Directory not created for " + directoryName);
+ }
+
+ private static void removeDirectory(File directory) {
+ // make sure you don't delete your home directory here
+ if (directory.getPath().equals(System.getProperty("user.home"))) {
+ return;
+ }
+
+ // remove directory and its files from system
+ if (directory != null && directory.exists()) {
+ // delete all files inside the directory
+ File[] filesInDirectory = directory.listFiles();
+ if (filesInDirectory != null) {
+ List files = Arrays.asList(filesInDirectory);
+ files.forEach(f -> deleteFile(f));
+ }
+
+ // finally delete the directory itself
+ deleteFile(directory);
+ }
+ }
+
+ private static void deleteFile(File fileToDelete) {
+ if (fileToDelete != null && fileToDelete.exists()) {
+ fileToDelete.delete();
+ }
+ }
+
+ private static void writeSampleDataToFile(File sample) throws IOException {
+ //write sample text to file
+ try (FileOutputStream out = new FileOutputStream(sample)) {
+ for (int i = 1; i <= 100000; i++) {
+ String sampleText = "Sample line number " + i + "\n";
+ out.write(sampleText.getBytes());
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java
new file mode 100644
index 0000000000..4f893fb327
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.filereader;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class FileReaderExampleUnitTest {
+
+
+ private static final String FILE_PATH = "src/test/resources/HelloWorld.txt";
+
+
+ @Test
+ public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException {
+ String expectedText = "Hello, World!";
+ File file = new File(FILE_PATH);
+ try (FileReader fileReader = new FileReader(file)) {
+ String content = FileReaderExample.readAllCharactersOneByOne(fileReader);
+ Assert.assertEquals(expectedText, content);
+ }
+ }
+
+ @Test
+ public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException {
+ String expectedText = "Hello";
+ File file = new File(FILE_PATH);
+ try (FileReader fileReader = new FileReader(file)) {
+ String content = FileReaderExample.readMultipleCharacters(fileReader, 5);
+ Assert.assertEquals(expectedText, content);
+ }
+ }
+
+ @Test
+ public void whenReadFile_thenReturnsContent() {
+ String expectedText = "Hello, World!";
+ String content = FileReaderExample.readFile(FILE_PATH);
+ Assert.assertEquals(expectedText, content);
+ }
+
+ @Test
+ public void whenReadFileUsingTryWithResources_thenReturnsContent() {
+ String expectedText = "Hello, World!";
+ String content = FileReaderExample.readFileUsingTryWithResources(FILE_PATH);
+ Assert.assertEquals(expectedText, content);
+ }
+
+}
diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java
new file mode 100644
index 0000000000..f94a73b023
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java
@@ -0,0 +1,47 @@
+package com.baeldung.filewriter;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class FileWriterExampleUnitTest {
+
+ @After
+ public void tearDown() throws IOException {
+ Files.delete(Path.of("src/test/resources/FileWriterTest.txt"));
+ }
+
+ @Test
+ public void testWriteString() throws IOException {
+ try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
+ fileWriter.write("Hello Folks!");
+ }
+ Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
+ }
+
+ @Test
+ public void testAppendString() throws IOException {
+ try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
+ fileWriter.write("Hello Folks!");
+ }
+ // using another try with resources to reopen the file in append mode
+ try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) {
+ fileWriter.write("Hello Folks Again!");
+ }
+
+ Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
+ }
+
+ @Test
+ public void testWriteCharArray() throws IOException {
+ try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) {
+ fileWriter.write("Hello Folks!".toCharArray());
+ }
+ Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt"))));
+ }
+}
diff --git a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt
new file mode 100644
index 0000000000..b45ef6fec8
--- /dev/null
+++ b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt
@@ -0,0 +1 @@
+Hello, World!
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/.gitignore b/core-java-modules/core-java-io-files/.gitignore
new file mode 100644
index 0000000000..c61d35324d
--- /dev/null
+++ b/core-java-modules/core-java-io-files/.gitignore
@@ -0,0 +1,5 @@
+0.*
+
+# Files generated by integration tests
+# *.txt
+/temp
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/README.md b/core-java-modules/core-java-io-files/README.md
new file mode 100644
index 0000000000..80c0dc941e
--- /dev/null
+++ b/core-java-modules/core-java-io-files/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java IO Files Cookbooks and Examples
+
+### Relevant Articles:
+- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
\ No newline at end of file
diff --git a/core-java-modules/core-java-io-files/pom.xml b/core-java-modules/core-java-io-files/pom.xml
new file mode 100644
index 0000000000..2aa6c7bf44
--- /dev/null
+++ b/core-java-modules/core-java-io-files/pom.xml
@@ -0,0 +1,132 @@
+
+ 4.0.0
+ core-java-io-files
+ 0.1.0-SNAPSHOT
+ core-java-io-files
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.hsqldb
+ hsqldb
+ ${hsqldb.version}
+ runtime
+
+
+
+
+ core-java-io-files
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ ${exec-maven-plugin.version}
+
+ java
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+ -Xmx300m
+ -XX:+UseParallelGC
+ -classpath
+
+ com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ com.baeldung.resource.MyResourceLoader
+
+
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.codehaus.mojo
+ exec-maven-plugin
+
+
+
+ run-benchmarks
+
+ none
+
+ exec
+
+
+ test
+ java
+
+ -classpath
+
+ org.openjdk.jmh.Main
+ .*
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.6.1
+
+
+ 3.0.0-M1
+ 2.4.0
+
+ 3.1.0
+
+
+
+
diff --git a/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java
new file mode 100644
index 0000000000..7512b177df
--- /dev/null
+++ b/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java
@@ -0,0 +1,42 @@
+package com.baeldung.resource;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.stream.Collectors;
+
+public class MyResourceLoader {
+
+ private void loadFileWithReader() throws IOException {
+
+ try (FileReader fileReader = new FileReader("src/main/resources/input.txt");
+ BufferedReader reader = new BufferedReader(fileReader)) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+
+ }
+
+ private void loadFileAsResource() throws IOException {
+
+ try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+
+ MyResourceLoader resourceLoader = new MyResourceLoader();
+
+ resourceLoader.loadFileAsResource();
+ resourceLoader.loadFileWithReader();
+
+ }
+
+}
diff --git a/core-java-modules/core-java-io-files/src/main/resources/input.txt b/core-java-modules/core-java-io-files/src/main/resources/input.txt
new file mode 100644
index 0000000000..650da894e8
--- /dev/null
+++ b/core-java-modules/core-java-io-files/src/main/resources/input.txt
@@ -0,0 +1,45 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
+
+Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien.
+
+Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla.
+
+Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis.
+
+Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis.
+
+Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et.
+
+Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor.
+
+Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui.
+
+Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices.
+
+Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas.
+
+Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus.
+
+Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque.
+
+Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla.
+
+Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non.
+
+Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam.
+
+Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in.
+
+Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat.
+
+Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi.
+
+Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex.
+
+Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor.
+
+Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue.
\ No newline at end of file
diff --git a/guava-collections/src/test/resources/.gitignore b/core-java-modules/core-java-io-files/src/test/resources/.gitignore
similarity index 100%
rename from guava-collections/src/test/resources/.gitignore
rename to core-java-modules/core-java-io-files/src/test/resources/.gitignore
diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md
index 6737ad6eb9..34b2f371e1 100644
--- a/core-java-modules/core-java-io/README.md
+++ b/core-java-modules/core-java-io/README.md
@@ -1,6 +1,6 @@
-=========
+## Core Java IO
-## Core Java IO Cookbooks and Examples
+This module contains articles about core Java input and output (IO)
### Relevant Articles:
- [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file)
@@ -41,3 +41,5 @@
- [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files)
- [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes)
- [Introduction to the Java NIO Selector](https://www.baeldung.com/java-nio-selector)
+- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened)
+- [[More -->]](/core-java-modules/core-java-io-2)
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
index 1a133d2cbe..3478f71286 100644
--- a/core-java-modules/core-java-io/pom.xml
+++ b/core-java-modules/core-java-io/pom.xml
@@ -14,76 +14,6 @@
-
-
- net.sourceforge.collections
- collections-generic
- ${collections-generic.version}
-
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
-
- org.decimal4j
- decimal4j
- ${decimal4j.version}
-
-
- org.bouncycastle
- bcprov-jdk15on
- ${bouncycastle.version}
-
-
- org.unix4j
- unix4j-command
- ${unix4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
-
- log4j
- log4j
- ${log4j.version}
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
@@ -91,57 +21,6 @@
${assertj.version}
test
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
-
- org.javamoney
- moneta
- ${moneta.version}
-
-
- org.owasp.esapi
- esapi
- ${esapi.version}
-
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator-annprocess.version}
-
org.hsqldb
hsqldb
@@ -171,6 +50,12 @@
jmimemagic
${jmime-magic.version}
+
+
+ com.sun.messaging.mq
+ fscontext
+ ${fscontext.version}
+
@@ -207,6 +92,21 @@
${maven.compiler.target}
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ ${maven-jar-plugin.version}
+
+
+
+ true
+ com.baeldung.resource.MyResourceLoader
+
+
+
+
@@ -248,32 +148,19 @@
- 1.55
- 1.10
- 3.6.1
- 1.0.3
- 4.1
- 4.01
- 0.4
- 1.8.7
- 4.6-b01
- 1.13
- 0.6.5
- 0.9.0
4.1
3.6.1
- 1.7.0
3.0.0-M1
2.4.0
- 2.1.0.1
- 1.19
2.4.5
1.18
0.1.5
+ 3.1.0
+ 4.4.2
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java
new file mode 100644
index 0000000000..7512b177df
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java
@@ -0,0 +1,42 @@
+package com.baeldung.resource;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.stream.Collectors;
+
+public class MyResourceLoader {
+
+ private void loadFileWithReader() throws IOException {
+
+ try (FileReader fileReader = new FileReader("src/main/resources/input.txt");
+ BufferedReader reader = new BufferedReader(fileReader)) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+
+ }
+
+ private void loadFileAsResource() throws IOException {
+
+ try (InputStream inputStream = getClass().getResourceAsStream("/input.txt");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
+ String contents = reader.lines()
+ .collect(Collectors.joining(System.lineSeparator()));
+ System.out.println(contents);
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+
+ MyResourceLoader resourceLoader = new MyResourceLoader();
+
+ resourceLoader.loadFileAsResource();
+ resourceLoader.loadFileWithReader();
+
+ }
+
+}
diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java
rename to core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
index e781489808..b837c6b4dd 100644
--- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java
+++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.file;
+package com.baeldung.readfile;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
diff --git a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java b/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java
rename to core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java
index 9ff95c4e16..bdc6b34b5c 100644
--- a/core-java-modules/core-java-io/src/test/java/org/baeldung/java/io/JavaWriteToFileUnitTest.java
+++ b/core-java-modules/core-java-io/src/test/java/org/baeldung/writetofile/JavaWriteToFileUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.io;
+package org.baeldung.writetofile;
import static org.junit.Assert.assertEquals;
diff --git a/core-java-modules/core-java-jndi/README.md b/core-java-modules/core-java-jndi/README.md
new file mode 100644
index 0000000000..d9fb324c9a
--- /dev/null
+++ b/core-java-modules/core-java-jndi/README.md
@@ -0,0 +1,4 @@
+
+### Relevant Articles:
+
+- [Java Naming and Directory Interface Overview](https://www.baeldung.com/jndi)
diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml
new file mode 100644
index 0000000000..7f621af21d
--- /dev/null
+++ b/core-java-modules/core-java-jndi/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+
+ com.baeldung.jndi
+ core-java-jndi
+ 1.0-SNAPSHOT
+ core-java-jndi
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+ ../../
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.5.1
+ test
+
+
+ org.springframework
+ spring-core
+ 5.0.9.RELEASE
+
+
+ org.springframework
+ spring-context
+ 5.0.9.RELEASE
+
+
+ org.springframework
+ spring-jdbc
+ 5.0.9.RELEASE
+
+
+ org.springframework
+ spring-test
+ 5.0.9.RELEASE
+ test
+
+
+ com.h2database
+ h2
+ 1.4.199
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
diff --git a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiUnitTest.java b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiUnitTest.java
new file mode 100644
index 0000000000..9eea420e7a
--- /dev/null
+++ b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/JndiUnitTest.java
@@ -0,0 +1,60 @@
+package com.baeldung.jndi;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.jndi.JndiTemplate;
+import org.springframework.mock.jndi.SimpleNamingContextBuilder;
+
+import javax.naming.*;
+import javax.sql.DataSource;
+
+import java.util.Enumeration;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class JndiUnitTest {
+
+ private static InitialContext ctx;
+ private static DriverManagerDataSource ds;
+
+ @BeforeAll
+ static void setUp() throws Exception {
+ SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
+ ds = new DriverManagerDataSource("jdbc:h2:mem:mydb");
+ builder.activate();
+
+ JndiTemplate jndiTemplate = new JndiTemplate();
+ ctx = (InitialContext) jndiTemplate.getContext();
+ }
+
+ @Test
+ void givenACompositeName_whenAddingAnElement_thenNameIncludesIt() throws Exception {
+ Name objectName = new CompositeName("java:comp/env/jdbc");
+
+ Enumeration elements = objectName.getAll();
+ while(elements.hasMoreElements()) {
+ System.out.println(elements.nextElement());
+ }
+
+ objectName.add("example");
+
+ assertEquals("env", objectName.get(1));
+ assertEquals("example", objectName.get(objectName.size() - 1));
+ }
+
+ @Test
+ void givenADataSource_whenAddingDriver_thenBind() throws Exception {
+ ds.setDriverClassName("org.h2.Driver");
+ ctx.bind("java:comp/env/jdbc/datasource", ds);
+ }
+
+ @Test
+ void givenContext_whenLookupByName_thenValidDataSource() throws Exception {
+ DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
+
+ assertNotNull(ds);
+ assertNotNull(ds.getConnection());
+ }
+
+}
diff --git a/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java
new file mode 100644
index 0000000000..49d4facffb
--- /dev/null
+++ b/core-java-modules/core-java-jndi/src/test/java/com/baeldung/jndi/exceptions/JndiExceptionsUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.jndi.exceptions;
+
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.springframework.jndi.JndiTemplate;
+import org.springframework.mock.jndi.SimpleNamingContextBuilder;
+
+import javax.naming.InitialContext;
+import javax.naming.NameNotFoundException;
+import javax.naming.NoInitialContextException;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public class JndiExceptionsUnitTest {
+
+ @Test
+ @Order(1)
+ void givenNoContext_whenLookupObject_thenThrowNoInitialContext() {
+ assertThrows(NoInitialContextException.class, () -> {
+ JndiTemplate jndiTemplate = new JndiTemplate();
+ InitialContext ctx = (InitialContext) jndiTemplate.getContext();
+ ctx.lookup("java:comp/env/jdbc/datasource");
+ }).printStackTrace();
+ }
+
+ @Test
+ @Order(2)
+ void givenEmptyContext_whenLookupNotBounds_thenThrowNameNotFound() {
+ assertThrows(NameNotFoundException.class, () -> {
+ SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
+ builder.activate();
+
+ JndiTemplate jndiTemplate = new JndiTemplate();
+ InitialContext ctx = (InitialContext) jndiTemplate.getContext();
+ ctx.lookup("badJndiName");
+ }).printStackTrace();
+ }
+
+}
diff --git a/core-java-modules/core-java-jpms/README.md b/core-java-modules/core-java-jpms/README.md
new file mode 100644
index 0000000000..5c424711bc
--- /dev/null
+++ b/core-java-modules/core-java-jpms/README.md
@@ -0,0 +1,3 @@
+### Relevant Articles
+
+- [Design Strategies for Decoupling Java Modules](https://www.baeldung.com/java-modules-decoupling-design-strategies)
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
index 757d9229df..09ca44d9be 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/consumermodule/pom.xml
@@ -3,7 +3,6 @@
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
-
com.baeldung.consumermodule
consumermodule
1.0
diff --git a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
index 4de3df8c01..861f06f089 100644
--- a/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
+++ b/core-java-modules/core-java-jpms/decoupling-pattern2/servicemodule/pom.xml
@@ -3,16 +3,16 @@
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
+ com.baeldung.servicemodule
+ servicemodule
+ 1.0
+
>com.baeldung.decoupling-pattern2
decoupling-pattern2
1.0-SNAPSHOT
- com.baeldung.servicemodule
- servicemodule
- 1.0
-
diff --git a/core-java-modules/core-java-jvm/README.md b/core-java-modules/core-java-jvm/README.md
index 82067ad952..89600ad924 100644
--- a/core-java-modules/core-java-jvm/README.md
+++ b/core-java-modules/core-java-jvm/README.md
@@ -1,6 +1,12 @@
-=========
-
## Core Java JVM Cookbooks and Examples
+This module contains articles about working with the Java Virtual Machine (JVM).
+
### Relevant Articles:
+
- [Method Inlining in the JVM](https://www.baeldung.com/jvm-method-inlining)
+- [JVM Log Forging](https://www.baeldung.com/jvm-log-forging)
+- [Guide to Java Instrumentation](https://www.baeldung.com/java-instrumentation)
+- [Class Loaders in Java](https://www.baeldung.com/java-classloaders)
+- [A Guide to System.exit()](https://www.baeldung.com/java-system-exit)
+- [Guide to System.gc()](https://www.baeldung.com/java-system-gc)
diff --git a/core-java-modules/core-java-jvm/pom.xml b/core-java-modules/core-java-jvm/pom.xml
index b1860322a6..74960820d7 100644
--- a/core-java-modules/core-java-jvm/pom.xml
+++ b/core-java-modules/core-java-jvm/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-jvm
0.1.0-SNAPSHOT
jar
@@ -32,9 +31,31 @@
${assertj.version}
test
+
+ org.javassist
+ javassist
+ ${javaassist.version}
+
+
+ org.owasp.esapi
+ esapi
+ ${esapi.version}
+
+
+ com.sun
+ tools
+ ${sun.tools.version}
+ system
+ ${java.home}/../lib/tools.jar
+
+
3.6.1
+
+ 3.21.0-GA
+ 2.1.0.1
+ 1.8.0
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/classloader/CustomClassLoader.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/CustomClassLoader.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/classloader/CustomClassLoader.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/CustomClassLoader.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/classloader/PrintClassLoader.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/classloader/PrintClassLoader.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/classloader/PrintClassLoader.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/agent/AtmTransformer.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/agent/MyInstrumentationAgent.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/AgentLoader.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/Launcher.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/Launcher.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/Launcher.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/MyAtm.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtm.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/MyAtm.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/instrumentation/application/MyAtmApplication.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/logforging/LogForgingDemo.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/logforging/LogForgingDemo.java
rename to core-java-modules/core-java-jvm/src/main/java/com/baeldung/logforging/LogForgingDemo.java
diff --git a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java
new file mode 100644
index 0000000000..8bca55c5f0
--- /dev/null
+++ b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java
@@ -0,0 +1,33 @@
+package com.baeldung.systemgc;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
+import static java.util.UUID.randomUUID;
+
+public class DemoApplication {
+
+ private static final Map cache = new HashMap();
+
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+
+ while (scanner.hasNext()) {
+ final String next = scanner.next();
+ if ("fill".equals(next)) {
+ for (int i = 0; i < 1000000; i++) {
+ cache.put(randomUUID().toString(), randomUUID().toString());
+ }
+ } else if ("invalidate".equals(next)) {
+ cache.clear();
+ } else if ("gc".equals(next)) {
+ System.gc();
+ } else if ("exit".equals(next)) {
+ System.exit(0);
+ } else {
+ System.out.println("unknown");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java/src/main/resources/ESAPI.properties b/core-java-modules/core-java-jvm/src/main/resources/ESAPI.properties
similarity index 100%
rename from core-java-modules/core-java/src/main/resources/ESAPI.properties
rename to core-java-modules/core-java-jvm/src/main/resources/ESAPI.properties
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/classloader/CustomClassLoaderUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/classloader/CustomClassLoaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/classloader/CustomClassLoaderUnitTest.java
rename to core-java-modules/core-java-jvm/src/test/java/com/baeldung/classloader/CustomClassLoaderUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/classloader/PrintClassLoaderUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/classloader/PrintClassLoaderUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/classloader/PrintClassLoaderUnitTest.java
rename to core-java-modules/core-java-jvm/src/test/java/com/baeldung/classloader/PrintClassLoaderUnitTest.java
diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md
index 10b876735e..832d4783f2 100644
--- a/core-java-modules/core-java-lambdas/README.md
+++ b/core-java-modules/core-java-lambdas/README.md
@@ -1,3 +1,9 @@
## Relevant articles:
- [Why Do Local Variables Used in Lambdas Have to Be Final or Effectively Final?](https://www.baeldung.com/java-lambda-effectively-final-local-variables)
+- [Java 8 – Powerful Comparison with Lambdas](http://www.baeldung.com/java-8-sort-lambda)
+- [Functional Interfaces in Java 8](http://www.baeldung.com/java-8-functional-interfaces)
+- [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips)
+- [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions)
+- [Method References in Java](https://www.baeldung.com/java-method-references)
+- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lambdas/pom.xml b/core-java-modules/core-java-lambdas/pom.xml
index d6158c2946..433db0a9ca 100644
--- a/core-java-modules/core-java-lambdas/pom.xml
+++ b/core-java-modules/core-java-lambdas/pom.xml
@@ -5,7 +5,7 @@
4.0.0
core-java-lambdas
0.1.0-SNAPSHOT
- core-java
+ core-java-lambdas
jar
@@ -15,5 +15,11 @@
../../parent-java
-
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
index 317808d893..ea274072ea 100644
--- a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
+++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java
@@ -1,10 +1,10 @@
package com.baeldung.doublecolon;
-import com.baeldung.doublecolon.function.ComputerPredicate;
-
import java.util.ArrayList;
import java.util.List;
+import com.baeldung.doublecolon.function.ComputerPredicate;
+
public class ComputerUtils {
static final ComputerPredicate after2010Predicate = (c) -> (c.getAge() > 2010);
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/entity/Human.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/entity/Human.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/entity/Human.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/entity/Human.java
diff --git a/core-java-modules/core-java-8/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
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappers.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/exceptions/ThrowingConsumer.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Bar.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Bar.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Bar.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Bar.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Baz.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Baz.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Baz.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Baz.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Foo.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Foo.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Foo.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Foo.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/FooExtended.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/FooExtended.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/FooExtended.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/FooExtended.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Processor.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Processor.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/Processor.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/Processor.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/ProcessorImpl.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/ProcessorImpl.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/ProcessorImpl.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/ProcessorImpl.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/UseFoo.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/UseFoo.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/java8/lambda/tips/UseFoo.java
rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/java8/lambda/tips/UseFoo.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/functionalinterface/FunctionalInterfaceUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/functionalinterface/ShortToByteFunction.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/Java8SortUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/exceptions/LambdaExceptionWrappersUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/Bicycle.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/BicycleComparator.java
diff --git a/core-java-modules/core-java-8/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
similarity index 96%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java
index 835815aecd..957294153b 100644
--- a/core-java-modules/core-java-8/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
@@ -35,9 +35,9 @@ public class MethodReferenceUnitTest {
public void referenceToInstanceMethodOfArbitratyObjectOfParticularType() {
List numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);
numbers.stream()
- .sorted((a, b) -> Integer.compare(a, b));
+ .sorted((a, b) -> a.compareTo(b));
numbers.stream()
- .sorted(Integer::compare);
+ .sorted(Integer::compareTo);
}
@Test
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/tips/Java8FunctionalInteracesLambdasUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/tips/Java8FunctionalInteracesLambdasUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/lambda/tips/Java8FunctionalInteracesLambdasUnitTest.java
rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/tips/Java8FunctionalInteracesLambdasUnitTest.java
diff --git a/core-java-modules/core-java-arrays/.gitignore b/core-java-modules/core-java-lang-2/.gitignore
similarity index 100%
rename from core-java-modules/core-java-arrays/.gitignore
rename to core-java-modules/core-java-lang-2/.gitignore
diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md
new file mode 100644
index 0000000000..ee57ec6198
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/README.md
@@ -0,0 +1,8 @@
+## Core Java Lang (Part 2)
+
+This module contains articles about core features in the Java language
+
+### Relevant Articles:
+- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects)
+- [Command-Line Arguments in Java](https://www.baeldung.com/java-command-line-arguments)
+- [[<-- Prev]](/core-java-modules/core-java-lang)
diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml
new file mode 100644
index 0000000000..22df5f7951
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/pom.xml
@@ -0,0 +1,49 @@
+
+ 4.0.0
+ core-java-lang-2
+ 0.1.0-SNAPSHOT
+ core-java-lang-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
+
+
+
+ core-java-lang-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.19
+ 1.19
+
+
+
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java
new file mode 100644
index 0000000000..d6a7dec8aa
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java
@@ -0,0 +1,12 @@
+package com.baeldung.commandlinearguments;
+
+public class CliExample {
+
+ public static void main(String[] args) {
+ System.out.println("Argument count: " + args.length);
+ for (int i = 0; i < args.length; i++) {
+ System.out.println("Argument " + i + ": " + args[i]);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java
new file mode 100644
index 0000000000..899e03416e
--- /dev/null
+++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java
@@ -0,0 +1,12 @@
+package com.baeldung.commandlinearguments;
+
+public class CliExampleWithVarargs {
+
+ public static void main(String... args) {
+ System.out.println("Argument count: " + args.length);
+ for (int i = 0; i < args.length; i++) {
+ System.out.println("Argument " + i + ": " + args[i]);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java
diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md
new file mode 100644
index 0000000000..b316ed1cfb
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/README.md
@@ -0,0 +1,8 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [Java 8 Math New Methods](https://www.baeldung.com/java-8-math)
+- [Java 8 Unsigned Arithmetic Support](https://www.baeldung.com/java-unsigned-arithmetic)
+- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
new file mode 100644
index 0000000000..f884aca3a9
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ core-java-lang-math
+ 0.1.0-SNAPSHOT
+ core-java-lang-math
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-lang-math
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+
+
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
rename to core-java-modules/core-java-lang-math/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java
diff --git a/spring-amqp-simple/src/main/resources/logback.xml b/core-java-modules/core-java-lang-math/src/main/resources/logback.xml
similarity index 100%
rename from spring-amqp-simple/src/main/resources/logback.xml
rename to core-java-modules/core-java-lang-math/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md
index 72c3c6742b..f387e8d4a2 100644
--- a/core-java-modules/core-java-lang-oop-2/README.md
+++ b/core-java-modules/core-java-lang-oop-2/README.md
@@ -1,9 +1,18 @@
-=========
+## Core Java Lang OOP (Part 2)
-## Core Java Lang OOP 2 Cookbooks and Examples
+This module contains articles about Object-oriented programming (OOP) in Java
### Relevant Articles:
- [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors)
- [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error)
- [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes)
- [Raw Types in Java](https://www.baeldung.com/raw-types-java)
+- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
+- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
+- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object)
+- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition)
+- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
+- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods)
+- [Java Copy Constructor](https://www.baeldung.com/java-copy-constructor)
+- [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3)
diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml
index 669a37b0f5..5bca2f0dbf 100644
--- a/core-java-modules/core-java-lang-oop-2/pom.xml
+++ b/core-java-modules/core-java-lang-oop-2/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-lang-oop-2
0.1.0-SNAPSHOT
core-java-lang-oop-2
@@ -14,6 +13,22 @@
../../parent-java
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+
core-java-lang-oop-2
@@ -24,4 +39,10 @@
+
+
+ 3.10.0
+ 3.0.3
+
+
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java
new file mode 100644
index 0000000000..7ad445e8ee
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java
@@ -0,0 +1,30 @@
+package com.baeldung.copyconstructor;
+
+import java.util.Date;
+
+public class Employee {
+
+ protected int id;
+ protected String name;
+ protected Date startDate;
+
+ public Employee(int id, String name, Date startDate) {
+ this.id = id;
+ this.name = name;
+ this.startDate = startDate;
+ }
+
+ public Employee(Employee employee) {
+ this.id = employee.id;
+ this.name = employee.name;
+ this.startDate = new Date(employee.startDate.getTime());
+ }
+
+ Date getStartDate() {
+ return startDate;
+ }
+
+ public Employee copy() {
+ return new Employee(this);
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java
new file mode 100644
index 0000000000..97b8580b8e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java
@@ -0,0 +1,31 @@
+package com.baeldung.copyconstructor;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class Manager extends Employee {
+
+ private List directReports;
+
+ public Manager(int id, String name, Date startDate, List directReports) {
+ super(id, name, startDate);
+ this.directReports = directReports;
+ }
+
+ public Manager(Manager manager) {
+ super(manager.id, manager.name, manager.startDate);
+ this.directReports = manager.directReports.stream()
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public Employee copy() {
+ return new Manager(this);
+ }
+
+ List getDirectReport() {
+ return this.directReports;
+ }
+
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 67%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
index 7761fdce56..fc6db9411c 100644
--- a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
+++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
@@ -1,12 +1,6 @@
package com.baeldung.inheritancecomposition.application;
-import com.baeldung.inheritancecomposition.model.Actress;
-import com.baeldung.inheritancecomposition.model.Computer;
-import com.baeldung.inheritancecomposition.model.StandardMemory;
-import com.baeldung.inheritancecomposition.model.Person;
-import com.baeldung.inheritancecomposition.model.StandardProcessor;
-import com.baeldung.inheritancecomposition.model.StandardSoundCard;
-import com.baeldung.inheritancecomposition.model.Waitress;
+import com.baeldung.inheritancecomposition.model.*;
public class Application {
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java
rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
index 66c8520e34..274fe77764 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
@@ -1,11 +1,9 @@
package com.baeldung.constructors;
-import com.google.common.collect.Comparators;
import org.junit.Test;
import java.time.LocalDateTime;
import java.time.Month;
-import java.util.ArrayList;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.*;
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
new file mode 100644
index 0000000000..19a4001b62
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.copyconstructor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.util.Date;
+
+import org.junit.Test;
+
+public class EmployeeUnitTest {
+ @Test
+ public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
+ Date d1 = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", d1);
+ Employee e2 = new Employee(e1);
+ assertEquals(d1, e1.getStartDate());
+ assertEquals(d1, e2.getStartDate());
+
+ d1.setTime(456);
+ assertEquals(d1, e1.getStartDate());
+ assertNotEquals(d1, e2.getStartDate());
+ }
+
+ @Test
+ public void givenCopyMethod_whenCopy_thenDistinct() {
+ Date d1 = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", d1);
+ Employee e2 = e1.copy();
+ assertEquals(d1, e1.getStartDate());
+ assertEquals(d1, e2.getStartDate());
+
+ d1.setTime(456);
+ assertEquals(d1, e1.getStartDate());
+ assertNotEquals(d1, e2.getStartDate());
+ }
+}
diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
new file mode 100644
index 0000000000..ef9f261360
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.copyconstructor;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Test;
+
+public class ManagerUnitTest {
+ @Test
+ public void givenCopyConstructor_whenDeepCopy_thenDistinct() {
+ Date startDate = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", startDate);
+ Employee e2 = new Employee(e1);
+ List directReports = new ArrayList();
+ directReports.add(e1);
+ directReports.add(e2);
+
+ Manager m1 = new Manager(1, "Baeldung Manager", startDate, directReports);
+ Manager m2 = new Manager(m1);
+ List directReports1 = m1.getDirectReport();
+ List directReports2 = m2.getDirectReport();
+ assertEquals(directReports1.size(), directReports2.size());
+ assertArrayEquals(directReports1.toArray(), directReports2.toArray());
+
+ // clear m1's direct reports list. m2's list should not be affected
+ directReports.clear();
+ directReports1 = m1.getDirectReport();
+ directReports2 = m2.getDirectReport();
+ assertEquals(0, directReports1.size());
+ assertEquals(2, directReports2.size());
+
+ }
+
+ @Test
+ public void givenCopyMethod_whenCopy_thenDistinct() {
+ Date startDate = new Date(123);
+ Employee e1 = new Employee(1, "Baeldung", startDate);
+ Employee e2 = new Employee(e1);
+ List directReports = new ArrayList();
+ directReports.add(e1);
+ directReports.add(e2);
+
+ // a Manager object whose declaration type is Employee.
+ Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);
+ Employee clone = source.copy();
+
+ // after copy, clone should be still a Manager object.
+ assertTrue(clone instanceof Manager);
+ List directReports1 = ((Manager) source).getDirectReport();
+ List directReports2 = ((Manager) clone).getDirectReport();
+ assertEquals(directReports1.size(), directReports2.size());
+ assertArrayEquals(directReports1.toArray(), directReports2.toArray());
+
+ // clear source's direct reports list. clone's list should not be affected
+ directReports.clear();
+ directReports1 = ((Manager) source).getDirectReport();
+ directReports2 = ((Manager) clone).getDirectReport();
+ assertEquals(0, directReports1.size());
+ assertEquals(2, directReports2.size());
+
+ }
+}
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
index 60584fdb53..8fc99e0e81 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
@@ -1,10 +1,10 @@
package com.baeldung.equalshashcode;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
-
import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
public class MoneyUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
index a2de408796..7dfc6d47a3 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
@@ -1,14 +1,13 @@
package com.baeldung.equalshashcode;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import nl.jqno.equalsverifier.EqualsVerifier;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
public class TeamUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
index 0cb4ace0ab..05b1e3e0b9 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
@@ -1,13 +1,11 @@
package com.baeldung.equalshashcode.entities;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.ComplexClass;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
public class ComplexClassUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 89%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
index a25e8bd486..7722ee7605 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
@@ -1,11 +1,9 @@
package com.baeldung.equalshashcode.entities;
-import java.awt.Color;
-
import org.junit.Assert;
import org.junit.Test;
-import com.baeldung.equalshashcode.entities.Square;
+import java.awt.*;
public class SquareClassUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
index 01dfeac050..7b917023ee 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.immutableobjects;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class ImmutableObjectsUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
similarity index 95%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
index 6dbf2302ae..e174ceceae 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Actress;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class ActressUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
similarity index 61%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
index 987af047a5..7699ecb4a7 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java
@@ -1,15 +1,12 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
-import com.baeldung.inheritancecomposition.model.Computer;
-import com.baeldung.inheritancecomposition.model.Memory;
-import com.baeldung.inheritancecomposition.model.Processor;
-import com.baeldung.inheritancecomposition.model.StandardMemory;
-import com.baeldung.inheritancecomposition.model.StandardProcessor;
-import com.baeldung.inheritancecomposition.model.StandardSoundCard;
-import java.util.Optional;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.baeldung.inheritancecomposition.model.*;
import org.junit.Test;
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
public class CompositionUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
similarity index 93%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
index 3ddbc19607..515e05528b 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java
@@ -1,11 +1,12 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Actress;
import com.baeldung.inheritancecomposition.model.Person;
import com.baeldung.inheritancecomposition.model.Waitress;
-import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
public class InheritanceUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
similarity index 94%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
index 313070b274..ea0b87f6e6 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Person;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class PersonUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
index c23fc4d403..816868be13 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.inheritancecomposition.test;
+package com.baeldung.inheritancecomposition;
import com.baeldung.inheritancecomposition.model.Waitress;
import org.junit.BeforeClass;
import org.junit.Test;
+
import static org.assertj.core.api.Assertions.*;
public class WaitressUnitTest {
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
index 81cd51ce51..64e5d8cdb1 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java
@@ -1,9 +1,9 @@
package com.baeldung.markerinterface;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
public class MarkerInterfaceUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md
new file mode 100644
index 0000000000..4ac6c3ffe9
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/README.md
@@ -0,0 +1,17 @@
+## Core Java Lang OOP (Part 3)
+
+This module contains articles about Object-oriented programming (OOP) in Java
+
+### Relevant Articles:
+- [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
+- [Access Modifiers in Java](https://www.baeldung.com/java-access-modifiers)
+- [Guide to the super Java Keyword](https://www.baeldung.com/java-super)
+- [Guide to the this Java Keyword](https://www.baeldung.com/java-this)
+- [Java Public Access Modifier](https://www.baeldung.com/java-public-keyword)
+- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association)
+- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes)
+- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces)
+- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
+- [Java Interfaces](https://www.baeldung.com/java-interfaces)
+- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
+- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-oop-3/pom.xml b/core-java-modules/core-java-lang-oop-3/pom.xml
new file mode 100644
index 0000000000..1caf17bef3
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/pom.xml
@@ -0,0 +1,57 @@
+
+ 4.0.0
+ core-java-lang-oop-3
+ 0.1.0-SNAPSHOT
+ core-java-lang-oop-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ log4j-over-slf4j
+ ${org.slf4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+ com.h2database
+ h2
+ ${h2.version}
+ test
+
+
+
+
+ core-java-lang-oop-3
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 3.10.0
+
+
+
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
new file mode 100644
index 0000000000..2ded0ba5d3
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java
@@ -0,0 +1,31 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+import java.util.AbstractList;
+import java.util.Arrays;
+
+public class ListOfThree extends AbstractList {
+
+ private static final int LENGTH = 3;
+ private Object[] elements;
+
+ public ListOfThree(E[] data) {
+ if(data == null
+ || data.length != LENGTH)
+ throw new IllegalArgumentException();
+
+ this.elements = Arrays.copyOf(data, data.length); //shallow copy
+
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public E get(int index) {
+ return (E)elements[index];
+ }
+
+ @Override
+ public int size() {
+ return LENGTH;
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
new file mode 100644
index 0000000000..5556e9aa57
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java
@@ -0,0 +1,7 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+public class SpecialCharacters {
+
+ public static final String SLASH = "/";
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
new file mode 100644
index 0000000000..83a0dcb30f
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java
@@ -0,0 +1,67 @@
+package com.baeldung.accessmodifiers.publicmodifier;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Date;
+
+public class Student {
+
+ private StudentGrade grade; //new data representation
+// private int grade; //old data representation
+ private String name;
+ private int age;
+
+ public void setGrade(int grade) {
+ this.grade = new StudentGrade(grade);
+ }
+
+ public int getGrade() {
+ return this.grade.getGrade().intValue(); //int is returned for backward compatibility
+ }
+
+ public Connection getConnection() throws SQLException {
+
+ final String URL = "jdbc:h2:~/test";
+ return DriverManager.getConnection(URL, "sa", "");
+
+ }
+
+ public void setAge(int age) {
+ if (age < 0 || age > 150) {
+ throw new IllegalArgumentException();
+ }
+
+ this.age = age;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+ private class StudentGrade {
+ private BigDecimal grade = BigDecimal.ZERO;
+ private Date updatedAt;
+
+ public StudentGrade(int grade) {
+ this.grade = new BigDecimal(grade);
+ this.updatedAt = new Date();
+ }
+
+ public BigDecimal getGrade() {
+ return grade;
+ }
+
+ public Date getDate() {
+ return updatedAt;
+ }
+
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java
new file mode 100644
index 0000000000..43bbf0dd62
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java
@@ -0,0 +1,37 @@
+package com.baeldung.basicmethods;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+public class PersonName {
+
+ public String getName(String firstName, String lastName) throws RuntimeException {
+ return firstName + " " + lastName;
+ }
+
+ public String getName(String firstName, String middleName, String lastName) {
+ if (!middleName.equals("")) {
+ return firstName + " " + lastName;
+ }
+ return firstName + " " + middleName + " " + lastName;
+ }
+
+ public void printFullName(String firstName, String lastName) {
+ System.out.println(firstName + " " + lastName);
+ }
+
+ public void writeName(String name) throws IOException {
+ PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt"));
+ out.println("Name: " + name);
+ out.close();
+ }
+
+ public static String getNameStatic(String firstName, String lastName) {
+ return firstName + " " + lastName;
+ }
+
+ public static void callToStaticMethod() {
+ System.out.println("Name is: " + PersonName.getNameStatic("Alan", "Turing"));
+ }
+}
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/Animal.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/Animal.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/Animal.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/AnimalActivity.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/AnimalActivity.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/AnimalActivity.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/Cat.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/Cat.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/binding/Cat.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/binding/Cat.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
index 29ed2d3d26..a815720d62 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/CommaSeparatedCustomers.java
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/CommaSeparatedCustomers.java
@@ -1,4 +1,4 @@
-package com.baeldung.interfaces;
+package com.baeldung.innerinterfaces;
import java.util.ArrayList;
import java.util.List;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/Customer.java
similarity index 88%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/Customer.java
index d2f2b48074..ce27460cbb 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Customer.java
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/innerinterfaces/Customer.java
@@ -1,4 +1,4 @@
-package com.baeldung.interfaces;
+package com.baeldung.innerinterfaces;
public class Customer {
public interface List {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Box.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Box.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Employee.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/Employee.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/HasColor.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/HasColor.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/objects/Car.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/objects/Car.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/objects/Car.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/objects/Car.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
similarity index 99%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
index 0e1746fc38..2c6ff3d683 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/NonPrimitives.java
@@ -17,7 +17,7 @@ public class NonPrimitives {
b1.num++;
}
}
-
+
class FooClass {
public int num;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/Primitives.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/parameterpassing/Primitives.java
rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/parameterpassing/Primitives.java
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java
new file mode 100644
index 0000000000..6be9a18781
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java
@@ -0,0 +1,9 @@
+package com.baeldung.relationships.aggregation;
+
+import java.util.List;
+
+public class Car {
+
+ private List wheels;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
new file mode 100644
index 0000000000..96c07f13a4
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java
@@ -0,0 +1,13 @@
+package com.baeldung.relationships.aggregation;
+
+import java.util.List;
+
+public class CarWithStaticInnerWheel {
+
+ private List wheels;
+
+ public static class Wheel {
+
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
new file mode 100644
index 0000000000..1f38ea85ad
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java
@@ -0,0 +1,7 @@
+package com.baeldung.relationships.aggregation;
+
+public class Wheel {
+
+ private Car car;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java
new file mode 100644
index 0000000000..4c748e8084
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java
@@ -0,0 +1,7 @@
+package com.baeldung.relationships.association;
+
+public class Child {
+
+ private Mother mother;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java
new file mode 100644
index 0000000000..0e8edef125
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java
@@ -0,0 +1,9 @@
+package com.baeldung.relationships.association;
+
+import java.util.List;
+
+public class Mother {
+
+ private List children;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java
new file mode 100644
index 0000000000..1ab44f73fa
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java
@@ -0,0 +1,18 @@
+package com.baeldung.relationships.composition;
+
+import java.util.List;
+
+public class Building {
+
+ private String address;
+ private List rooms;
+
+ public class Room {
+
+ public String getBuildingAddress() {
+ return Building.this.address;
+ }
+
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
new file mode 100644
index 0000000000..4e3411cf30
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java
@@ -0,0 +1,28 @@
+package com.baeldung.relationships.composition;
+
+public class BuildingWithDefinitionRoomInMethod {
+
+ public Room createAnonymousRoom() {
+ return new Room() {
+ @Override
+ public void doInRoom() {}
+ };
+ }
+
+ public Room createInlineRoom() {
+ class InlineRoom implements Room {
+ @Override
+ public void doInRoom() {}
+ }
+ return new InlineRoom();
+ }
+
+ public Room createLambdaRoom() {
+ return () -> {};
+ }
+
+ public interface Room {
+ void doInRoom();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java
new file mode 100644
index 0000000000..63cfd1b89e
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java
@@ -0,0 +1,9 @@
+package com.baeldung.relationships.university;
+
+import java.util.List;
+
+public class Department {
+
+ private List professors;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java
new file mode 100644
index 0000000000..8e1258c3e6
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java
@@ -0,0 +1,10 @@
+package com.baeldung.relationships.university;
+
+import java.util.List;
+
+public class Professor {
+
+ private List department;
+ private List friends;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java
new file mode 100644
index 0000000000..e5e518e0f1
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java
@@ -0,0 +1,9 @@
+package com.baeldung.relationships.university;
+
+import java.util.List;
+
+public class University {
+
+ private List department;
+
+}
diff --git a/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
new file mode 100644
index 0000000000..ed8fb4f45a
--- /dev/null
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.accessmodifiers;
+
+import com.baeldung.accessmodifiers.publicmodifier.ListOfThree;
+import com.baeldung.accessmodifiers.publicmodifier.Student;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
+import org.junit.jupiter.api.TestInstance.Lifecycle;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@TestInstance(Lifecycle.PER_CLASS)
+public class PublicAccessModifierUnitTest {
+
+ @Test
+ public void whenUsingBigDecimalIntValueMethod_correspondingIntIsReturned() {
+ assertEquals(0, new BigDecimal(0).intValue()); //instance member
+ }
+
+ @Test
+ public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() {
+ assertEquals(2147483647, Integer.MAX_VALUE); //static field
+ }
+
+ @Test
+ public void whenChangingStudentInternalRepresentation_clientCodeWillNotBreak() {
+
+ Student student = new Student();
+ student.setGrade(100);
+
+ assertEquals(100, student.getGrade());
+ }
+
+ @Test
+ public void whenUsingEntrySet_keyValuePairsAreReturned() {
+
+ Map mapObject = new HashMap();
+ mapObject.put("name", "Alex");
+
+ for(Map.Entry entry : mapObject.entrySet()) {
+ assertEquals("name", entry.getKey());
+ assertEquals("Alex", entry.getValue());
+ }
+
+ }
+
+ @Test
+ public void whenUsingStringToLowerCase_stringTurnsToLowerCase() {
+ assertEquals("alex", "ALEX".toLowerCase());
+ }
+
+ @Test
+ public void whenParsingStringOne_parseIntReturns1() {
+ assertEquals(1, Integer.parseInt("1"));
+ }
+
+ @Test
+ public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException {
+
+ final String url = "jdbc:h2:~/test";
+ Connection conn = DriverManager.getConnection(url, "sa", "");
+ assertNotNull(conn);
+ }
+
+ @Test
+ public void whenCreatingCustomList_concreteAndInheritedMethodsWork() {
+
+ String[] dataSet1 = new String[] {"zero", "one", "two"};
+
+ List list1 = new ListOfThree(dataSet1);
+
+ //our implemented methods
+ assertEquals("one", list1.get(1));
+ assertEquals(3, list1.size());
+
+ //inherited implementations
+ assertEquals(1, list1.indexOf("one"));
+
+ String[] dataSet2 = new String[] {"two", "zero", "one"};
+ List list2 = new ListOfThree(dataSet2);
+
+ assertTrue(list1.containsAll(list2));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/AnimalActivityUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/AnimalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/AnimalUnitTest.java
index a34640b58a..11201965d9 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/AnimalUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/AnimalUnitTest.java
@@ -14,13 +14,13 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.slf4j.LoggerFactory;
+import java.util.List;
+
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import java.util.List;
-
/**
* Created by madhumita.g on 01-08-2018.
*/
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/CatUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/binding/CatUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/binding/CatUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
index 65d7c860a8..65e51ed93d 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/interfaces/InnerInterfaceUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/innerinterfaces/InnerInterfaceUnitTest.java
@@ -1,11 +1,13 @@
-package com.baeldung.interfaces;
-
-import static org.junit.Assert.assertEquals;
+package com.baeldung.innerinterfaces;
+import com.baeldung.innerinterfaces.CommaSeparatedCustomers;
+import com.baeldung.innerinterfaces.Customer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import static org.junit.Assert.assertEquals;
+
@RunWith(JUnit4.class)
public class InnerInterfaceUnitTest {
@Test
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/AnonymousInner.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Enclosing.java
similarity index 81%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Enclosing.java
index 3db33cde9b..a7c0e1b29f 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Enclosing.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Enclosing.java
@@ -15,7 +15,7 @@ public class Enclosing {
@Test
public void test() {
- Enclosing.StaticNested nested = new Enclosing.StaticNested();
+ StaticNested nested = new StaticNested();
nested.run();
}
}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewEnclosing.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewOuter.java
similarity index 91%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewOuter.java
index 260f69fd1b..37c8be7817 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/NewOuter.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/NewOuter.java
@@ -23,7 +23,7 @@ public class NewOuter {
@Test
public void test() {
NewOuter outer = new NewOuter();
- NewOuter.InnerClass inner = outer.new InnerClass();
+ InnerClass inner = outer.new InnerClass();
inner.run();
}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Outer.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Outer.java
index d5e46670c9..196cd6cd38 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nestedclass/Outer.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/nestedclass/Outer.java
@@ -14,7 +14,7 @@ public class Outer {
@Test
public void test() {
Outer outer = new Outer();
- Outer.Inner inner = outer.new Inner();
+ Inner inner = outer.new Inner();
inner.run();
}
}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
index a1ef20523e..e0f8766be4 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/objects/CarUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/objects/ObjectsUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.objects;
-import static org.junit.Assert.*;
-
import org.junit.Before;
import org.junit.Test;
-public class CarUnitTest {
+import static org.junit.Assert.*;
+
+public class ObjectsUnitTest {
private Car car;
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 99%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
index 62f891d11b..bf0d12936d 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
+++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
@@ -27,7 +27,7 @@ public class NonPrimitivesUnitTest {
b1.num++;
}
}
-
+
class Foo {
public int num;
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md
index c9ee9a9e94..0fb044138d 100644
--- a/core-java-modules/core-java-lang-oop/README.md
+++ b/core-java-modules/core-java-lang-oop/README.md
@@ -1,24 +1,16 @@
-=========
+## Core Java Lang OOP
-## Core Java Lang OOP Cookbooks and Examples
+This module contains articles about Object-oriented programming (OOP) in Java
### Relevant Articles:
-- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode)
-- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
-- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
-- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override)
-- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy)
-- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance)
-- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting)
-- [The “final” Keyword in Java](http://www.baeldung.com/java-final)
-- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
-- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference)
-- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding)
-- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers)
-- [Guide to the super Java Keyword](http://www.baeldung.com/java-super)
-- [Guide to the this Java Keyword](http://www.baeldung.com/java-this)
-- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object)
-- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition)
-- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors)
-- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
-- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces)
+- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode)
+- [A Guide to the Static Keyword in Java](https://www.baeldung.com/java-static)
+- [Polymorphism in Java](https://www.baeldung.com/java-polymorphism)
+- [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override)
+- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy)
+- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance)
+- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting)
+- [The “final” Keyword in Java](https://www.baeldung.com/java-final)
+- [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure)
+- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding)
+- [[More -->]](/core-java-modules/core-java-lang-oop-2)
diff --git a/core-java-modules/core-java-lang-oop/pom.xml b/core-java-modules/core-java-lang-oop/pom.xml
index 46003b132b..bdd9857dfa 100644
--- a/core-java-modules/core-java-lang-oop/pom.xml
+++ b/core-java-modules/core-java-lang-oop/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-lang-oop
0.1.0-SNAPSHOT
core-java-lang-oop
@@ -32,23 +31,6 @@
gson
${gson.version}
-
-
- log4j
- log4j
- ${log4j.version}
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
@@ -56,12 +38,6 @@
${assertj-core.version}
test
-
- nl.jqno.equalsverifier
- equalsverifier
- ${equalsverifier.version}
- test
-
@@ -78,7 +54,6 @@
2.8.2
3.10.0
- 3.0.3
diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
index d6b1cd90b9..d60ab155dc 100644
--- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
+++ b/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
@@ -25,7 +25,7 @@ public class DeepCopyUnitTest {
}
@Test
- public void whenModifyingOriginalObject_thenConstructorCopyShouldNotChange() {
+ public void whenModifyingOriginalObject_thenCopyShouldNotChange() {
Address address = new Address("Downing St 10", "London", "England");
User pm = new User("Prime", "Minister", address);
User deepCopy = new User(pm);
@@ -125,4 +125,13 @@ public class DeepCopyUnitTest {
end = System.currentTimeMillis();
System.out.println("Cloning with Jackson took " + (end - start) + " milliseconds.");
}
+
+ @Test
+ public void whenModifyingOriginalObject_ThenCopyShouldChange() {
+ Address address = new Address("Downing St 10", "London", "England");
+ User pm = new User("Prime", "Minister", address);
+ User shallowCopy = new User(pm.getFirstName(), pm.getLastName(), pm.getAddress());
+ address.setCountry("Great Britain");
+ assertThat(shallowCopy.getAddress().getCountry()).isEqualTo(pm.getAddress().getCountry());
+ }
}
diff --git a/core-java-modules/core-java-lang-operators/README.md b/core-java-modules/core-java-lang-operators/README.md
new file mode 100644
index 0000000000..c4f5049d61
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/README.md
@@ -0,0 +1,9 @@
+## Relevant Articles:
+- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator)
+- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
+- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
+- [Java instanceof Operator](https://www.baeldung.com/java-instanceof)
+- [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators)
+- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
+- [The XOR Operator in Java](https://www.baeldung.com/java-xor-operator)
+
diff --git a/core-java-modules/core-java-lang-operators/pom.xml b/core-java-modules/core-java-lang-operators/pom.xml
new file mode 100644
index 0000000000..81865552dd
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/pom.xml
@@ -0,0 +1,42 @@
+
+ 4.0.0
+ core-java-lang-operators
+ 0.1.0-SNAPSHOT
+ core-java-lang-operators
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj-core.version}
+ test
+
+
+
+
+ core-java-lang-operators
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.10.0
+
+
+
diff --git a/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java
new file mode 100644
index 0000000000..37fb139917
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java
@@ -0,0 +1,36 @@
+package com.baeldung.booleanoperators;
+
+public class Car {
+
+ private boolean diesel;
+ private boolean manual;
+
+ public Car(boolean diesel, boolean manual) {
+ this.diesel = diesel;
+ this.manual = manual;
+ }
+
+ public boolean isDiesel() {
+ return diesel;
+ }
+
+ public boolean isManual() {
+ return manual;
+ }
+
+ static Car dieselAndManualCar() {
+ return new Car(true, true);
+ }
+
+ static Car dieselAndAutomaticCar() {
+ return new Car(true, false);
+ }
+
+ static Car oilAndManualCar() {
+ return new Car(false, true);
+ }
+
+ static Car oilAndAutomaticCar() {
+ return new Car(false, false);
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Circle.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Circle.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Circle.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Circle.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Ring.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Ring.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Ring.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Ring.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Round.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Round.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Round.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Round.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Shape.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Shape.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Shape.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Shape.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Triangle.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Triangle.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/keyword/Triangle.java
rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/keyword/Triangle.java
diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java
new file mode 100644
index 0000000000..efe38c6f45
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java
@@ -0,0 +1,69 @@
+package com.baeldung.booleanoperators;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class XorUnitTest {
+
+ @Test
+ void givenDieselManualCar_whenXorOldSchool_thenFalse() {
+ Car car = Car.dieselAndManualCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselAutomaticCar_whenXorOldSchool_thenTrue() {
+ Car car = Car.dieselAndAutomaticCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselManualCar_whenXorOldSchool_thenTrue() {
+ Car car = Car.oilAndManualCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselAutomaticCar_whenXorOldSchool_thenFalse() {
+ Car car = Car.oilAndAutomaticCar();
+ boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual());
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselManualCar_whenXor_thenFalse() {
+ Car car = Car.dieselAndManualCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenDieselAutomaticCar_whenXor_thenTrue() {
+ Car car = Car.dieselAndAutomaticCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselManualCar_whenXor_thenTrue() {
+ Car car = Car.oilAndManualCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isTrue();
+ }
+
+ @Test
+ void givenNonDieselAutomaticCar_whenXor_thenFalse() {
+ Car car = Car.oilAndAutomaticCar();
+ boolean dieselXorManual = car.isDiesel() ^ car.isManual();
+ assertThat(dieselXorManual).isFalse();
+ }
+
+ @Test
+ void givenNumbersOneAndThree_whenXor_thenTwo() {
+ assertThat(1 ^ 3).isEqualTo(2);
+ }
+}
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java
similarity index 62%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java
index a680c4e670..7fa52a5eb1 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.diamond;
+package com.baeldung.diamondoperator;
public class Car implements Vehicle {
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java
similarity index 87%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java
index ee5f639926..b50119b3c6 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.diamond;
+package com.baeldung.diamondoperator;
import static org.junit.Assert.assertNotNull;
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java
similarity index 76%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java
index 90eb7d9340..0b92d11318 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.diamond;
+package com.baeldung.diamondoperator;
public class Diesel implements Engine {
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java
similarity index 54%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java
index 746baf3254..0afd48114a 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.diamond;
+package com.baeldung.diamondoperator;
public interface Engine {
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java
similarity index 56%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java
index 8395cdd970..89a5dfefef 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.diamond;
+package com.baeldung.diamondoperator;
public interface Vehicle {
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
similarity index 97%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
index 6966fa3944..0e082b69d3 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.keyword.test;
+package com.baeldung.keyword;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/unaryoperators/IncrementDecrementUnaryOperatorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/unaryoperators/IncrementDecrementUnaryOperatorUnitTest.java
new file mode 100644
index 0000000000..cb0f896ec0
--- /dev/null
+++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/unaryoperators/IncrementDecrementUnaryOperatorUnitTest.java
@@ -0,0 +1,64 @@
+package com.baeldung.unaryoperators;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class IncrementDecrementUnaryOperatorUnitTest {
+
+ @Test
+ public void givenAnOperand_whenUsingPreIncrementUnaryOperator_thenOperandIsIncrementedByOne() {
+ int operand = 1;
+ ++operand;
+ assertThat(operand).isEqualTo(2);
+ }
+
+ @Test
+ public void givenANumber_whenUsingPreIncrementUnaryOperatorInEvaluation_thenNumberIsIncrementedByOne() {
+ int operand = 1;
+ int number = ++operand;
+ assertThat(number).isEqualTo(2);
+ }
+
+ @Test
+ public void givenAnOperand_whenUsingPreDecrementUnaryOperator_thenOperandIsDecrementedByOne() {
+ int operand = 1;
+ --operand;
+ assertThat(operand).isEqualTo(0);
+ }
+
+ @Test
+ public void givenANumber_whenUsingPreDecrementUnaryOperatorInEvaluation_thenNumberIsDecrementedByOne() {
+ int operand = 1;
+ int number = --operand;
+ assertThat(number).isEqualTo(0);
+ }
+
+ @Test
+ public void givenAnOperand_whenUsingPostIncrementUnaryOperator_thenOperandIsIncrementedByOne() {
+ int operand = 1;
+ operand++;
+ assertThat(operand).isEqualTo(2);
+ }
+
+ @Test
+ public void givenANumber_whenUsingPostIncrementUnaryOperatorInEvaluation_thenNumberIsSameAsOldValue() {
+ int operand = 1;
+ int number = operand++;
+ assertThat(number).isEqualTo(1);
+ }
+
+ @Test
+ public void givenAnOperand_whenUsingPostDecrementUnaryOperator_thenOperandIsDecrementedByOne() {
+ int operand = 1;
+ operand--;
+ assertThat(operand).isEqualTo(0);
+ }
+
+ @Test
+ public void givenANumber_whenUsingPostDecrementUnaryOperatorInEvaluation_thenNumberIsSameAsOldValue() {
+ int operand = 1;
+ int number = operand--;
+ assertThat(number).isEqualTo(1);
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/README.md b/core-java-modules/core-java-lang-syntax-2/README.md
new file mode 100644
index 0000000000..a3b11865af
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/README.md
@@ -0,0 +1,14 @@
+## Core Java Lang Syntax
+
+This module contains articles about Java syntax
+
+### Relevant Articles:
+
+- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword)
+- [Guide to Java Packages](https://www.baeldung.com/java-packages)
+- [If-Else Statement in Java](https://www.baeldung.com/java-if-else)
+- [Control Structures in Java](https://www.baeldung.com/java-control-structures)
+- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization)
+- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native)
+- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope)
+- [[<-- Prev]](/core-java-modules/core-java-lang-syntax)
diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml
new file mode 100644
index 0000000000..98eea99fc0
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+ core-java-lang-syntax-2
+ 0.1.0-SNAPSHOT
+ core-java-lang-syntax-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ core-java-lang-syntax-2
+
+
+ src/main/resources
+ true
+
+
+
+
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java
similarity index 97%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java
index bace609699..e15386f048 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java
@@ -1,4 +1,4 @@
-package com.baeldung.controlstructures;
+package com.baeldung.core.controlstructures;
public class ConditionalBranches {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java
similarity index 99%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java
index bc4515bfc7..9d73127cae 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java
@@ -1,4 +1,4 @@
-package com.baeldung.controlstructures;
+package com.baeldung.core.controlstructures;
public class Loops {
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java
new file mode 100644
index 0000000000..a80387d61a
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/FirstClass.java
@@ -0,0 +1,18 @@
+package com.baeldung.core.modifiers;
+
+public class FirstClass {
+
+ protected String name;
+
+ protected FirstClass(String name) {
+ this.name = name;
+ }
+
+ protected String getName() {
+ return name;
+ }
+
+ protected static class InnerClass {
+ public InnerClass() {}
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java
new file mode 100644
index 0000000000..83381931d0
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/GenericClass.java
@@ -0,0 +1,15 @@
+package com.baeldung.core.modifiers;
+
+public class GenericClass {
+
+ public static void main(String[] args) {
+ // accessing protected constructor
+ FirstClass first = new FirstClass("random name");
+ // using protected method
+ System.out.println("FirstClass name is " + first.getName());
+ // accessing a protected field
+ first.name = "new name";
+ // instantiating protected inner class
+ FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java
new file mode 100644
index 0000000000..528f97539a
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondClass.java
@@ -0,0 +1,18 @@
+package com.baeldung.core.modifiers.otherpackage;
+
+import com.baeldung.core.modifiers.FirstClass;
+
+public class SecondClass extends FirstClass {
+
+ public SecondClass(String name) {
+ // accessing protected constructor
+ super(name);
+ // using protected method
+ System.out.println("SecondClass name is " + this.getName());
+ // accessing a protected field
+ this.name = "new name";
+ // instantiating protected inner class -> add public constructor to InnerClass
+ FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java
new file mode 100644
index 0000000000..d29533edef
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/otherpackage/SecondGenericClass.java
@@ -0,0 +1,20 @@
+package com.baeldung.core.modifiers.otherpackage;
+
+import com.baeldung.core.modifiers.FirstClass;
+//import com.baeldung.core.modifiers.FirstClass.InnerClass;
+
+public class SecondGenericClass {
+
+ // uncomment the following lines to see the errors
+ public static void main(String[] args) {
+ // accessing protected constructor
+ // FirstClass first = new FirstClass("random name");
+ // using protected method
+ // System.out.println("FirstClass name is " + first.getName());
+ // accessing a protected field
+ // first.name = "new name";
+ // instantiating protected inner class
+ // FirstClass.InnerClass innerClass = new FirstClass.InnerClass();
+ }
+
+}
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java
similarity index 78%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java
index 0762b0eb8a..1d101719ca 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java
@@ -1,4 +1,4 @@
-package com.baeldung.nativekeyword;
+package com.baeldung.core.nativekeyword;
public class DateTimeUtils {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java
similarity index 74%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java
index 76fe548ed3..4bf6b88840 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java
@@ -1,6 +1,4 @@
-package com.baeldung.nativekeyword;
-
-import com.baeldung.nativekeyword.DateTimeUtils;
+package com.baeldung.core.nativekeyword;
public class NativeMainApp {
public static void main(String[] args) {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java
index 0f4a56f708..d8283f6b0d 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java
@@ -1,9 +1,9 @@
-package com.baeldung.packages;
+package com.baeldung.core.packages;
+
+import com.baeldung.core.packages.domain.TodoItem;
import java.time.LocalDate;
-import com.baeldung.packages.domain.TodoItem;
-
public class TodoApp {
public static void main(String[] args) {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java
similarity index 84%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java
index 6ed6cd4ec1..f9f6ac3aca 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java
@@ -1,10 +1,10 @@
-package com.baeldung.packages;
+package com.baeldung.core.packages;
+
+import com.baeldung.core.packages.domain.TodoItem;
import java.util.ArrayList;
import java.util.List;
-import com.baeldung.packages.domain.TodoItem;
-
public class TodoList {
private List todoItems;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java
similarity index 94%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java
index 972e574a7f..195f763974 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java
@@ -1,4 +1,4 @@
-package com.baeldung.packages.domain;
+package com.baeldung.core.packages.domain;
import java.time.LocalDate;
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java
new file mode 100644
index 0000000000..4598400e93
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java
@@ -0,0 +1,59 @@
+package com.baeldung.core.privatemodifier;
+
+public class Employee {
+
+ private String privateId;
+ private String name;
+ private boolean manager;
+
+ public Employee(String id, String name) {
+ setPrivateId(id);
+ setName(name);
+ }
+
+ private Employee(String id, String name, boolean managerAttribute) {
+ this.privateId = id;
+ this.name = name;
+ this.privateId = id + "_ID-MANAGER";
+ }
+
+ public void setPrivateId(String customId) {
+ if (customId.endsWith("_ID")) {
+ this.privateId = customId;
+ } else {
+ this.privateId = customId + "_ID";
+ }
+ }
+
+ public String getPrivateId() {
+ return privateId;
+ }
+
+ public boolean isManager() {
+ return manager;
+ }
+
+ public void elevateToManager() {
+ if ("Carl".equals(this.name)) {
+ setManager(true);
+ }
+ }
+
+ private void setManager(boolean manager) {
+ this.manager = manager;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public static Employee buildManager(String id, String name) {
+ return new Employee(id, name, true);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
new file mode 100644
index 0000000000..8659b4ad9c
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java
@@ -0,0 +1,10 @@
+package com.baeldung.core.privatemodifier;
+
+public class ExampleClass {
+
+ public static void main(String[] args) {
+ Employee employee = new Employee("Bob","ABC123");
+ employee.setPrivateId("BCD234");
+ System.out.println(employee.getPrivateId());
+ }
+}
diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
new file mode 100644
index 0000000000..8a9e8a8eb3
--- /dev/null
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java
@@ -0,0 +1,16 @@
+package com.baeldung.core.privatemodifier;
+
+public class PublicOuterClass {
+
+ public PrivateInnerClass getInnerClassInstance() {
+ PrivateInnerClass myPrivateClassInstance = this.new PrivateInnerClass();
+ myPrivateClassInstance.id = "ID1";
+ myPrivateClassInstance.name = "Bob";
+ return myPrivateClassInstance;
+ }
+
+ private class PrivateInnerClass {
+ public String name;
+ public String id;
+ }
+}
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java
similarity index 89%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java
index 8deec35c16..99feeb060d 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope;
+package com.baeldung.core.scope;
public class BracketScopeExample {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java
index c81fcc9550..8bcfee44f2 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope;
+package com.baeldung.core.scope;
public class ClassScopeExample {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java
index be41252623..8067085404 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope;
+package com.baeldung.core.scope;
import java.util.Arrays;
import java.util.List;
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java
similarity index 87%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java
index 63a6a25271..86b2021c6d 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope;
+package com.baeldung.core.scope;
public class MethodScopeExample {
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java
similarity index 86%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java
rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java
index c3c5bec221..51351d237c 100644
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java
@@ -1,4 +1,4 @@
-package com.baeldung.scope;
+package com.baeldung.core.scope;
public class NestedScopesExample {
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java
similarity index 96%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java
index b03b01d074..fe47dd4c26 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.doublebrace;
+package com.baeldung.core.doublebrace;
import org.junit.Test;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java
similarity index 95%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java
rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java
index ac27c11c68..1c70acc483 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java
@@ -1,11 +1,11 @@
-package com.baeldung.nativekeyword;
-
-import static org.junit.Assert.assertNotNull;
+package com.baeldung.core.nativekeyword;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
+import static org.junit.Assert.assertNotNull;
+
public class DateTimeUtilsManualTest {
private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(DateTimeUtilsManualTest.class);
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java
similarity index 85%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java
rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java
index 212fb7b3c7..b1237e9948 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java
+++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java
@@ -1,12 +1,11 @@
-package com.baeldung.packages;
+package com.baeldung.core.packages;
-import static org.junit.Assert.assertEquals;
+import com.baeldung.core.packages.domain.TodoItem;
+import org.junit.Test;
import java.time.LocalDate;
-import org.junit.Test;
-
-import com.baeldung.packages.domain.TodoItem;
+import static org.junit.Assert.assertEquals;
public class PackagesUnitTest {
diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md
index 81c3d6c354..25f5c63dbc 100644
--- a/core-java-modules/core-java-lang-syntax/README.md
+++ b/core-java-modules/core-java-lang-syntax/README.md
@@ -1,20 +1,16 @@
-=========
+## Core Java Lang Syntax
-## Core Java Lang Syntax Cookbooks and Examples
+This module contains articles about Java syntax
### Relevant Articles:
-- [The Basics of Java Generics](http://www.baeldung.com/java-generics)
-- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
-- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
-- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
-- [A Guide to Creating Objects in Java](http://www.baeldung.com/java-initialization)
-- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
-- [Varargs in Java](http://www.baeldung.com/java-varargs)
-- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
-- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
+- [The Basics of Java Generics](https://www.baeldung.com/java-generics)
+- [Java Primitive Conversions](https://www.baeldung.com/java-primitive-conversions)
+- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break)
+- [A Guide to Creating Objects in Java](https://www.baeldung.com/java-initialization)
+- [A Guide to Java Loops](https://www.baeldung.com/java-loops)
+- [Varargs in Java](https://www.baeldung.com/java-varargs)
+- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums)
+- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java)
- [Java Switch Statement](https://www.baeldung.com/java-switch)
-- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java)
-- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator)
-- [Java instanceof Operator](https://www.baeldung.com/java-instanceof)
+- [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop)
+- [[More -->]](/core-java-modules/core-java-lang-syntax-2)
diff --git a/core-java-modules/core-java-lang-syntax/pom.xml b/core-java-modules/core-java-lang-syntax/pom.xml
index 46fa8d1206..f4549b689d 100644
--- a/core-java-modules/core-java-lang-syntax/pom.xml
+++ b/core-java-modules/core-java-lang-syntax/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-lang-syntax
0.1.0-SNAPSHOT
core-java-lang-syntax
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java
index 1c4082c58b..b8d4aa3263 100644
--- a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java
+++ b/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java
@@ -35,4 +35,11 @@ public class Generics {
return list;
}
+ public List genericMethod(List list) {
+ return list.stream().collect(Collectors.toList());
+ }
+
+ public List withErasure(List list) {
+ return list.stream().collect(Collectors.toList());
+ }
}
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
similarity index 98%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java
rename to core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
index f82f9ddaa7..5a8b116a2c 100644
--- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java
+++ b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java
@@ -12,7 +12,7 @@ import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
-public class WhenUsingLoops {
+public class LoopsUnitTest {
private LoopsInJava loops = new LoopsInJava();
private static List list = new ArrayList<>();
diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md
index 74936eac21..9b485d80e9 100644
--- a/core-java-modules/core-java-lang/README.md
+++ b/core-java-modules/core-java-lang/README.md
@@ -1,43 +1,16 @@
-=========
+## Core Java Lang
-## Core Java Lang Cookbooks and Examples
+This module contains articles about core features in the Java language
### Relevant Articles:
-- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
-- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode)
-- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions)
-- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection)
-- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration)
-- [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)
-- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization)
-- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [Comparator and Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
-- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
-- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
-- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
-- [Recursion In Java](http://www.baeldung.com/java-recursion)
-- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
-- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java)
-- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system)
-- [Using Java Assertions](http://www.baeldung.com/java-assert)
-- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror)
-- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error)
-- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception)
-- [Exception Handling in Java](http://www.baeldung.com/java-exceptions)
-- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize)
-- [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding)
-- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws)
+- [Generate equals() and hashCode() with Eclipse](https://www.baeldung.com/java-eclipse-equals-and-hashcode)
+- [Iterating Over Enum Values in Java](https://www.baeldung.com/java-enum-iteration)
+- [Comparator and Comparable in Java](https://www.baeldung.com/java-comparator-comparable)
+- [Recursion In Java](https://www.baeldung.com/java-recursion)
+- [A Guide to the finalize Method in Java](https://www.baeldung.com/java-finalize)
+- [Quick Guide to java.lang.System](https://www.baeldung.com/java-lang-system)
+- [Using Java Assertions](https://www.baeldung.com/java-assert)
- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
-- [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts)
-- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws)
- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
-- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
-- [Guide to Java Packages](https://www.baeldung.com/java-packages)
-- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native)
-- [If-Else Statement in Java](https://www.baeldung.com/java-if-else)
-- [Control Structures in Java](https://www.baeldung.com/java-control-structures)
-- [Java Interfaces](https://www.baeldung.com/java-interfaces)
- [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values)
-- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope)
-- [Java Classes and Objects](https://www.baeldung.com/java-classes-objects)
+- [[More --> ]](/core-java-modules/core-java-lang-2)
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml
index 8311636873..10b0526177 100644
--- a/core-java-modules/core-java-lang/pom.xml
+++ b/core-java-modules/core-java-lang/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-lang
0.1.0-SNAPSHOT
core-java-lang
@@ -14,55 +13,6 @@
../../parent-java
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
- com.google.code.gson
- gson
- ${gson.version}
-
-
-
- log4j
- log4j
- ${log4j.version}
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
-
-
- org.assertj
- assertj-core
- ${assertj-core.version}
- test
-
-
- javax.mail
- mail
- ${javax.mail.version}
-
-
-
core-java-lang
@@ -73,13 +23,4 @@
-
- 2.8.2
-
- 1.5.0-b01
-
-
- 3.10.0
-
-
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
deleted file mode 100644
index c2908b7278..0000000000
--- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.baeldung.exceptionhandling;
-
-public class MyException extends Throwable {
-
-}
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java
rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/DaysOfWeekEnum.java
similarity index 92%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/DaysOfWeekEnum.java
index 89e718adf3..f25ddfa6dd 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/DaysOfWeekEnum.java
+++ b/core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/DaysOfWeekEnum.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.enumiteration;
+package com.baeldung.enums.iteration;
import java.util.stream.Stream;
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/EnumIterationExamples.java
similarity index 97%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/EnumIterationExamples.java
index 110943e39f..9b058aef83 100644
--- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/enumiteration/EnumIterationExamples.java
+++ b/core-java-modules/core-java-lang/src/test/java/com/baeldung/enums/iteration/EnumIterationExamples.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.enumiteration;
+package com.baeldung.enums.iteration;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md
new file mode 100644
index 0000000000..c384a28b64
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/README.md
@@ -0,0 +1,12 @@
+## Core Java Networking (Part 2)
+
+This module contains articles about networking in Java
+
+### Relevant Articles
+
+- [Checking if a URL Exists in Java](https://www.baeldung.com/java-check-url-exists)
+- [Making a JSON POST Request With HttpURLConnection](https://www.baeldung.com/httpurlconnection-post)
+- [Using Curl in Java](https://www.baeldung.com/java-curl)
+- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
+- [Sending Emails with Java](http://www.baeldung.com/java-email)
+- [[<-- Prev]](/core-java-modules/core-java-networking)
diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml
new file mode 100644
index 0000000000..2d404a553b
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ core-java-networking-2
+ core-java-networking-2
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ ${httpclient.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ javax.mail
+ mail
+ ${javax.mail.version}
+
+
+
+
+ core-java-networking-2
+
+
+
+ 4.5.9
+ 1.5.0-b01
+
+
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
similarity index 98%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
index 394255bd70..cc9d79aa65 100644
--- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java
@@ -1,4 +1,4 @@
-package com.baeldung.http;
+package com.baeldung.httprequest;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
similarity index 95%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
index bed4195faa..f91ab332c7 100644
--- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java
@@ -1,4 +1,4 @@
-package com.baeldung.http;
+package com.baeldung.httprequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
similarity index 97%
rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java
index e775b9f708..bd2024fdfa 100644
--- a/core-java-modules/core-java-networking/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,15 +1,12 @@
package com.baeldung.mail;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.Properties;
import javax.mail.*;
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.util.Properties;
public class EmailService {
diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/UrlChecker.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/UrlChecker.java
new file mode 100644
index 0000000000..b99e74f8bf
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/UrlChecker.java
@@ -0,0 +1,25 @@
+package com.baeldung.url;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class UrlChecker {
+
+ public int getResponseCodeForURL(String address) throws IOException {
+ return getResponseCodeForURLUsing(address, "GET");
+ }
+
+ public int getResponseCodeForURLUsingHead(String address) throws IOException {
+ return getResponseCodeForURLUsing(address, "HEAD");
+ }
+
+ private int getResponseCodeForURLUsing(String address, String method) throws IOException {
+ HttpURLConnection.setFollowRedirects(false); // Set follow redirects to false
+ final URL url = new URL(address);
+ HttpURLConnection huc = (HttpURLConnection) url.openConnection();
+ huc.setRequestMethod(method);
+ return huc.getResponseCode();
+ }
+
+}
diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java
new file mode 100644
index 0000000000..779f8aa898
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java
@@ -0,0 +1,74 @@
+package com.baeldung.url.auth;
+
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.PasswordAuthentication;
+import java.net.ProtocolException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+import org.apache.commons.codec.binary.Base64;
+
+public class HttpClient {
+
+ private final String user;
+ private final String password;
+
+ public HttpClient(String user, String password) {
+ this.user = user;
+ this.password = password;
+ }
+
+ public int sendRquestWithAuthHeader(String url) throws IOException {
+ HttpURLConnection connection = null;
+ try {
+ connection = createConnection(url);
+ connection.setRequestProperty("Authorization", createBasicAuthHeaderValue());
+ return connection.getResponseCode();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ public int sendRquestWithAuthenticator(String url) throws IOException {
+ setAuthenticator();
+
+ HttpURLConnection connection = null;
+ try {
+ connection = createConnection(url);
+ return connection.getResponseCode();
+ } finally {
+ if (connection != null) {
+ connection.disconnect();
+ }
+ }
+ }
+
+ private HttpURLConnection createConnection(String urlString) throws MalformedURLException, IOException, ProtocolException {
+ URL url = new URL(String.format(urlString));
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setRequestMethod("GET");
+ return connection;
+ }
+
+ private String createBasicAuthHeaderValue() {
+ String auth = user + ":" + password;
+ byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
+ String authHeaderValue = "Basic " + new String(encodedAuth);
+ return authHeaderValue;
+ }
+
+ private void setAuthenticator() {
+ Authenticator.setDefault(new BasicAuthenticator());
+ }
+
+ private final class BasicAuthenticator extends Authenticator {
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(user, password.toCharArray());
+ }
+ }
+}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java
diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
similarity index 97%
rename from core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
index bd6c0a4410..41e0f2d6af 100644
--- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java
@@ -1,13 +1,9 @@
-package com.baeldung.http;
+package com.baeldung.httprequest;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import java.io.BufferedReader;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
+import java.io.*;
import java.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/UrlCheckerUnitTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/UrlCheckerUnitTest.java
new file mode 100644
index 0000000000..5e295e65a0
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/UrlCheckerUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.url;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class UrlCheckerUnitTest {
+
+ @Test
+ public void givenValidUrl_WhenUsingHEAD_ThenReturn200() throws IOException {
+ UrlChecker tester = new UrlChecker();
+ int responseCode = tester.getResponseCodeForURLUsingHead("http://www.example.com");
+ assertEquals(200, responseCode);
+ }
+
+ @Test
+ public void givenInvalidIUrl_WhenUsingHEAD_ThenReturn404() throws IOException {
+ UrlChecker tester = new UrlChecker();
+ int responseCode = tester.getResponseCodeForURLUsingHead("http://www.example.com/unkownurl");
+ assertEquals(404, responseCode);
+ }
+
+ @Test
+ public void givenValidUrl_WhenUsingGET_ThenReturn200() throws IOException {
+ UrlChecker tester = new UrlChecker();
+ int responseCode = tester.getResponseCodeForURL("http://www.example.com");
+ assertEquals(200, responseCode);
+ }
+
+ @Test
+ public void givenInvalidIUrl_WhenUsingGET_ThenReturn404() throws IOException {
+ UrlChecker tester = new UrlChecker();
+ int responseCode = tester.getResponseCodeForURL("http://www.example.com/unkownurl");
+ assertEquals(404, responseCode);
+ }
+
+}
diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java
new file mode 100644
index 0000000000..0ccb6e5a54
--- /dev/null
+++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java
@@ -0,0 +1,52 @@
+package com.baeldung.url.auth;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class HttpClientUnitTest {
+
+ @Test
+ public void sendRquestWithAuthHeader() throws Exception {
+ HttpClient httpClient = new HttpClient("user1", "pass1");
+
+ int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1");
+
+ assertTrue(isSuccess(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception {
+ HttpClient httpClient = new HttpClient("John", "Smith");
+
+ int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1");
+
+ assertTrue(isUnauthorized(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthenticator() throws Exception {
+ HttpClient httpClient = new HttpClient("user2", "pass2");
+
+ int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2");
+
+ assertTrue(isSuccess(status));
+ }
+
+ @Test
+ public void sendRquestWithAuthenticator_whenIncorrectCredentials_thenNotSuccessful() throws Exception {
+ HttpClient httpClient = new HttpClient("John", "Smith");
+
+ int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2");
+
+ assertTrue(isUnauthorized(status));
+ }
+
+ private boolean isSuccess(int status) {
+ return (status >= 200) && (status < 300);
+ }
+
+ private boolean isUnauthorized(int status) {
+ return status == 401;
+ }
+}
diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md
index 2341520df7..4038e9803a 100644
--- a/core-java-modules/core-java-networking/README.md
+++ b/core-java-modules/core-java-networking/README.md
@@ -1,18 +1,17 @@
-=========
-
## Core Java Networking
+This module contains articles about networking in Java
+
### Relevant Articles
- [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server)
- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast)
- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java)
-- [Sending Emails with Java](http://www.baeldung.com/java-email)
- [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java)
- [A Guide to the Java URL](http://www.baeldung.com/java-url)
- [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces)
- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets)
- [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding)
-- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
- [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri)
- [Read an InputStream using the Java Server Socket](https://www.baeldung.com/java-inputstream-server-socket)
+- [[More -->]](/core-java-modules/core-java-networking-2)
diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml
index e2ee7b2fcc..cd84d2a27c 100644
--- a/core-java-modules/core-java-networking/pom.xml
+++ b/core-java-modules/core-java-networking/pom.xml
@@ -14,26 +14,11 @@
-
- javax.mail
- mail
- ${javax.mail.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
org.springframework
spring-web
${springframework.spring-web.version}
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
@@ -41,7 +26,6 @@
- 1.5.0-b01
4.3.4.RELEASE
diff --git a/core-java-modules/core-java-nio/README.md b/core-java-modules/core-java-nio/README.md
index 9034c3b3b1..727bd2546c 100644
--- a/core-java-modules/core-java-nio/README.md
+++ b/core-java-modules/core-java-nio/README.md
@@ -1,3 +1,8 @@
-## Relevant articles:
+## Core Java NIO
-- [Determine File Creating Date in Java](https://www.baeldung.com/java-file-creation-date)
+This module contains articles about core Java non-blocking input and output (IO)
+
+## Relevant Articles:
+
+- [Determine File Creation Date in Java](https://www.baeldung.com/java-file-creation-date)
+- [Find the Number of Lines in a File Using Jav](https://www.baeldung.com/java-file-number-of-lines)
diff --git a/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java
new file mode 100644
index 0000000000..d8800dd881
--- /dev/null
+++ b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/Main.java
@@ -0,0 +1,26 @@
+package com.baeldung.file;
+
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFilesReadAllLines;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner;
+
+public class Main {
+
+ private static final String INPUT_FILE_NAME = "src/main/resources/input.txt";
+
+ public static void main(String... args) throws Exception {
+ System.out.printf("Total Number of Lines Using BufferedReader: %s%n", getTotalNumberOfLinesUsingBufferedReader(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using LineNumberReader: %s%n", getTotalNumberOfLinesUsingLineNumberReader(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using Scanner: %s%n", getTotalNumberOfLinesUsingScanner(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using NIO Files: %s%n", getTotalNumberOfLinesUsingNIOFiles(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using NIO Files#readAllLines: %s%n", getTotalNumberOfLinesUsingNIOFilesReadAllLines(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using NIO FileChannel: %s%n", getTotalNumberOfLinesUsingNIOFileChannel(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using Apache Commons IO: %s%n", getTotalNumberOfLinesUsingApacheCommonsIO(INPUT_FILE_NAME));
+ System.out.printf("Total Number of Lines Using NIO Google Guava: %s%n", getTotalNumberOfLinesUsingGoogleGuava(INPUT_FILE_NAME));
+ }
+}
diff --git a/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java
new file mode 100644
index 0000000000..3abf82f3fa
--- /dev/null
+++ b/core-java-modules/core-java-nio/src/main/java/com/baeldung/file/NumberOfLineFinder.java
@@ -0,0 +1,123 @@
+package com.baeldung.file;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileChannel.MapMode;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.LineIterator;
+
+public class NumberOfLineFinder {
+
+ public static int getTotalNumberOfLinesUsingBufferedReader(String fileName) {
+ int lines = 0;
+ try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
+ while (reader.readLine() != null) {
+ lines++;
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingLineNumberReader(String fileName) {
+ int lines = 0;
+ try (LineNumberReader reader = new LineNumberReader(new FileReader(fileName))) {
+ reader.skip(Integer.MAX_VALUE);
+ lines = reader.getLineNumber() + 1;
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingScanner(String fileName) {
+ int lines = 0;
+ try (Scanner scanner = new Scanner(new FileReader(fileName))) {
+ while (scanner.hasNextLine()) {
+ scanner.nextLine();
+ lines++;
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingNIOFiles(String fileName) {
+ int lines = 0;
+ try (Stream fileStream = Files.lines(Paths.get(fileName))) {
+ lines = (int) fileStream.count();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingNIOFilesReadAllLines(String fileName) {
+ int lines = 0;
+ try {
+ List fileStream = Files.readAllLines(Paths.get(fileName));
+ lines = fileStream.size();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingNIOFileChannel(String fileName) {
+ int lines = 1;
+ try (FileChannel channel = FileChannel.open(Paths.get(fileName), StandardOpenOption.READ)) {
+ ByteBuffer byteBuffer = channel.map(MapMode.READ_ONLY, 0, channel.size());
+ while (byteBuffer.hasRemaining()) {
+ byte currentChar = byteBuffer.get();
+ if (currentChar == '\n') {
+ lines++;
+ }
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingApacheCommonsIO(String fileName) {
+ int lines = 0;
+ try {
+ LineIterator lineIterator = FileUtils.lineIterator(new File(fileName));
+ while (lineIterator.hasNext()) {
+ lineIterator.nextLine();
+ lines++;
+ }
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+ public static int getTotalNumberOfLinesUsingGoogleGuava(String fileName) {
+ int lines = 0;
+ try {
+ List lineItems = com.google.common.io.Files.readLines(Paths.get(fileName)
+ .toFile(), Charset.defaultCharset());
+ lines = lineItems.size();
+ } catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return lines;
+ }
+
+}
diff --git a/core-java-modules/core-java-nio/src/main/resources/input.txt b/core-java-modules/core-java-nio/src/main/resources/input.txt
new file mode 100644
index 0000000000..650da894e8
--- /dev/null
+++ b/core-java-modules/core-java-nio/src/main/resources/input.txt
@@ -0,0 +1,45 @@
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus.
+
+Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
+
+Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien.
+
+Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla.
+
+Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis.
+
+Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis.
+
+Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et.
+
+Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est.
+
+Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor.
+
+Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui.
+
+Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices.
+
+Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas.
+
+Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus.
+
+Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque.
+
+Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla.
+
+Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non.
+
+Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam.
+
+Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in.
+
+Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat.
+
+Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi.
+
+Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex.
+
+Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor.
+
+Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue.
\ No newline at end of file
diff --git a/core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java b/core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java
new file mode 100644
index 0000000000..40ed6d6bba
--- /dev/null
+++ b/core-java-modules/core-java-nio/src/test/java/com/baeldung/file/NumberOfLineFinderUnitTest.java
@@ -0,0 +1,67 @@
+package com.baeldung.file;
+
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingApacheCommonsIO;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingBufferedReader;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingGoogleGuava;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingLineNumberReader;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFileChannel;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFiles;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingNIOFilesReadAllLines;
+import static com.baeldung.file.NumberOfLineFinder.getTotalNumberOfLinesUsingScanner;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class NumberOfLineFinderUnitTest {
+ private static final String INPUT_FILE_NAME = "src/main/resources/input.txt";
+ private static final int ACTUAL_LINE_COUNT = 45;
+
+ @Test
+ public void whenUsingBufferedReader_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingBufferedReader(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingLineNumberReader_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingLineNumberReader(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingScanner_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingScanner(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingNIOFiles_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingNIOFiles(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingNIOFilesReadAllLines_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingNIOFilesReadAllLines(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingNIOFileChannel_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingNIOFileChannel(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingApacheCommonsIO_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingApacheCommonsIO(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+ @Test
+ public void whenUsingGoogleGuava_thenReturnTotalNumberOfLines() {
+ int lines = getTotalNumberOfLinesUsingGoogleGuava(INPUT_FILE_NAME);
+ assertEquals(ACTUAL_LINE_COUNT, lines);
+ }
+
+}
diff --git a/core-java-modules/core-java-optional/README.md b/core-java-modules/core-java-optional/README.md
index b6848b5d33..22ac8736fa 100644
--- a/core-java-modules/core-java-optional/README.md
+++ b/core-java-modules/core-java-optional/README.md
@@ -4,3 +4,5 @@
### Relevant Articles:
- [Java Optional as Return Type](https://www.baeldung.com/java-optional-return)
+- [Guide To Java 8 Optional](https://www.baeldung.com/java-optional)
+- [Java Optional – orElse() vs orElseGet()](https://www.baeldung.com/java-optional-or-else-vs-or-else-get)
\ No newline at end of file
diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml
index eb981c0907..38d7565282 100644
--- a/core-java-modules/core-java-optional/pom.xml
+++ b/core-java-modules/core-java-optional/pom.xml
@@ -3,6 +3,7 @@
core-java-optional
0.1.0-SNAPSHOT
jar
+ core-java-optional
com.baeldung.core-java-modules
@@ -26,27 +27,26 @@
jackson-databind
${jackson.version}
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-bytecode
+ ${jmh-generator.version}
+
-
-
-
- org.apache.maven.plugins
- maven-compiler-plugin
- ${maven-compiler-plugin.version}
-
- ${maven.compiler.source}
- ${maven.compiler.target}
-
-
-
-
-
-
- UTF-8
- 1.8
- 1.8
5.4.0.Final
+ 1.19
+ 1.19
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java
rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java
diff --git a/core-java-modules/core-java-os/README.md b/core-java-modules/core-java-os/README.md
index 5f5d373d9b..f2ec3f9d48 100644
--- a/core-java-modules/core-java-os/README.md
+++ b/core-java-modules/core-java-os/README.md
@@ -1,10 +1,16 @@
-=========
+## Core Java OS
-This module uses Java 9, so make sure to have the JDK 9 installed to run it.
+This module contains articles about working with the operating system (OS) in Java
-##
### Relevant Articles:
+
- [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api)
- [Guide to java.lang.Process API](https://www.baeldung.com/java-process-api)
- [Guide to java.lang.ProcessBuilder API](https://www.baeldung.com/java-lang-processbuilder-api)
+- [Get the Current Working Directory in Java](https://www.baeldung.com/java-current-directory)
+- [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os)
+- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
+- [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java)
+- [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java)
+This module uses Java 9, so make sure to have the JDK 9 installed to run it.
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
index f6c5ef04a5..f09b62ebf2 100644
--- a/core-java-modules/core-java-os/pom.xml
+++ b/core-java-modules/core-java-os/pom.xml
@@ -42,6 +42,16 @@
${assertj.version}
test
+
+ org.unix4j
+ unix4j-command
+ ${unix4j.version}
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
+
@@ -54,7 +64,7 @@
-
+
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
@@ -77,5 +87,7 @@
1.9
1.9
25.1-jre
+ 0.4
+ 1.8.7
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/printscreen/Screenshot.java b/core-java-modules/core-java-os/src/main/java/com/baeldung/printscreen/Screenshot.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/printscreen/Screenshot.java
rename to core-java-modules/core-java-os/src/main/java/com/baeldung/printscreen/Screenshot.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/system/DetectOS.java b/core-java-modules/core-java-os/src/main/java/com/baeldung/system/DetectOS.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/system/DetectOS.java
rename to core-java-modules/core-java-os/src/main/java/com/baeldung/system/DetectOS.java
diff --git a/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java b/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java
new file mode 100644
index 0000000000..a9738a0448
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java
@@ -0,0 +1,20 @@
+package com.baeldung.system.exit;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class SystemExitExample {
+
+ public void readFile() {
+ try {
+ BufferedReader br = new BufferedReader(new FileReader("file.txt"));
+ System.out.println(br.readLine());
+ br.close();
+ } catch (IOException e) {
+ System.exit(2);
+ } finally {
+ System.out.println("Exiting the program");
+ }
+ }
+}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/grep/GrepWithUnix4JIntegrationTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/grep/GrepWithUnix4JIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/grep/GrepWithUnix4JIntegrationTest.java
rename to core-java-modules/core-java-os/src/test/java/com/baeldung/grep/GrepWithUnix4JIntegrationTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/printscreen/ScreenshotLiveTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/printscreen/ScreenshotLiveTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/printscreen/ScreenshotLiveTest.java
rename to core-java-modules/core-java-os/src/test/java/com/baeldung/printscreen/ScreenshotLiveTest.java
diff --git a/core-java-modules/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
similarity index 98%
rename from core-java-modules/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java
rename to core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
index efd7dda70f..53e9364207 100644
--- a/core-java-modules/core-java/src/test/java/org/baeldung/java/shell/JavaProcessUnitIntegrationTest.java
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/shell/JavaProcessUnitIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.shell;
+package com.baeldung.java.shell;
import org.junit.Assert;
import org.junit.Test;
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/system/WhenDetectingOSUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/system/WhenDetectingOSUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/system/WhenDetectingOSUnitTest.java
rename to core-java-modules/core-java-os/src/test/java/com/baeldung/system/WhenDetectingOSUnitTest.java
diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java
new file mode 100644
index 0000000000..6d5f9c2f34
--- /dev/null
+++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java
@@ -0,0 +1,63 @@
+package com.baeldung.system.exit;
+
+import static org.junit.Assert.assertEquals;
+
+import java.security.Permission;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SystemExitUnitTest {
+
+ protected static class ExitException extends SecurityException {
+
+ private static final long serialVersionUID = 1L;
+ public final int status;
+
+ public ExitException(int status) {
+ this.status = status;
+ }
+ }
+
+ private static class NoExitSecurityManager extends SecurityManager {
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+
+ @Override
+ public void checkPermission(Permission perm, Object context) {
+ }
+
+ @Override
+ public void checkExit(int status) {
+ super.checkExit(status);
+ throw new ExitException(status);
+ }
+ }
+
+ private SecurityManager securityManager;
+
+ private SystemExitExample example;
+
+ @Before
+ public void setUp() throws Exception {
+ example = new SystemExitExample();
+ securityManager = System.getSecurityManager();
+ System.setSecurityManager(new NoExitSecurityManager());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ System.setSecurityManager(securityManager);
+ }
+
+ @Test
+ public void testExit() throws Exception {
+ try {
+ example.readFile();
+ } catch (ExitException e) {
+ assertEquals("Exit status", 2, e.status);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md
index 1b3b590bf8..d1d646ac7f 100644
--- a/core-java-modules/core-java-perf/README.md
+++ b/core-java-modules/core-java-perf/README.md
@@ -1,5 +1,7 @@
## Core Java Performance
+This module contains articles about performance of Java applications
+
### Relevant Articles:
- [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc)
- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture)
diff --git a/core-java-modules/core-java-perf/pom.xml b/core-java-modules/core-java-perf/pom.xml
index b9c9d30ac0..a6e20f198d 100644
--- a/core-java-modules/core-java-perf/pom.xml
+++ b/core-java-modules/core-java-perf/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-perf
0.1.0-SNAPSHOT
core-java-perf
@@ -14,13 +13,4 @@
../../parent-java
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
-
-
diff --git a/core-java-modules/core-java-reflection/README.MD b/core-java-modules/core-java-reflection/README.MD
index c8766d6858..840d488968 100644
--- a/core-java-modules/core-java-reflection/README.MD
+++ b/core-java-modules/core-java-reflection/README.MD
@@ -1,3 +1,9 @@
## Relevant Articles
- [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)
+- [Guide to Java Reflection](http://www.baeldung.com/java-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)
\ No newline at end of file
diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml
index e6c7f81d6c..b3c3390df8 100644
--- a/core-java-modules/core-java-reflection/pom.xml
+++ b/core-java-modules/core-java-reflection/pom.xml
@@ -23,7 +23,30 @@
+
+ core-java-reflection
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ 1.8
+ 1.8
+ -parameters
+
+
+
+
+
+ 3.8.0
3.10.0
\ No newline at end of file
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java
diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java
similarity index 100%
rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java
similarity index 100%
rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java
diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java
rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java
diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java
rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java
diff --git a/core-java-modules/core-java-security-manager/pom.xml b/core-java-modules/core-java-security-manager/pom.xml
new file mode 100644
index 0000000000..f5be1639da
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/pom.xml
@@ -0,0 +1,14 @@
+
+ 4.0.0
+ core-java-security-manager
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-security-manager
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 1.0.0-SNAPSHOT
+
+
+
diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java
new file mode 100644
index 0000000000..5f9c43336f
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java
@@ -0,0 +1,13 @@
+package com.baeldung.security.manager;
+
+import java.security.BasicPermission;
+
+public class CustomPermission extends BasicPermission {
+ public CustomPermission(String name) {
+ super(name);
+ }
+
+ public CustomPermission(String name, String actions) {
+ super(name, actions);
+ }
+}
diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java
new file mode 100644
index 0000000000..1b9f14e3b8
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java
@@ -0,0 +1,18 @@
+package com.baeldung.security.manager;
+
+public class Service {
+
+ public static final String OPERATION = "my-operation";
+
+ public void operation() {
+ SecurityManager securityManager = System.getSecurityManager();
+ if (securityManager != null) {
+ securityManager.checkPermission(new CustomPermission(OPERATION));
+ }
+ System.out.println("Operation is executed");
+ }
+
+ public static void main(String[] args) {
+ new Service().operation();
+ }
+}
diff --git a/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java
new file mode 100644
index 0000000000..a845f233b5
--- /dev/null
+++ b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.security.manager;
+
+import org.junit.Test;
+
+import java.net.URL;
+import java.security.AccessControlException;
+import java.util.concurrent.Callable;
+
+public class SecurityManagerUnitTest {
+
+ @Test(expected = AccessControlException.class)
+ public void whenSecurityManagerIsActive_thenNetworkIsNotAccessibleByDefault() throws Exception {
+ doTest(() -> {
+ new URL("http://www.google.com").openConnection().connect();
+ return null;
+ });
+ }
+
+ @Test(expected = AccessControlException.class)
+ public void whenUnauthorizedClassTriesToAccessProtectedOperation_thenAnExceptionIsThrown() throws Exception {
+ doTest(() -> {
+ new Service().operation();
+ return null;
+ });
+ }
+
+ private void doTest(Callable action) throws Exception {
+ System.setSecurityManager(new SecurityManager());
+ try {
+ action.call();
+ } finally {
+ System.setSecurityManager(null);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md
index 9526b15be5..7386d04e8e 100644
--- a/core-java-modules/core-java-security/README.md
+++ b/core-java-modules/core-java-security/README.md
@@ -1,5 +1,7 @@
## Core Java Security
+This module contains articles about core Java Security
+
### Relevant Articles:
- [MD5 Hashing in Java](http://www.baeldung.com/java-md5)
- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class)
@@ -10,3 +12,7 @@
- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures)
- [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java)
- [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12)
+- [The Java SecureRandom Class](https://www.baeldung.com/java-secure-random)
+- [An Introduction to Java SASL](https://www.baeldung.com/java-sasl)
+- [A Guide to Java GSS API](https://www.baeldung.com/java-gss)
+
diff --git a/core-java-modules/core-java-security/pom.xml b/core-java-modules/core-java-security/pom.xml
index d3efb26fe8..e882fd823e 100644
--- a/core-java-modules/core-java-security/pom.xml
+++ b/core-java-modules/core-java-security/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-security
0.1.0-SNAPSHOT
core-java-security
@@ -15,11 +14,6 @@
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
org.assertj
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ClientCallbackHandler.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ClientCallbackHandler.java
new file mode 100644
index 0000000000..d73f2a2708
--- /dev/null
+++ b/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ClientCallbackHandler.java
@@ -0,0 +1,29 @@
+package com.baeldung.sasl;
+
+import java.io.IOException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.sasl.RealmCallback;
+
+public class ClientCallbackHandler implements CallbackHandler {
+
+ @Override
+ public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException {
+ for (Callback cb : cbs) {
+ if (cb instanceof NameCallback) {
+ NameCallback nc = (NameCallback) cb;
+ nc.setName("username");
+ } else if (cb instanceof PasswordCallback) {
+ PasswordCallback pc = (PasswordCallback) cb;
+ pc.setPassword("password".toCharArray());
+ } else if (cb instanceof RealmCallback) {
+ RealmCallback rc = (RealmCallback) cb;
+ rc.setText("myServer");
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ServerCallbackHandler.java b/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ServerCallbackHandler.java
new file mode 100644
index 0000000000..3e071d68cc
--- /dev/null
+++ b/core-java-modules/core-java-security/src/main/java/com/baeldung/sasl/ServerCallbackHandler.java
@@ -0,0 +1,34 @@
+package com.baeldung.sasl;
+
+import java.io.IOException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.sasl.AuthorizeCallback;
+import javax.security.sasl.RealmCallback;
+
+public class ServerCallbackHandler implements CallbackHandler {
+
+ @Override
+ public void handle(Callback[] cbs) throws IOException, UnsupportedCallbackException {
+ for (Callback cb : cbs) {
+ if (cb instanceof AuthorizeCallback) {
+ AuthorizeCallback ac = (AuthorizeCallback) cb;
+ ac.setAuthorized(true);
+ } else if (cb instanceof NameCallback) {
+ NameCallback nc = (NameCallback) cb;
+ nc.setName("username");
+
+ } else if (cb instanceof PasswordCallback) {
+ PasswordCallback pc = (PasswordCallback) cb;
+ pc.setPassword("password".toCharArray());
+ } else if (cb instanceof RealmCallback) {
+ RealmCallback rc = (RealmCallback) cb;
+ rc.setText("myServer");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java
new file mode 100644
index 0000000000..ce784bcae6
--- /dev/null
+++ b/core-java-modules/core-java-security/src/test/java/com/baeldung/jgss/JgssIntegrationTest.java
@@ -0,0 +1,84 @@
+package com.baeldung.jgss;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import javax.security.sasl.SaslException;
+
+import org.ietf.jgss.GSSContext;
+import org.ietf.jgss.GSSCredential;
+import org.ietf.jgss.GSSException;
+import org.ietf.jgss.GSSManager;
+import org.ietf.jgss.GSSName;
+import org.ietf.jgss.MessageProp;
+import org.ietf.jgss.Oid;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore
+public class JgssIntegrationTest {
+
+ private static final String SERVER_PRINCIPAL = "HTTP/localhost@EXAMPLE.COM";
+ private static final String MECHANISM = "1.2.840.113554.1.2.2";
+
+ GSSContext serverContext;
+ GSSContext clientContext;
+
+ @Before
+ public void setUp() throws SaslException, GSSException {
+ GSSManager manager = GSSManager.getInstance();
+ serverContext = manager.createContext((GSSCredential) null);
+ String serverPrinciple = SERVER_PRINCIPAL;
+ GSSName serverName = manager.createName(serverPrinciple, null);
+ Oid krb5Oid = new Oid(MECHANISM);
+ clientContext = manager.createContext(serverName, krb5Oid, (GSSCredential) null, GSSContext.DEFAULT_LIFETIME);
+ clientContext.requestMutualAuth(true);
+ clientContext.requestConf(true);
+ clientContext.requestInteg(true);
+ }
+
+ @Test
+ public void givenCredential_whenStarted_thenAutenticationWorks() throws SaslException, GSSException {
+ byte[] serverToken;
+ byte[] clientToken;
+
+ // On the client-side
+ clientToken = clientContext.initSecContext(new byte[0], 0, 0);
+ // sendToServer(clientToken); // This is supposed to be send over the network
+
+ // On the server-side
+ serverToken = serverContext.acceptSecContext(clientToken, 0, clientToken.length);
+ // sendToClient(serverToken); // This is supposed to be send over the network
+
+ // Back on the client-side
+ clientContext.initSecContext(serverToken, 0, serverToken.length);
+
+ assertTrue(serverContext.isEstablished());
+ assertTrue(clientContext.isEstablished());
+ }
+
+ @Test
+ public void givenContext_whenStarted_thenSecurityWorks() throws SaslException, GSSException {
+ // On the client-side
+ byte[] messageBytes = "Baeldung".getBytes();
+ MessageProp clientProp = new MessageProp(0, true);
+ byte[] clientToken = clientContext.wrap(messageBytes, 0, messageBytes.length, clientProp);
+ // sendToServer(clientToken); // This is supposed to be send over the network
+
+ // On the server-side
+ MessageProp serverProp = new MessageProp(0, false);
+ byte[] bytes = serverContext.unwrap(clientToken, 0, clientToken.length, serverProp);
+ String string = new String(bytes);
+
+ assertEquals("Baeldung", string);
+ }
+
+ @After
+ public void tearDown() throws SaslException, GSSException {
+ serverContext.dispose();
+ clientContext.dispose();
+ }
+
+}
diff --git a/core-java-modules/core-java-security/src/test/java/com/baeldung/sasl/SaslUnitTest.java b/core-java-modules/core-java-security/src/test/java/com/baeldung/sasl/SaslUnitTest.java
new file mode 100644
index 0000000000..6601654781
--- /dev/null
+++ b/core-java-modules/core-java-security/src/test/java/com/baeldung/sasl/SaslUnitTest.java
@@ -0,0 +1,76 @@
+package com.baeldung.sasl;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.security.sasl.Sasl;
+import javax.security.sasl.SaslClient;
+import javax.security.sasl.SaslException;
+import javax.security.sasl.SaslServer;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SaslUnitTest {
+
+ private static final String MECHANISM = "DIGEST-MD5";
+ private static final String SERVER_NAME = "myServer";
+ private static final String PROTOCOL = "myProtocol";
+ private static final String AUTHORIZATION_ID = null;
+ private static final String QOP_LEVEL = "auth-conf";
+
+ private SaslServer saslServer;
+ private SaslClient saslClient;
+
+ @Before
+ public void setUp() throws SaslException {
+
+ ServerCallbackHandler serverHandler = new ServerCallbackHandler();
+ ClientCallbackHandler clientHandler = new ClientCallbackHandler();
+
+ Map props = new HashMap<>();
+ props.put(Sasl.QOP, QOP_LEVEL);
+
+ saslServer = Sasl.createSaslServer(MECHANISM, PROTOCOL, SERVER_NAME, props, serverHandler);
+ saslClient = Sasl.createSaslClient(new String[] { MECHANISM }, AUTHORIZATION_ID, PROTOCOL, SERVER_NAME, props, clientHandler);
+
+ }
+
+ @Test
+ public void givenHandlers_whenStarted_thenAutenticationWorks() throws SaslException {
+
+ byte[] challenge;
+ byte[] response;
+
+ challenge = saslServer.evaluateResponse(new byte[0]);
+ response = saslClient.evaluateChallenge(challenge);
+
+ challenge = saslServer.evaluateResponse(response);
+ response = saslClient.evaluateChallenge(challenge);
+
+ assertTrue(saslServer.isComplete());
+ assertTrue(saslClient.isComplete());
+
+ String qop = (String) saslClient.getNegotiatedProperty(Sasl.QOP);
+ assertEquals("auth-conf", qop);
+
+ byte[] outgoing = "Baeldung".getBytes();
+ byte[] secureOutgoing = saslClient.wrap(outgoing, 0, outgoing.length);
+
+ byte[] secureIncoming = secureOutgoing;
+ byte[] incoming = saslServer.unwrap(secureIncoming, 0, secureIncoming.length);
+ assertEquals("Baeldung", new String(incoming, StandardCharsets.UTF_8));
+ }
+
+ @After
+ public void tearDown() throws SaslException {
+ saslClient.dispose();
+ saslServer.dispose();
+ }
+
+}
diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md
new file mode 100644
index 0000000000..e97641c221
--- /dev/null
+++ b/core-java-modules/core-java-streams/README.md
@@ -0,0 +1,9 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap)
+- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
+- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
+- [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors)
\ 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
new file mode 100644
index 0000000000..96d97f3759
--- /dev/null
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ core-java-streams
+ 0.1.0-SNAPSHOT
+ core-java-streams
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ core-java-streams
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.6.1
+
+
diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java b/core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java
similarity index 100%
rename from core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java
rename to core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java
diff --git a/spring-amqp/src/main/resources/logback.xml b/core-java-modules/core-java-streams/src/main/resources/logback.xml
similarity index 100%
rename from spring-amqp/src/main/resources/logback.xml
rename to core-java-modules/core-java-streams/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java
diff --git a/core-java-modules/core-java-string-apis/README.md b/core-java-modules/core-java-string-apis/README.md
new file mode 100644
index 0000000000..fc36ba8640
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/README.md
@@ -0,0 +1,12 @@
+## Java String APIs
+
+This module contains articles about string APIs.
+
+### Relevant Articles:
+- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner)
+- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer)
+- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter)
+- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer)
+- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string)
+- [StringBuilder and 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)
diff --git a/core-java-modules/core-java-string-apis/pom.xml b/core-java-modules/core-java-string-apis/pom.xml
new file mode 100644
index 0000000000..7d9d888fa1
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/pom.xml
@@ -0,0 +1,55 @@
+
+ 4.0.0
+ core-java-string-apis
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-string-apis
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+ org.passay
+ passay
+ ${passay.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+
+
+ core-java-string-apis
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 1.3.1
+ 1.4
+
+
+
diff --git a/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
similarity index 99%
rename from java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
index 46af4d7c51..d49b13c9c9 100644
--- a/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/password/RandomPasswordGenerator.java
@@ -1,4 +1,11 @@
-package com.baeldung.string.password;
+package com.baeldung.password;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.text.RandomStringGenerator;
+import org.passay.CharacterRule;
+import org.passay.EnglishCharacterData;
+import org.passay.CharacterData;
+import org.passay.PasswordGenerator;
import java.security.SecureRandom;
import java.util.Collections;
@@ -8,13 +15,6 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.text.RandomStringGenerator;
-import org.passay.CharacterData;
-import org.passay.CharacterRule;
-import org.passay.EnglishCharacterData;
-import org.passay.PasswordGenerator;
-
public class RandomPasswordGenerator {
/**
diff --git a/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
new file mode 100644
index 0000000000..5ab506f259
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/streamtokenizer/StreamTokenizerDemo.java
@@ -0,0 +1,76 @@
+package com.baeldung.streamtokenizer;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class StreamTokenizerDemo {
+
+ private static final String INPUT_FILE = "/stream-tokenizer-example.txt";
+ private static final int QUOTE_CHARACTER = '\'';
+ private static final int DOUBLE_QUOTE_CHARACTER = '"';
+
+ public static List streamTokenizerWithDefaultConfiguration(Reader reader) throws IOException {
+ StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
+ List tokens = new ArrayList<>();
+
+ int currentToken = streamTokenizer.nextToken();
+ while (currentToken != StreamTokenizer.TT_EOF) {
+
+ if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {
+ tokens.add(streamTokenizer.nval);
+ } else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD
+ || streamTokenizer.ttype == QUOTE_CHARACTER
+ || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {
+ tokens.add(streamTokenizer.sval);
+ } else {
+ tokens.add((char) currentToken);
+ }
+
+ currentToken = streamTokenizer.nextToken();
+ }
+
+ return tokens;
+ }
+
+ public static List streamTokenizerWithCustomConfiguration(Reader reader) throws IOException {
+ StreamTokenizer streamTokenizer = new StreamTokenizer(reader);
+ List tokens = new ArrayList<>();
+
+ streamTokenizer.wordChars('!', '-');
+ streamTokenizer.ordinaryChar('/');
+ streamTokenizer.commentChar('#');
+ streamTokenizer.eolIsSignificant(true);
+
+ int currentToken = streamTokenizer.nextToken();
+ while (currentToken != StreamTokenizer.TT_EOF) {
+
+ if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {
+ tokens.add(streamTokenizer.nval);
+ } else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD
+ || streamTokenizer.ttype == QUOTE_CHARACTER
+ || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {
+ tokens.add(streamTokenizer.sval);
+ } else {
+ tokens.add((char) currentToken);
+ }
+ currentToken = streamTokenizer.nextToken();
+ }
+
+ return tokens;
+ }
+
+ public static Reader createReaderFromFile() throws FileNotFoundException {
+ String inputFile = StreamTokenizerDemo.class.getResource(INPUT_FILE).getFile();
+ return new FileReader(inputFile);
+ }
+
+ public static void main(String[] args) throws IOException {
+ List tokens1 = streamTokenizerWithDefaultConfiguration(createReaderFromFile());
+ List tokens2 = streamTokenizerWithCustomConfiguration(createReaderFromFile());
+
+ System.out.println(tokens1);
+ System.out.println(tokens2);
+ }
+
+}
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/StringBufferStringBuilder.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
similarity index 89%
rename from java-strings/src/main/java/com/baeldung/string/StringBufferStringBuilder.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
index 72af4a9aee..50c139e2d3 100644
--- a/java-strings/src/main/java/com/baeldung/string/StringBufferStringBuilder.java
+++ b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringbuilderstringbuffer/StringBuilderStringBuffer.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.stringbuilderstringbuffer;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Scope;
@@ -8,12 +8,12 @@ import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
-public class StringBufferStringBuilder {
+public class StringBuilderStringBuffer {
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
- .include(StringBufferStringBuilder.class.getSimpleName())
+ .include(StringBuilderStringBuffer.class.getSimpleName())
.build();
new Runner(opt).run();
diff --git a/java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java b/core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
rename to core-java-modules/core-java-string-apis/src/main/java/com/baeldung/stringtokenizer/MyTokenizer.java
diff --git a/java-strings/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
index 916a3c79ff..aa15345bcb 100644
--- a/java-strings/src/test/java/com/baeldung/string/CharSequenceVsStringUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/charsequence/CharSequenceVsStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.charsequence;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
similarity index 96%
rename from java-strings/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
index 648fdaf65a..549c889028 100644
--- a/java-strings/src/test/java/com/baeldung/string/formatter/StringFormatterExampleUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/formatter/StringFormatterExampleUnitTest.java
@@ -1,12 +1,12 @@
-package com.baeldung.string.formatter;
+package com.baeldung.formatter;
+
+import org.junit.Test;
import java.util.Calendar;
import java.util.Formatter;
import java.util.GregorianCalendar;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import org.junit.Test;
+
+import static org.junit.Assert.*;
public class StringFormatterExampleUnitTest {
diff --git a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
index bfd4b0fe8e..7fb55ad1cb 100644
--- a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/password/StringPasswordUnitTest.java
@@ -1,9 +1,9 @@
-package com.baeldung.string.password;
-
-import static org.junit.Assert.assertTrue;
+package com.baeldung.password;
import org.junit.Test;
+import static org.junit.Assert.assertTrue;
+
/**
* Examples of passwords conforming to various specifications, using different libraries.
*
diff --git a/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
new file mode 100644
index 0000000000..29214167be
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/streamtokenizer/StreamTokenizerDemoUnitTest.java
@@ -0,0 +1,34 @@
+package com.baeldung.streamtokenizer;
+
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertArrayEquals;
+
+public class StreamTokenizerDemoUnitTest {
+
+ @Test
+ public void whenStreamTokenizerWithDefaultConfigurationIsCalled_ThenCorrectTokensAreReturned() throws IOException {
+ Reader reader = StreamTokenizerDemo.createReaderFromFile();
+ List expectedTokens = Arrays.asList(3.0, "quick", "brown", "foxes", "jump", "over", "the", "lazy", "dog", '!', '#', "test1");
+
+ List actualTokens = StreamTokenizerDemo.streamTokenizerWithDefaultConfiguration(reader);
+
+ assertArrayEquals(expectedTokens.toArray(), actualTokens.toArray());
+ }
+
+ @Test
+ public void whenStreamTokenizerWithCustomConfigurationIsCalled_ThenCorrectTokensAreReturned() throws IOException {
+ Reader reader = StreamTokenizerDemo.createReaderFromFile();
+ List expectedTokens = Arrays.asList(3.0, "quick", "brown", "foxes", "jump", "over", "the", "\"lazy\"", "dog!", '\n', '\n', '/', '/', "test2");
+
+ List actualTokens = StreamTokenizerDemo.streamTokenizerWithCustomConfiguration(reader);
+
+ assertArrayEquals(expectedTokens.toArray(), actualTokens.toArray());
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
index a72f811336..89f91acd6e 100644
--- a/java-strings/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
+++ b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringjoiner/StringJoinerUnitTest.java
@@ -1,6 +1,6 @@
package com.baeldung.stringjoiner;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
@@ -8,7 +8,7 @@ import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class StringJoinerUnitTest {
private final String DELIMITER_COMMA = ",";
diff --git a/java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java b/core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
rename to core-java-modules/core-java-string-apis/src/test/java/com/baeldung/stringtokenizer/TokenizerUnitTest.java
diff --git a/core-java-modules/core-java-string-apis/src/test/resources/data.csv b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
new file mode 100644
index 0000000000..ec4ac10443
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/resources/data.csv
@@ -0,0 +1,3 @@
+1|IND|India
+2|MY|Malaysia
+3|AU|Australia
diff --git a/core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt b/core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
new file mode 100644
index 0000000000..6efe4fdc81
--- /dev/null
+++ b/core-java-modules/core-java-string-apis/src/test/resources/stream-tokenizer-example.txt
@@ -0,0 +1,3 @@
+3 quick brown foxes jump over the "lazy" dog!
+#test1
+//test2
\ 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
new file mode 100644
index 0000000000..b4da1b8bad
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/README.md
@@ -0,0 +1,9 @@
+## Java String Conversions
+
+This module contains articles about string conversions from/to another type.
+
+### Relevant Articles:
+- [Java String Conversions](https://www.baeldung.com/java-string-conversions)
+- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array)
+- [Convert Char Array to String](https://www.baeldung.com/java-char-array-to-string)
+- 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
new file mode 100644
index 0000000000..396d836e6b
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/pom.xml
@@ -0,0 +1,47 @@
+
+ 4.0.0
+ core-java-string-conversions-2
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-string-conversions-2
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+
+
+ core-java-string-conversions-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
diff --git a/java-strings/src/main/java/com/baeldung/datetime/UseLocalDateTime.java b/core-java-modules/core-java-string-conversions-2/src/main/java/com/baeldung/stringconversions/UseLocalDateTime.java
similarity index 84%
rename from java-strings/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
rename to core-java-modules/core-java-string-conversions-2/src/main/java/com/baeldung/stringconversions/UseLocalDateTime.java
index 7f39ac2f91..7b43c3b588 100644
--- a/java-strings/src/main/java/com/baeldung/datetime/UseLocalDateTime.java
+++ b/core-java-modules/core-java-string-conversions-2/src/main/java/com/baeldung/stringconversions/UseLocalDateTime.java
@@ -1,4 +1,4 @@
-package com.baeldung.datetime;
+package com.baeldung.stringconversions;
import java.time.LocalDateTime;
diff --git a/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/chararraytostring/CharArrayToStringConversionUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/chararraytostring/CharArrayToStringConversionUnitTest.java
new file mode 100644
index 0000000000..dc68632f0b
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/chararraytostring/CharArrayToStringConversionUnitTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.chararraytostring;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import com.google.common.base.Joiner;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class CharArrayToStringConversionUnitTest {
+
+ @Test
+ public void whenStringConstructor_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = new String(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringCopyValueOf_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = String.copyValueOf(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringValueOf_thenOK() {
+ final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = String.valueOf(charArray);
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenStringBuilder_thenOK() {
+ final char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } };
+
+ StringBuilder sb = new StringBuilder();
+ for (char[] subArray : arrayOfCharArray) {
+ sb.append(subArray);
+ }
+
+ assertThat(sb.toString(), is("baeldung"));
+ }
+
+ @Test
+ public void whenStreamCollectors_thenOK() {
+ final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ Stream charStream = Arrays.stream(charArray);
+ String string = charStream.map(String::valueOf).collect(Collectors.joining());
+
+ assertThat(string, is("baeldung"));
+ }
+
+ @Test
+ public void whenGoogleCommonBaseJoiners_thenOK() {
+ final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' };
+
+ String string = Joiner.on("|").join(charArray);
+
+ assertThat(string, is("b|a|e|l|d|u|n|g"));
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/java/conversion/StringConversionUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringconversions/StringConversionUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/java/conversion/StringConversionUnitTest.java
rename to core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringconversions/StringConversionUnitTest.java
index fbbbb21ccd..d896b92b5c 100644
--- a/java-strings/src/test/java/com/baeldung/java/conversion/StringConversionUnitTest.java
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringconversions/StringConversionUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.conversion;
+package com.baeldung.stringconversions;
import static org.junit.Assert.assertEquals;
@@ -13,8 +13,6 @@ import java.util.GregorianCalendar;
import org.junit.Test;
-import com.baeldung.datetime.UseLocalDateTime;
-
public class StringConversionUnitTest {
@Test
diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/ByteArrayToStringUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java
rename to core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/ByteArrayToStringUnitTest.java
index a9f8a04c8d..e5efffd8f7 100644
--- a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/ByteArrayToStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.conversion;
+package com.baeldung.stringtobytearray;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/StringToByteArrayUnitTest.java
similarity index 99%
rename from java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java
rename to core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/StringToByteArrayUnitTest.java
index 5377b4b28d..961c99bbde 100644
--- a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java
+++ b/core-java-modules/core-java-string-conversions-2/src/test/java/com/baeldung/stringtobytearray/StringToByteArrayUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string.conversion;
+package com.baeldung.stringtobytearray;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/core-java-modules/core-java-string-conversions/README.md b/core-java-modules/core-java-string-conversions/README.md
new file mode 100644
index 0000000000..849660e482
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions/README.md
@@ -0,0 +1,16 @@
+## Java String Conversions
+
+This module contains articles about string conversions from/to another type.
+
+### Relevant Articles:
+- [Converting String to Stream of chars](https://www.baeldung.com/java-string-to-stream)
+- [Converting Strings to Enums in Java](https://www.baeldung.com/java-string-to-enum)
+- [Convert a String to Title Case](https://www.baeldung.com/java-string-title-case)
+- [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string)
+- [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 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
diff --git a/core-java-modules/core-java-string-conversions/pom.xml b/core-java-modules/core-java-string-conversions/pom.xml
new file mode 100644
index 0000000000..9c968b7f1c
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions/pom.xml
@@ -0,0 +1,67 @@
+
+ 4.0.0
+ core-java-string-conversions
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-string-conversions
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ com.ibm.icu
+ icu4j
+ ${icu4j.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+
+
+ core-java-string-conversions
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ 61.1
+ 3.6.1
+
+
+
diff --git a/java-strings/src/main/java/com/baeldung/enums/PizzaStatusEnum.java b/core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/stringtoenum/PizzaStatusEnum.java
similarity index 95%
rename from java-strings/src/main/java/com/baeldung/enums/PizzaStatusEnum.java
rename to core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/stringtoenum/PizzaStatusEnum.java
index a84829c38d..02646ef997 100644
--- a/java-strings/src/main/java/com/baeldung/enums/PizzaStatusEnum.java
+++ b/core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/stringtoenum/PizzaStatusEnum.java
@@ -1,4 +1,4 @@
-package com.baeldung.enums;
+package com.baeldung.stringtoenum;
public enum PizzaStatusEnum {
ORDERED(5) {
diff --git a/java-strings/src/main/java/com/baeldung/string/TitleCaseConverter.java b/core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/titlecase/TitleCaseConverter.java
similarity index 98%
rename from java-strings/src/main/java/com/baeldung/string/TitleCaseConverter.java
rename to core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/titlecase/TitleCaseConverter.java
index 81043f6dac..1c35e1a2d6 100644
--- a/java-strings/src/main/java/com/baeldung/string/TitleCaseConverter.java
+++ b/core-java-modules/core-java-string-conversions/src/main/java/com/baeldung/titlecase/TitleCaseConverter.java
@@ -1,12 +1,11 @@
-package com.baeldung.string;
-
-import java.util.Arrays;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.text.WordUtils;
+package com.baeldung.titlecase;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.BreakIterator;
+import org.apache.commons.lang3.text.WordUtils;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
public class TitleCaseConverter {
diff --git a/java-strings/src/test/java/com/baeldung/CharToStringUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/chartostring/CharToStringUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/CharToStringUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/chartostring/CharToStringUnitTest.java
index 78742e356d..db7c8a16ec 100644
--- a/java-strings/src/test/java/com/baeldung/CharToStringUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/chartostring/CharToStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.chartostring;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
index d760510c73..221900fb0e 100644
--- a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/datetostring/DateToStringFormatterUnitTest.java
@@ -1,6 +1,7 @@
-package com.baeldung.string.formatter;
+package com.baeldung.datetostring;
-import static org.junit.Assert.assertEquals;
+import org.junit.BeforeClass;
+import org.junit.Test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
@@ -13,8 +14,7 @@ import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class DateToStringFormatterUnitTest {
diff --git a/java-strings/src/test/java/com/baeldung/fileToBase64StringConversion/FileToBase64StringConversionUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/filetobase64conversion/FileToBase64StringConversionUnitTest.java
similarity index 96%
rename from java-strings/src/test/java/com/baeldung/fileToBase64StringConversion/FileToBase64StringConversionUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/filetobase64conversion/FileToBase64StringConversionUnitTest.java
index eef21a98c9..9b165069d6 100644
--- a/java-strings/src/test/java/com/baeldung/fileToBase64StringConversion/FileToBase64StringConversionUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/filetobase64conversion/FileToBase64StringConversionUnitTest.java
@@ -1,13 +1,13 @@
-package com.baeldung.fileToBase64StringConversion;
+package com.baeldung.filetobase64conversion;
-import static org.junit.Assert.assertTrue;
+import org.apache.commons.io.FileUtils;
+import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Base64;
-import org.apache.commons.io.FileUtils;
-import org.junit.Test;
+import static org.junit.Assert.assertTrue;
public class FileToBase64StringConversionUnitTest {
diff --git a/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtodouble/StringToDoubleConversionUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtodouble/StringToDoubleConversionUnitTest.java
new file mode 100644
index 0000000000..e29b55d52a
--- /dev/null
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtodouble/StringToDoubleConversionUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.stringtodouble;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.DecimalFormat;
+import java.text.ParseException;
+
+import org.junit.Test;
+
+public class StringToDoubleConversionUnitTest {
+
+ @Test
+ public void givenValidString_WhenParseDouble_ThenResultIsPrimitiveDouble() {
+ assertEquals(1.23, Double.parseDouble("1.23"), 0.000001);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenParseDouble_ThenNullPointerExceptionIsThrown() {
+ Double.parseDouble(null);
+ }
+
+ @Test(expected = NumberFormatException.class)
+ public void givenInalidString_WhenParseDouble_ThenNumberFormatExceptionIsThrown() {
+ Double.parseDouble("&");
+ }
+
+ @Test
+ public void givenValidString_WhenValueOf_ThenResultIsPrimitiveDouble() {
+ assertEquals(1.23, Double.valueOf("1.23"), 0.000001);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenValueOf_ThenNullPointerExceptionIsThrown() {
+ Double.valueOf(null);
+ }
+
+ @Test(expected = NumberFormatException.class)
+ public void givenInalidString_WhenValueOf_ThenNumberFormatExceptionIsThrown() {
+ Double.valueOf("&");
+ }
+
+ @Test
+ public void givenValidString_WhenDecimalFormat_ThenResultIsValidDouble() throws ParseException {
+ assertEquals(1.23, new DecimalFormat("#").parse("1.23").doubleValue(), 0.000001);
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenNullString_WhenDecimalFormat_ThenNullPointerExceptionIsThrown() throws ParseException {
+ new DecimalFormat("#").parse(null);
+ }
+
+ @Test(expected = ParseException.class)
+ public void givenInvalidString_WhenDecimalFormat_ThenParseExceptionIsThrown() throws ParseException {
+ new DecimalFormat("#").parse("&");
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoenum/StringToEnumUnitTest.java
similarity index 92%
rename from java-strings/src/test/java/com/baeldung/enums/PizzaUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoenum/StringToEnumUnitTest.java
index 3e52a89bad..f6b3bf2aa6 100644
--- a/java-strings/src/test/java/com/baeldung/enums/PizzaUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoenum/StringToEnumUnitTest.java
@@ -1,10 +1,10 @@
-package com.baeldung.enums;
+package com.baeldung.stringtoenum;
import static junit.framework.TestCase.assertTrue;
import org.junit.Test;
-public class PizzaUnitTest {
+public class StringToEnumUnitTest {
@Test
public void whenConvertedIntoEnum_thenGetsConvertedCorrectly() {
diff --git a/java-strings/src/test/java/com/baeldung/StringToIntOrIntegerUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoint/StringToIntOrIntegerUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/StringToIntOrIntegerUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoint/StringToIntOrIntegerUnitTest.java
index a7ad0bf114..106f1fc974 100644
--- a/java-strings/src/test/java/com/baeldung/StringToIntOrIntegerUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtoint/StringToIntOrIntegerUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package com.baeldung.stringtoint;
import static org.assertj.core.api.Assertions.assertThat;
diff --git a/java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtolist/ConvertStringToListUnitTest.java
similarity index 96%
rename from java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtolist/ConvertStringToListUnitTest.java
index 47357a99cc..b9e0cede31 100644
--- a/java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtolist/ConvertStringToListUnitTest.java
@@ -1,135 +1,134 @@
-package com.baeldung;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
-import com.google.common.base.Function;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-
-public class ConvertStringToListUnitTest {
-
- private final String countries = "Russia,Germany,England,France,Italy";
- private final String ranks = "1,2,3,4,5, 6,7";
- private final String emptyStrings = ",,,,,";
- private final List expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
- private final List expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
- private final List expectedEmptyStringsList = Arrays.asList("", "", "", "", "", "");
-
- @Test
- public void givenString_thenGetListOfStringByJava() {
- List convertedCountriesList = Arrays.asList(countries.split(",", -1));
-
- assertEquals(expectedCountriesList, convertedCountriesList);
- }
-
- @Test
- public void givenString_thenGetListOfStringByApache() {
- List convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));
-
- assertEquals(expectedCountriesList, convertedCountriesList);
- }
-
- @Test
- public void givenString_thenGetListOfStringByGuava() {
- List convertedCountriesList = Splitter.on(",")
- .trimResults()
- .splitToList(countries);
-
- assertEquals(expectedCountriesList, convertedCountriesList);
- }
-
- @Test
- public void givenString_thenGetListOfStringByJava8() {
- List convertedCountriesList = Stream.of(countries.split(",", -1))
- .collect(Collectors.toList());
-
- assertEquals(expectedCountriesList, convertedCountriesList);
- }
-
- @Test
- public void givenString_thenGetListOfIntegerByJava() {
- String[] convertedRankArray = ranks.split(",");
- List convertedRankList = new ArrayList();
- for (String number : convertedRankArray) {
- convertedRankList.add(Integer.parseInt(number.trim()));
- }
-
- assertEquals(expectedRanksList, convertedRankList);
- }
-
- @Test
- public void givenString_thenGetListOfIntegerByGuava() {
- List convertedRankList = Lists.transform(Splitter.on(",")
- .trimResults()
- .splitToList(ranks), new Function() {
- @Override
- public Integer apply(String input) {
- return Integer.parseInt(input.trim());
- }
- });
-
- assertEquals(expectedRanksList, convertedRankList);
- }
-
- @Test
- public void givenString_thenGetListOfIntegerByJava8() {
- List convertedRankList = Stream.of(ranks.split(","))
- .map(String::trim)
- .map(Integer::parseInt)
- .collect(Collectors.toList());
-
- assertEquals(expectedRanksList, convertedRankList);
- }
-
- @Test
- public void givenString_thenGetListOfIntegerByApache() {
- String[] convertedRankArray = StringUtils.split(ranks, ",");
- List convertedRankList = new ArrayList();
- for (String number : convertedRankArray) {
- convertedRankList.add(Integer.parseInt(number.trim()));
- }
-
- assertEquals(expectedRanksList, convertedRankList);
- }
-
- @Test
- public void givenEmptyStrings_thenGetListOfStringByJava() {
- List convertedEmptyStringsList = Arrays.asList(emptyStrings.split(",", -1));
-
- assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
- }
-
- @Test
- public void givenEmptyStrings_thenGetListOfStringByApache() {
- List convertedEmptyStringsList = Arrays.asList(StringUtils.splitPreserveAllTokens(emptyStrings, ","));
-
- assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
- }
-
- @Test
- public void givenEmptyStrings_thenGetListOfStringByGuava() {
- List convertedEmptyStringsList = Splitter.on(",")
- .trimResults()
- .splitToList(emptyStrings);
-
- assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
- }
-
- @Test
- public void givenEmptyStrings_thenGetListOfStringByJava8() {
- List convertedEmptyStringsList = Stream.of(emptyStrings.split(",", -1))
- .collect(Collectors.toList());
-
- assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
- }
-
-}
+package com.baeldung.stringtolist;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+
+public class ConvertStringToListUnitTest {
+
+ private final String countries = "Russia,Germany,England,France,Italy";
+ private final String ranks = "1,2,3,4,5, 6,7";
+ private final String emptyStrings = ",,,,,";
+ private final List expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy");
+ private final List expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
+ private final List expectedEmptyStringsList = Arrays.asList("", "", "", "", "", "");
+
+ @Test
+ public void givenString_thenGetListOfStringByJava() {
+ List convertedCountriesList = Arrays.asList(countries.split(",", -1));
+
+ assertEquals(expectedCountriesList, convertedCountriesList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfStringByApache() {
+ List convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ","));
+
+ assertEquals(expectedCountriesList, convertedCountriesList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfStringByGuava() {
+ List convertedCountriesList = Splitter.on(",")
+ .trimResults()
+ .splitToList(countries);
+
+ assertEquals(expectedCountriesList, convertedCountriesList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfStringByJava8() {
+ List convertedCountriesList = Stream.of(countries.split(",", -1))
+ .collect(Collectors.toList());
+
+ assertEquals(expectedCountriesList, convertedCountriesList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfIntegerByJava() {
+ String[] convertedRankArray = ranks.split(",");
+ List convertedRankList = new ArrayList();
+ for (String number : convertedRankArray) {
+ convertedRankList.add(Integer.parseInt(number.trim()));
+ }
+
+ assertEquals(expectedRanksList, convertedRankList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfIntegerByGuava() {
+ List convertedRankList = Lists.transform(Splitter.on(",")
+ .trimResults()
+ .splitToList(ranks), new Function() {
+ @Override
+ public Integer apply(String input) {
+ return Integer.parseInt(input.trim());
+ }
+ });
+
+ assertEquals(expectedRanksList, convertedRankList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfIntegerByJava8() {
+ List convertedRankList = Stream.of(ranks.split(","))
+ .map(String::trim)
+ .map(Integer::parseInt)
+ .collect(Collectors.toList());
+
+ assertEquals(expectedRanksList, convertedRankList);
+ }
+
+ @Test
+ public void givenString_thenGetListOfIntegerByApache() {
+ String[] convertedRankArray = StringUtils.split(ranks, ",");
+ List convertedRankList = new ArrayList();
+ for (String number : convertedRankArray) {
+ convertedRankList.add(Integer.parseInt(number.trim()));
+ }
+
+ assertEquals(expectedRanksList, convertedRankList);
+ }
+
+ @Test
+ public void givenEmptyStrings_thenGetListOfStringByJava() {
+ List convertedEmptyStringsList = Arrays.asList(emptyStrings.split(",", -1));
+
+ assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
+ }
+
+ @Test
+ public void givenEmptyStrings_thenGetListOfStringByApache() {
+ List convertedEmptyStringsList = Arrays.asList(StringUtils.splitPreserveAllTokens(emptyStrings, ","));
+
+ assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
+ }
+
+ @Test
+ public void givenEmptyStrings_thenGetListOfStringByGuava() {
+ List convertedEmptyStringsList = Splitter.on(",")
+ .trimResults()
+ .splitToList(emptyStrings);
+
+ assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
+ }
+
+ @Test
+ public void givenEmptyStrings_thenGetListOfStringByJava8() {
+ List convertedEmptyStringsList = Stream.of(emptyStrings.split(",", -1))
+ .collect(Collectors.toList());
+
+ assertEquals(expectedEmptyStringsList, convertedEmptyStringsList);
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtostream/StringToCharStreamUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtostream/StringToCharStreamUnitTest.java
index 1b02e5d291..cd5727dcf8 100644
--- a/java-strings/src/test/java/com/baeldung/string/StringToCharStreamUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/stringtostream/StringToCharStreamUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.stringtostream;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/titlecase/TitleCaseConverterUnitTest.java
similarity index 99%
rename from java-strings/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java
rename to core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/titlecase/TitleCaseConverterUnitTest.java
index 2272565cd3..73694d2c1c 100644
--- a/java-strings/src/test/java/com/baeldung/string/TitleCaseConverterUnitTest.java
+++ b/core-java-modules/core-java-string-conversions/src/test/java/com/baeldung/titlecase/TitleCaseConverterUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.titlecase;
import org.junit.Assert;
import org.junit.Test;
diff --git a/java-strings/src/test/resources/test_image.jpg b/core-java-modules/core-java-string-conversions/src/test/resources/test_image.jpg
similarity index 100%
rename from java-strings/src/test/resources/test_image.jpg
rename to core-java-modules/core-java-string-conversions/src/test/resources/test_image.jpg
diff --git a/core-java-modules/core-java-sun/README.md b/core-java-modules/core-java-sun/README.md
index e2dba76b41..107035cbe8 100644
--- a/core-java-modules/core-java-sun/README.md
+++ b/core-java-modules/core-java-sun/README.md
@@ -1,7 +1,8 @@
-=========
+## Core Java Sun
-## Core Java Cookbooks and Examples
+This module contains articles about the sun package
### Relevant Articles:
+
- [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin)
- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe)
\ No newline at end of file
diff --git a/core-java-modules/core-java-sun/pom.xml b/core-java-modules/core-java-sun/pom.xml
index ab5f945114..7774d1f9b3 100644
--- a/core-java-modules/core-java-sun/pom.xml
+++ b/core-java-modules/core-java-sun/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
core-java-sun
0.1.0-SNAPSHOT
core-java-sun
@@ -15,76 +14,6 @@
-
-
- net.sourceforge.collections
- collections-generic
- ${collections-generic.version}
-
-
- org.apache.commons
- commons-collections4
- ${commons-collections4.version}
-
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
-
- org.apache.commons
- commons-math3
- ${commons-math3.version}
-
-
- org.decimal4j
- decimal4j
- ${decimal4j.version}
-
-
- org.bouncycastle
- bcprov-jdk15on
- ${bouncycastle.version}
-
-
- org.unix4j
- unix4j-command
- ${unix4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
-
-
-
-
- com.fasterxml.jackson.core
- jackson-databind
- ${jackson.version}
-
-
-
- log4j
- log4j
- ${log4j.version}
-
-
- org.slf4j
- log4j-over-slf4j
- ${org.slf4j.version}
-
-
- org.projectlombok
- lombok
- ${lombok.version}
- provided
-
org.assertj
@@ -92,62 +21,6 @@
${assertj.version}
test
-
- com.jayway.awaitility
- awaitility
- ${avaitility.version}
- test
-
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
-
- org.javamoney
- moneta
- ${moneta.version}
-
-
- org.owasp.esapi
- esapi
- ${esapi.version}
-
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator.version}
-
-
- org.springframework
- spring-web
- ${spring-web.version}
-
com.sun
tools
@@ -204,32 +77,6 @@
integration
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
org.codehaus.mojo
exec-maven-plugin
@@ -261,29 +108,11 @@
-
-
- 23.0
- 1.55
- 1.10
- 3.6.1
- 1.0.3
- 4.1
- 4.01
- 0.4
- 1.8.7
- 4.6-b01
- 1.13
- 0.6.5
- 0.9.0
- 4.3.4.RELEASE
-
3.6.1
1.7.0
- 2.21.0
1.8.0
3.0.2
diff --git a/core-java-modules/core-java-text/README.md b/core-java-modules/core-java-text/README.md
new file mode 100644
index 0000000000..5a6db4e8fd
--- /dev/null
+++ b/core-java-modules/core-java-text/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java 8 Cookbooks and Examples
+
+### Relevant Articles:
+- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance)
\ No newline at end of file
diff --git a/core-java-modules/core-java-text/pom.xml b/core-java-modules/core-java-text/pom.xml
new file mode 100644
index 0000000000..43b0df6309
--- /dev/null
+++ b/core-java-modules/core-java-text/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ core-java-text
+ 0.1.0-SNAPSHOT
+ core-java-text
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+ core-java-text
+
+
+ src/main/resources
+ true
+
+
+
+
+
diff --git a/spring-boot-angular-ecommerce/src/main/resources/logback.xml b/core-java-modules/core-java-text/src/main/resources/logback.xml
similarity index 100%
rename from spring-boot-angular-ecommerce/src/main/resources/logback.xml
rename to core-java-modules/core-java-text/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java-time-measurements/README.md b/core-java-modules/core-java-time-measurements/README.md
new file mode 100644
index 0000000000..1bd277b6b1
--- /dev/null
+++ b/core-java-modules/core-java-time-measurements/README.md
@@ -0,0 +1,8 @@
+## Java Time Measurements
+
+This module contains articles about the measurement of time in Java.
+
+### Relevant Articles:
+- [Guide to the Java Clock Class](http://www.baeldung.com/java-clock)
+- [Measure Elapsed Time in Java](http://www.baeldung.com/java-measure-elapsed-time)
+- [Overriding System Time for Testing in Java](https://www.baeldung.com/java-override-system-time)
diff --git a/core-java-modules/core-java-time-measurements/pom.xml b/core-java-modules/core-java-time-measurements/pom.xml
new file mode 100644
index 0000000000..0ff3787051
--- /dev/null
+++ b/core-java-modules/core-java-time-measurements/pom.xml
@@ -0,0 +1,102 @@
+
+ 4.0.0
+ com.baeldung.exception.numberformat
+ core-java-time-measurements
+ 0.0.1-SNAPSHOT
+ jar
+ core-java-time-measurements
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ joda-time
+ joda-time
+ ${joda.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${asspectj.version}
+
+
+ org.powermock
+ powermock-module-junit4
+ ${powermock.version}
+ test
+
+
+ org.powermock
+ powermock-api-mockito2
+ ${powermock.version}
+ test
+
+
+ org.jmockit
+ jmockit
+ ${jmockit.version}
+ test
+
+
+
+
+ core-java-time-measurements
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+
+ true
+
+
+
+
+
+
+
+ 3.6.1
+ 2.10
+
+ 3.6.1
+ 1.8.9
+ 2.0.0-RC.4
+ 1.44
+
+ 2.22.1
+
+
diff --git a/spring-boot-ops/src/main/resources/logback.xml b/core-java-modules/core-java-time-measurements/src/main/resources/logback.xml
similarity index 100%
rename from spring-boot-ops/src/main/resources/logback.xml
rename to core-java-modules/core-java-time-measurements/src/main/resources/logback.xml
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/clock/ClockUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/java/clock/ClockUnitTest.java
similarity index 100%
rename from core-java-modules/core-java/src/test/java/com/baeldung/java/clock/ClockUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/java/clock/ClockUnitTest.java
diff --git a/java-dates/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java
similarity index 100%
rename from java-dates/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/ElapsedTimeUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java
similarity index 100%
rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java
rename to core-java-modules/core-java-time-measurements/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java
diff --git a/core-java-modules/core-java/README.md b/core-java-modules/core-java/README.md
index 436a481803..41275f6367 100644
--- a/core-java-modules/core-java/README.md
+++ b/core-java-modules/core-java/README.md
@@ -1,18 +1,12 @@
-=========
-
## Core Java Cookbooks and Examples
### Relevant Articles:
- [Java Timer](http://www.baeldung.com/java-timer-and-timertask)
-- [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java)
-- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
- [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java)
- [Getting Started with Java Properties](http://www.baeldung.com/java-properties)
-- [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java)
- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven)
- [Introduction to Nashorn](http://www.baeldung.com/java-nashorn)
- [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency)
-- [JVM Log Forging](http://www.baeldung.com/jvm-log-forging)
- [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend)
- [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null)
- [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method)
@@ -24,16 +18,12 @@
- [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)
-- [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os)
- [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java)
- [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid)
- [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle)
-- [Class Loaders in Java](http://www.baeldung.com/java-classloaders)
-- [Guide to the Java Clock Class](http://www.baeldung.com/java-clock)
- [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class)
- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler)
- [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object)
-- [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation)
- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions)
- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception)
- [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties)
diff --git a/core-java-modules/core-java/pom.xml b/core-java-modules/core-java/pom.xml
index 2a2cb3a6af..9d4bee081e 100644
--- a/core-java-modules/core-java/pom.xml
+++ b/core-java-modules/core-java/pom.xml
@@ -14,16 +14,6 @@
-
- commons-io
- commons-io
- ${commons-io.version}
-
-
- org.apache.commons
- commons-lang3
- ${commons-lang3.version}
-
org.unix4j
unix4j-command
@@ -41,11 +31,6 @@
jackson-databind
${jackson.version}
-
- com.google.code.gson
- gson
- ${gson.version}
-
log4j
@@ -75,59 +60,6 @@
moneta
${javamoney.moneta.version}
-
- org.owasp.esapi
- esapi
- ${esapi.version}
-
-
- com.sun.messaging.mq
- fscontext
- ${fscontext.version}
-
-
- com.codepoetics
- protonpack
- ${protonpack.version}
-
-
- one.util
- streamex
- ${streamex.version}
-
-
- io.vavr
- vavr
- ${vavr.version}
-
-
- org.openjdk.jmh
- jmh-core
- ${jmh-core.version}
-
-
- org.openjdk.jmh
- jmh-generator-annprocess
- ${jmh-generator-annprocess.version}
-
-
- com.h2database
- h2
- ${h2.version}
-
-
-
- org.javassist
- javassist
- ${javaassist.version}
-
-
- com.sun
- tools
- ${sun.tools.version}
- system
- ${java.home}/../lib/tools.jar
-
@@ -448,41 +380,21 @@
-
-
- 2.8.2
-
- 3.6.1
- 1.0.3
0.4
1.8.7
- 4.6-b01
- 1.13
- 0.6.5
- 0.9.0
-
+
3.10.0
- 2.21.0
-
1.1
- 2.1.0.1
- 1.19
-
- 1.19
+
3.0.0-M1
3.0.2
1.4.4
3.1.1
2.0.3.RELEASE
1.6.0
- 61.1
-
- 3.21.0-GA
-
- 1.8.0
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
index bdd92e37f6..1ed5f9e62a 100644
--- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java
@@ -1,10 +1,15 @@
package com.baeldung.encoding;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
public class CharacterEncodingExamples {
@@ -29,4 +34,12 @@ public class CharacterEncodingExamples {
}
return buffer.toString();
}
+
+ static String decodeText(String input, Charset charset, CodingErrorAction codingErrorAction) throws IOException {
+ CharsetDecoder charsetDecoder = charset.newDecoder();
+ charsetDecoder.onMalformedInput(codingErrorAction);
+ return new BufferedReader(
+ new InputStreamReader(
+ new ByteArrayInputStream(input.getBytes()), charsetDecoder)).readLine();
+ }
}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java
deleted file mode 100644
index 138916ec60..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class Arithmetic {
-
- private static Logger LOGGER = LoggerFactory.getLogger(Arithmetic.class);
-
- public static void main(String[] args) {
-
- try {
- int result = 30 / 0; // Trying to divide by zero
- } catch (ArithmeticException e) {
- LOGGER.error("ArithmeticException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java
deleted file mode 100644
index 93b53f284c..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ArrayIndexOutOfBounds {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ArrayIndexOutOfBounds.class);
-
- public static void main(String[] args) {
-
- int[] nums = new int[] { 1, 2, 3 };
-
- try {
- int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
- int numFromGreaterIndex = nums[4]; // Trying to access at greater index
- int numFromLengthIndex = nums[3]; // Trying to access at index equal to size of the array
- } catch (ArrayIndexOutOfBoundsException e) {
- LOGGER.error("ArrayIndexOutOfBoundsException caught");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java
deleted file mode 100644
index 183f8f54a3..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class Animal {
-
-}
-
-class Dog extends Animal {
-
-}
-
-class Lion extends Animal {
-
-}
-
-public class ClassCast {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ClassCast.class);
-
- public static void main(String[] args) {
-
- try {
- Animal animalOne = new Dog(); // At runtime the instance is dog
- Dog bruno = (Dog) animalOne; // Downcasting
-
- Animal animalTwo = new Lion(); // At runtime the instance is animal
- Dog tommy = (Dog) animalTwo; // Downcasting
- } catch (ClassCastException e) {
- LOGGER.error("ClassCastException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java
deleted file mode 100644
index bb9e0bf4ac..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class FileNotFound {
-
- private static Logger LOGGER = LoggerFactory.getLogger(FileNotFound.class);
-
- public static void main(String[] args) {
-
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new FileReader(new File("/invalid/file/location")));
- } catch (FileNotFoundException e) {
- LOGGER.error("FileNotFoundException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java
deleted file mode 100644
index ab46c83da4..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class GlobalExceptionHandler {
-
- public static void main(String[] args) {
-
- Handler globalExceptionHandler = new Handler();
- Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
- new GlobalExceptionHandler().performArithmeticOperation(10, 0);
- }
-
- public int performArithmeticOperation(int num1, int num2) {
- return num1/num2;
- }
-
-}
-
-class Handler implements Thread.UncaughtExceptionHandler {
-
- private static Logger LOGGER = LoggerFactory.getLogger(Handler.class);
-
- public void uncaughtException(Thread t, Throwable e) {
- LOGGER.info("Unhandled exception caught!");
- }
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java
deleted file mode 100644
index 801536cb2d..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IllegalArgument {
-
- private static Logger LOGGER = LoggerFactory.getLogger(IllegalArgument.class);
-
- public static void main(String[] args) {
- try {
- Thread.sleep(-1000);
- } catch (InterruptedException e) {
- LOGGER.error("IllegalArgumentException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java
deleted file mode 100644
index e8ddcea3c2..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IllegalState {
-
- private static Logger LOGGER = LoggerFactory.getLogger(IllegalState.class);
-
- public static void main(String[] args) {
-
- List intList = new ArrayList<>();
-
- for (int i = 0; i < 10; i++) {
- intList.add(i);
- }
-
- Iterator intListIterator = intList.iterator(); // Initialized with index at -1
-
- try {
- intListIterator.remove(); // IllegalStateException
- } catch (IllegalStateException e) {
- LOGGER.error("IllegalStateException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java
deleted file mode 100644
index 319fd33591..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-class ChildThread extends Thread {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ChildThread.class);
-
- public void run() {
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- LOGGER.error("InterruptedException caught!");
- }
- }
-
-}
-
-public class InterruptedExceptionExample {
-
- public static void main(String[] args) throws InterruptedException {
- ChildThread childThread = new ChildThread();
- childThread.start();
- childThread.interrupt();
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java
deleted file mode 100644
index 57fcddf76b..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MalformedURL {
-
- private static Logger LOGGER = LoggerFactory.getLogger(MalformedURL.class);
-
- public static void main(String[] args) {
-
- URL baeldungURL = null;
-
- try {
- baeldungURL = new URL("malformedurl");
- } catch (MalformedURLException e) {
- LOGGER.error("MalformedURLException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java
deleted file mode 100644
index 2402a786a9..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NullPointer {
-
- private static Logger LOGGER = LoggerFactory.getLogger(NullPointer.class);
-
- public static void main(String[] args) {
-
- Person personObj = null;
-
- try {
- String name = personObj.personName; // Accessing the field of a null object
- personObj.personName = "Jon Doe"; // Modifying the field of a null object
- } catch (NullPointerException e) {
- LOGGER.error("NullPointerException caught!");
- }
-
- }
-}
-
-class Person {
-
- public String personName;
-
- public String getPersonName() {
- return personName;
- }
-
- public void setPersonName(String personName) {
- this.personName = personName;
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java
deleted file mode 100644
index 7050e70aee..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NumberFormat {
-
- private static Logger LOGGER = LoggerFactory.getLogger(NumberFormat.class);
-
- public static void main(String[] args) {
-
- String str1 = "100ABCD";
-
- try {
- int x = Integer.parseInt(str1); // Converting string with inappropriate format
- int y = Integer.valueOf(str1);
- } catch (NumberFormatException e) {
- LOGGER.error("NumberFormatException caught!");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java
deleted file mode 100644
index f7fb4c91e4..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.baeldung.exceptions;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ParseExceptionExample {
-
- private static Logger LOGGER = LoggerFactory.getLogger(ParseExceptionExample.class);
-
- public static void main(String[] args) {
-
- DateFormat format = new SimpleDateFormat("MM, dd, yyyy");
-
- try {
- format.parse("01, , 2010");
- } catch (ParseException e) {
- LOGGER.error("ParseException caught!");
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java
deleted file mode 100644
index c6bf915996..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.apache.commons.lang3.exception.ExceptionUtils;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-public class StackTraceToString {
-
- public static void main(String[] args) {
- // Convert a StackTrace to String using core java
- try {
- throw new NullPointerException();
- } catch (Exception e) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
- e.printStackTrace(pw);
-
- System.out.println(sw.toString());
- }
-
- // Convert a StackTrace to String using Apache Commons
- try {
- throw new IndexOutOfBoundsException();
- } catch (Exception e) {
- System.out.println(ExceptionUtils.getStackTrace(e));
- }
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java
deleted file mode 100644
index bc297be498..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class StringIndexOutOfBounds {
-
- private static Logger LOGGER = LoggerFactory.getLogger(StringIndexOutOfBounds.class);
-
- public static void main(String[] args) {
-
- String str = "Hello World";
-
- try {
- char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
- char charAtLengthIndex = str.charAt(11); // Trying to access at index equal to size of the string
- } catch (StringIndexOutOfBoundsException e) {
- LOGGER.error("StringIndexOutOfBoundsException caught");
- }
-
- }
-
-}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java
new file mode 100644
index 0000000000..b2469ac984
--- /dev/null
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java
@@ -0,0 +1,46 @@
+package com.baeldung.jsonposturlconnection;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class PostJSONWithHttpURLConnection {
+
+ public static void main (String []args) throws IOException{
+ //Change the URL with any other publicly accessible POST resource, which accepts JSON request body
+ URL url = new URL ("https://reqres.in/api/users");
+
+ HttpURLConnection con = (HttpURLConnection)url.openConnection();
+ con.setRequestMethod("POST");
+
+ con.setRequestProperty("Content-Type", "application/json; utf-8");
+ con.setRequestProperty("Accept", "application/json");
+
+ con.setDoOutput(true);
+
+ //JSON String need to be constructed for the specific resource.
+ //We may construct complex JSON using any third-party JSON libraries such as jackson or org.json
+ String jsonInputString = "{\"name\": \"Upendra\", \"job\": \"Programmer\"}";
+
+ try(OutputStream os = con.getOutputStream()){
+ byte[] input = jsonInputString.getBytes("utf-8");
+ os.write(input, 0, input.length);
+ }
+
+ int code = con.getResponseCode();
+ System.out.println(code);
+
+ try(BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))){
+ StringBuilder response = new StringBuilder();
+ String responseLine = null;
+ while ((responseLine = br.readLine()) != null) {
+ response.append(responseLine.trim());
+ }
+ System.out.println(response.toString());
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/printscreen/README.md b/core-java-modules/core-java/src/main/java/com/baeldung/printscreen/README.md
deleted file mode 100644
index 7b3b40c102..0000000000
--- a/core-java-modules/core-java/src/main/java/com/baeldung/printscreen/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java)
diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
index dcf186de93..2659b29491 100644
--- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
+++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java
@@ -3,6 +3,7 @@ package com.baeldung.uuid;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
import java.util.UUID;
public class UUIDGenerator {
@@ -65,9 +66,9 @@ public class UUIDGenerator {
try {
md = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException nsae) {
- throw new InternalError("MD5 not supported", nsae);
+ throw new InternalError("SHA-1 not supported", nsae);
}
- byte[] bytes = md.digest(name);
+ byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16);
bytes[6] &= 0x0f; /* clear version */
bytes[6] |= 0x50; /* set to version 5 */
bytes[8] &= 0x3f; /* clear variant */
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
index 95b3605d95..fe3867a3c3 100644
--- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
+++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java
@@ -1,9 +1,24 @@
package com.baeldung.encoding;
+import java.io.BufferedReader;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.MalformedInputException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import org.junit.Assert;
import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
public class CharacterEncodingExamplesUnitTest {
@@ -58,4 +73,52 @@ public class CharacterEncodingExamplesUnitTest {
"0 0 10001010 10011110 ");
}
+ @Test
+ public void givenUTF8String_whenDecodeByUS_ASCII_thenIgnoreMalformedInputSequence() throws IOException {
+ Assertions.assertEquals("The faade pattern is a software design pattern.", CharacterEncodingExamples.decodeText("The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE));
+ }
+
+ @Test
+ public void givenUTF8String_whenDecodeByUS_ASCII_thenReplaceMalformedInputSequence() throws IOException {
+ Assertions.assertEquals(
+ "The fa��ade pattern is a software design pattern.",
+ CharacterEncodingExamples.decodeText(
+ "The façade pattern is a software design pattern.",
+ StandardCharsets.US_ASCII,
+ CodingErrorAction.REPLACE));
+ }
+
+ @Test
+ public void givenUTF8String_whenDecodeByUS_ASCII_thenReportMalformedInputSequence() {
+ Assertions.assertThrows(
+ MalformedInputException.class,
+ () -> CharacterEncodingExamples.decodeText(
+ "The façade pattern is a software design pattern.",
+ StandardCharsets.US_ASCII,
+ CodingErrorAction.REPORT));
+ }
+
+ @Test
+ public void givenTextFile_whenLoopOverAllCandidateEncodings_thenProduceSuitableCandidateEncodings() {
+ Path path = Paths.get("src/test/resources/encoding.txt");
+ List allCandidateCharSets = Arrays.asList(
+ StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1);
+
+ List suitableCharsets = new ArrayList<>();
+ allCandidateCharSets.forEach(charset -> {
+ try {
+ CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT);
+ Reader reader = new InputStreamReader(Files.newInputStream(path), charsetDecoder);
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ bufferedReader.readLine();
+ suitableCharsets.add(charset);
+ } catch (MalformedInputException ignored) {
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ });
+
+ Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1));
+ }
+
}
diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java
deleted file mode 100644
index 394de9c576..0000000000
--- a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.baeldung.exceptions;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.LoggerFactory;
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.core.Appender;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.verify;
-
-@RunWith(MockitoJUnitRunner.class)
-public class GlobalExceptionHandlerUnitTest {
-
- @Mock
- private Appender mockAppender;
-
- @Captor
- private ArgumentCaptor captorLoggingEvent;
-
- @Before
- public void setup() {
- final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
- logger.addAppender(mockAppender);
-
- Handler globalExceptionHandler = new Handler();
- Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
- }
-
- @After
- public void teardown() {
- final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
- logger.detachAppender(mockAppender);
- }
-
- @Test
- public void whenArithmeticException_thenUseUncaughtExceptionHandler() throws InterruptedException {
-
- Thread globalExceptionHandlerThread = new Thread() {
- public void run() {
- GlobalExceptionHandler globalExceptionHandlerObj = new GlobalExceptionHandler();
- globalExceptionHandlerObj.performArithmeticOperation(99, 0);
- }
- };
-
- globalExceptionHandlerThread.start();
- globalExceptionHandlerThread.join();
-
- verify(mockAppender).doAppend(captorLoggingEvent.capture());
- LoggingEvent loggingEvent = captorLoggingEvent.getValue();
-
- assertThat(loggingEvent.getLevel()).isEqualTo(Level.INFO);
- assertThat(loggingEvent.getFormattedMessage()).isEqualTo("Unhandled exception caught!");
- }
-
-}
diff --git a/core-java-modules/multimodulemavenproject/README.md b/core-java-modules/multimodulemavenproject/README.md
new file mode 100644
index 0000000000..fc4ca60b6b
--- /dev/null
+++ b/core-java-modules/multimodulemavenproject/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles
+
+- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms)
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 11a1003460..68ece1c473 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -15,8 +15,10 @@
pre-jpms
- core-java-exceptions
core-java-optional
+ core-java-lang-operators
+ core-java-networking-2
+ core-java-security-manager
diff --git a/core-java-modules/pre-jpms/pom.xml b/core-java-modules/pre-jpms/pom.xml
index 380d94fbf1..f37daed0a5 100644
--- a/core-java-modules/pre-jpms/pom.xml
+++ b/core-java-modules/pre-jpms/pom.xml
@@ -69,7 +69,4 @@
-
- UTF-8
-
diff --git a/core-kotlin-2/README.md b/core-kotlin-2/README.md
index d75dd2208a..ecf16c2c91 100644
--- a/core-kotlin-2/README.md
+++ b/core-kotlin-2/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Core Kotlin
+
+This module contains articles about core Kotlin.
+
+### Relevant articles:
- [Void Type in Kotlin](https://www.baeldung.com/kotlin-void-type)
- [How to use Kotlin Range Expressions](https://www.baeldung.com/kotlin-ranges)
@@ -8,3 +12,4 @@
- [Split a List into Parts in Kotlin](https://www.baeldung.com/kotlin-split-list-into-parts)
- [String Comparison in Kotlin](https://www.baeldung.com/kotlin-string-comparison)
- [Guide to JVM Platform Annotations in Kotlin](https://www.baeldung.com/kotlin-jvm-annotations)
+- More articles: [[<-- prev]](/core-kotlin)
diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt
new file mode 100644
index 0000000000..6fa7983689
--- /dev/null
+++ b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt
@@ -0,0 +1,34 @@
+package com.baeldung.lists
+
+import org.junit.jupiter.api.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class ListsUnitTest {
+
+ var batmans: List = listOf("Christian Bale", "Michael Keaton", "Ben Affleck", "George Clooney")
+
+ @Test
+ fun whenFindASpecificItem_thenItemIsReturned() {
+ //Returns the first element matching the given predicate, or null if no such element was found.
+ val theFirstBatman = batmans.find { actor -> "Michael Keaton".equals(actor) }
+ assertEquals(theFirstBatman, "Michael Keaton")
+ }
+
+ @Test
+ fun whenFilterWithPredicate_thenMatchingItemsAreReturned() {
+ //Returns a list containing only elements matching the given predicate.
+ val theCoolestBatmans = batmans.filter { actor -> actor.contains("a") }
+ assertTrue(theCoolestBatmans.contains("Christian Bale") && theCoolestBatmans.contains("Michael Keaton"))
+ }
+
+ @Test
+ fun whenFilterNotWithPredicate_thenMatchingItemsAreReturned() {
+ //Returns a list containing only elements not matching the given predicate.
+ val theMehBatmans = batmans.filterNot { actor -> actor.contains("a") }
+ assertFalse(theMehBatmans.contains("Christian Bale") && theMehBatmans.contains("Michael Keaton"))
+ assertTrue(theMehBatmans.contains("Ben Affleck") && theMehBatmans.contains("George Clooney"))
+ }
+
+}
\ No newline at end of file
diff --git a/core-kotlin-io/README.md b/core-kotlin-io/README.md
index cb4dac7e4d..ad4c503895 100644
--- a/core-kotlin-io/README.md
+++ b/core-kotlin-io/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Core Kotlin I/O
+
+This module contains articles about core Kotlin I/O.
+
+### Relevant articles:
- [InputStream to String in Kotlin](https://www.baeldung.com/kotlin-inputstream-to-string)
- [Console I/O in Kotlin](https://www.baeldung.com/kotlin-console-io)
diff --git a/core-kotlin/README.md b/core-kotlin/README.md
index 3392db9171..bdff95d36d 100644
--- a/core-kotlin/README.md
+++ b/core-kotlin/README.md
@@ -1,36 +1,40 @@
-## Relevant articles:
+## Core Kotlin
-- [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin)
-- [Guide to the “when{}” Block in Kotlin](http://www.baeldung.com/kotlin-when)
-- [Comprehensive Guide to Null Safety in Kotlin](http://www.baeldung.com/kotlin-null-safety)
-- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability)
-- [Difference Between “==” and “===” operators in Kotlin](http://www.baeldung.com/kotlin-equality-operators)
-- [Generics in Kotlin](http://www.baeldung.com/kotlin-generics)
-- [Introduction to Kotlin Coroutines](http://www.baeldung.com/kotlin-coroutines)
-- [Destructuring Declarations in Kotlin](http://www.baeldung.com/kotlin-destructuring-declarations)
-- [Lazy Initialization in Kotlin](http://www.baeldung.com/kotlin-lazy-initialization)
-- [Overview of Kotlin Collections API](http://www.baeldung.com/kotlin-collections-api)
-- [Converting a List to Map in Kotlin](http://www.baeldung.com/kotlin-list-to-map)
-- [Data Classes in Kotlin](http://www.baeldung.com/kotlin-data-classes)
-- [Delegated Properties in Kotlin](http://www.baeldung.com/kotlin-delegated-properties)
-- [Sealed Classes in Kotlin](http://www.baeldung.com/kotlin-sealed-classes)
-- [JUnit 5 for Kotlin Developers](http://www.baeldung.com/junit-5-kotlin)
-- [Extension Methods in Kotlin](http://www.baeldung.com/kotlin-extension-methods)
-- [Infix Functions in Kotlin](http://www.baeldung.com/kotlin-infix-functions)
-- [Try-with-resources in Kotlin](http://www.baeldung.com/kotlin-try-with-resources)
-- [Regular Expressions in Kotlin](http://www.baeldung.com/kotlin-regular-expressions)
-- [Objects in Kotlin](http://www.baeldung.com/kotlin-objects)
-- [Reading from a File in Kotlin](http://www.baeldung.com/kotlin-read-file)
-- [Guide to Kotlin @JvmField](http://www.baeldung.com/kotlin-jvm-field-annotation)
-- [Filtering Kotlin Collections](http://www.baeldung.com/kotlin-filter-collection)
-- [Writing to a File in Kotlin](http://www.baeldung.com/kotlin-write-file)
-- [Lambda Expressions in Kotlin](http://www.baeldung.com/kotlin-lambda-expressions)
-- [Kotlin String Templates](http://www.baeldung.com/kotlin-string-template)
-- [Working with Enums in Kotlin](http://www.baeldung.com/kotlin-enum)
-- [Create a Java and Kotlin Project with Maven](http://www.baeldung.com/kotlin-maven-java-project)
-- [Reflection with Kotlin](http://www.baeldung.com/kotlin-reflection)
-- [Get a Random Number in Kotlin](http://www.baeldung.com/kotlin-random-number)
-- [Idiomatic Logging in Kotlin](http://www.baeldung.com/kotlin-logging)
+This module contains articles about core Kotlin.
+
+### Relevant articles:
+
+- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin)
+- [Guide to the “when{}” Block in Kotlin](https://www.baeldung.com/kotlin-when)
+- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin-null-safety)
+- [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability)
+- [Difference Between “==” and “===” operators in Kotlin](https://www.baeldung.com/kotlin-equality-operators)
+- [Generics in Kotlin](https://www.baeldung.com/kotlin-generics)
+- [Introduction to Kotlin Coroutines](https://www.baeldung.com/kotlin-coroutines)
+- [Destructuring Declarations in Kotlin](https://www.baeldung.com/kotlin-destructuring-declarations)
+- [Lazy Initialization in Kotlin](https://www.baeldung.com/kotlin-lazy-initialization)
+- [Overview of Kotlin Collections API](https://www.baeldung.com/kotlin-collections-api)
+- [Converting a List to Map in Kotlin](https://www.baeldung.com/kotlin-list-to-map)
+- [Data Classes in Kotlin](https://www.baeldung.com/kotlin-data-classes)
+- [Delegated Properties in Kotlin](https://www.baeldung.com/kotlin-delegated-properties)
+- [Sealed Classes in Kotlin](https://www.baeldung.com/kotlin-sealed-classes)
+- [JUnit 5 for Kotlin Developers](https://www.baeldung.com/junit-5-kotlin)
+- [Extension Methods in Kotlin](https://www.baeldung.com/kotlin-extension-methods)
+- [Infix Functions in Kotlin](https://www.baeldung.com/kotlin-infix-functions)
+- [Try-with-resources in Kotlin](https://www.baeldung.com/kotlin-try-with-resources)
+- [Regular Expressions in Kotlin](https://www.baeldung.com/kotlin-regular-expressions)
+- [Objects in Kotlin](https://www.baeldung.com/kotlin-objects)
+- [Reading from a File in Kotlin](https://www.baeldung.com/kotlin-read-file)
+- [Guide to Kotlin @JvmField](https://www.baeldung.com/kotlin-jvm-field-annotation)
+- [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection)
+- [Writing to a File in Kotlin](https://www.baeldung.com/kotlin-write-file)
+- [Lambda Expressions in Kotlin](https://www.baeldung.com/kotlin-lambda-expressions)
+- [Kotlin String Templates](https://www.baeldung.com/kotlin-string-template)
+- [Working with Enums in Kotlin](https://www.baeldung.com/kotlin-enum)
+- [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project)
+- [Reflection with Kotlin](https://www.baeldung.com/kotlin-reflection)
+- [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number)
+- [Idiomatic Logging in Kotlin](https://www.baeldung.com/kotlin-logging)
- [Kotlin Constructors](https://www.baeldung.com/kotlin-constructors)
- [Creational Design Patterns in Kotlin: Builder](https://www.baeldung.com/kotlin-builder-pattern)
- [Kotlin Nested and Inner Classes](https://www.baeldung.com/kotlin-inner-classes)
@@ -56,3 +60,4 @@
- [Static Methods Behavior in Kotlin](https://www.baeldung.com/kotlin-static-methods)
- [Inline Functions in Kotlin](https://www.baeldung.com/kotlin-inline-functions)
- [Delegation Pattern in Kotlin](https://www.baeldung.com/kotlin-delegation-pattern)
+- More articles: [[next -->]](/core-kotlin-2)
diff --git a/core-kotlin/src/main/kotlin/com/baeldung/builder/FoodOrder.kt b/core-kotlin/src/main/kotlin/com/baeldung/builder/FoodOrder.kt
index 1384cd9937..3a8a4b9857 100644
--- a/core-kotlin/src/main/kotlin/com/baeldung/builder/FoodOrder.kt
+++ b/core-kotlin/src/main/kotlin/com/baeldung/builder/FoodOrder.kt
@@ -1,6 +1,6 @@
package com.baeldung.builder
-class FoodOrder(
+class FoodOrder private constructor(
val bread: String?,
val condiments: String?,
val meat: String?,
diff --git a/core-scala/README.md b/core-scala/README.md
index eed344193f..e6fc75d59e 100644
--- a/core-scala/README.md
+++ b/core-scala/README.md
@@ -1,3 +1,7 @@
+## Core Scala
+
+This module contains articles about Scala's core features
+
### Relevant Articles:
- [Introduction to Scala](https://www.baeldung.com/scala-intro)
diff --git a/couchbase/README.md b/couchbase/README.md
index 7a99ce4299..913c413132 100644
--- a/couchbase/README.md
+++ b/couchbase/README.md
@@ -1,11 +1,13 @@
-## Couchbase SDK Tutorial Project
+## Couchbase
+
+This module contains articles about Couchbase
### Relevant Articles:
-- [Introduction to Couchbase SDK for Java](http://www.baeldung.com/java-couchbase-sdk)
-- [Using Couchbase in a Spring Application](http://www.baeldung.com/couchbase-sdk-spring)
-- [Asynchronous Batch Operations in Couchbase](http://www.baeldung.com/async-batch-operations-in-couchbase)
-- [Querying Couchbase with MapReduce Views](http://www.baeldung.com/couchbase-query-mapreduce-view)
-- [Querying Couchbase with N1QL](http://www.baeldung.com/n1ql-couchbase)
+- [Introduction to Couchbase SDK for Java](https://www.baeldung.com/java-couchbase-sdk)
+- [Using Couchbase in a Spring Application](https://www.baeldung.com/couchbase-sdk-spring)
+- [Asynchronous Batch Operations in Couchbase](https://www.baeldung.com/async-batch-operations-in-couchbase)
+- [Querying Couchbase with MapReduce Views](https://www.baeldung.com/couchbase-query-mapreduce-view)
+- [Querying Couchbase with N1QL](https://www.baeldung.com/n1ql-couchbase)
### Overview
This Maven project contains the Java code for the Couchbase entities and Spring services
diff --git a/custom-pmd/README.md b/custom-pmd/README.md
index 065a1128f3..0c42106fe8 100644
--- a/custom-pmd/README.md
+++ b/custom-pmd/README.md
@@ -1 +1,7 @@
## Custom PMD Rules
+
+This module contains articles about PMD
+
+### Relevant Articles:
+
+- [Introduction To PMD](https://www.baeldung.com/pmd)
\ No newline at end of file
diff --git a/dagger/README.md b/dagger/README.md
index 72cba3d3f2..d942622d0a 100644
--- a/dagger/README.md
+++ b/dagger/README.md
@@ -1,3 +1,7 @@
+## Dagger
+
+This module contains articles about Dagger
+
### Relevant articles:
-- [Introduction to Dagger 2](http://www.baeldung.com/dagger-2)
+- [Introduction to Dagger 2](https://www.baeldung.com/dagger-2)
diff --git a/data-structures/README.md b/data-structures/README.md
index 2d92068390..b7f15c2eb8 100644
--- a/data-structures/README.md
+++ b/data-structures/README.md
@@ -1,4 +1,9 @@
+## Data Structures
+
+This module contains articles about data structures in Java
+
## Relevant articles:
-[The Trie Data Structure in Java](https://www.baeldung.com/trie-java)
-[Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree)
+- [The Trie Data Structure in Java](https://www.baeldung.com/trie-java)
+- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree)
+- [Depth First Search in Java](https://www.baeldung.com/java-depth-first-search)
diff --git a/data-structures/src/main/java/com/baeldung/graph/Graph.java b/data-structures/src/main/java/com/baeldung/graph/Graph.java
new file mode 100644
index 0000000000..40df2c713a
--- /dev/null
+++ b/data-structures/src/main/java/com/baeldung/graph/Graph.java
@@ -0,0 +1,74 @@
+package com.baeldung.graph;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
+
+public class Graph {
+
+ private Map> adjVertices;
+
+ public Graph() {
+ this.adjVertices = new HashMap>();
+ }
+
+ public void addVertex(int vertex) {
+ adjVertices.putIfAbsent(vertex, new ArrayList<>());
+ }
+
+ public void addEdge(int src, int dest) {
+ adjVertices.get(src).add(dest);
+ }
+
+ public void dfsWithoutRecursion(int start) {
+ Stack stack = new Stack();
+ boolean[] isVisited = new boolean[adjVertices.size()];
+ stack.push(start);
+ while (!stack.isEmpty()) {
+ int current = stack.pop();
+ isVisited[current] = true;
+ visit(current);
+ for (int dest : adjVertices.get(current)) {
+ if (!isVisited[dest])
+ stack.push(dest);
+ }
+ }
+ }
+
+ public void dfs(int start) {
+ boolean[] isVisited = new boolean[adjVertices.size()];
+ dfsRecursive(start, isVisited);
+ }
+
+ private void dfsRecursive(int current, boolean[] isVisited) {
+ isVisited[current] = true;
+ visit(current);
+ for (int dest : adjVertices.get(current)) {
+ if (!isVisited[dest])
+ dfsRecursive(dest, isVisited);
+ }
+ }
+
+ public List topologicalSort(int start) {
+ LinkedList result = new LinkedList();
+ boolean[] isVisited = new boolean[adjVertices.size()];
+ topologicalSortRecursive(start, isVisited, result);
+ return result;
+ }
+
+ private void topologicalSortRecursive(int current, boolean[] isVisited, LinkedList result) {
+ isVisited[current] = true;
+ for (int dest : adjVertices.get(current)) {
+ if (!isVisited[dest])
+ topologicalSortRecursive(dest, isVisited, result);
+ }
+ result.addFirst(current);
+ }
+
+ private void visit(int value) {
+ System.out.print(" " + value);
+ }
+}
diff --git a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
index f435e41afa..bb62714006 100644
--- a/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
+++ b/data-structures/src/main/java/com/baeldung/tree/BinaryTree.java
@@ -2,6 +2,7 @@ package com.baeldung.tree;
import java.util.LinkedList;
import java.util.Queue;
+import java.util.Stack;
public class BinaryTree {
@@ -102,14 +103,14 @@ public class BinaryTree {
public void traverseInOrder(Node node) {
if (node != null) {
traverseInOrder(node.left);
- System.out.print(" " + node.value);
+ visit(node.value);
traverseInOrder(node.right);
}
}
public void traversePreOrder(Node node) {
if (node != null) {
- System.out.print(" " + node.value);
+ visit(node.value);
traversePreOrder(node.left);
traversePreOrder(node.right);
}
@@ -119,7 +120,7 @@ public class BinaryTree {
if (node != null) {
traversePostOrder(node.left);
traversePostOrder(node.right);
- System.out.print(" " + node.value);
+ visit(node.value);
}
}
@@ -147,6 +148,71 @@ public class BinaryTree {
}
}
+
+ public void traverseInOrderWithoutRecursion() {
+ Stack stack = new Stack();
+ Node current = root;
+ stack.push(root);
+ while(! stack.isEmpty()) {
+ while(current.left != null) {
+ current = current.left;
+ stack.push(current);
+ }
+ current = stack.pop();
+ visit(current.value);
+ if(current.right != null) {
+ current = current.right;
+ stack.push(current);
+ }
+ }
+ }
+
+ public void traversePreOrderWithoutRecursion() {
+ Stack stack = new Stack();
+ Node current = root;
+ stack.push(root);
+ while(! stack.isEmpty()) {
+ current = stack.pop();
+ visit(current.value);
+
+ if(current.right != null)
+ stack.push(current.right);
+
+ if(current.left != null)
+ stack.push(current.left);
+ }
+ }
+
+ public void traversePostOrderWithoutRecursion() {
+ Stack stack = new Stack();
+ Node prev = root;
+ Node current = root;
+ stack.push(root);
+
+ while (!stack.isEmpty()) {
+ current = stack.peek();
+ boolean hasChild = (current.left != null || current.right != null);
+ boolean isPrevLastChild = (prev == current.right || (prev == current.left && current.right == null));
+
+ if (!hasChild || isPrevLastChild) {
+ current = stack.pop();
+ visit(current.value);
+ prev = current;
+ } else {
+ if (current.right != null) {
+ stack.push(current.right);
+ }
+ if (current.left != null) {
+ stack.push(current.left);
+ }
+ }
+ }
+ }
+
+ private void visit(int value) {
+ System.out.print(" " + value);
+ }
+
class Node {
int value;
Node left;
diff --git a/data-structures/src/test/java/com/baeldung/graph/GraphUnitTest.java b/data-structures/src/test/java/com/baeldung/graph/GraphUnitTest.java
new file mode 100644
index 0000000000..09b92115d2
--- /dev/null
+++ b/data-structures/src/test/java/com/baeldung/graph/GraphUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.graph;
+
+import java.util.List;
+
+import org.junit.Test;
+
+public class GraphUnitTest {
+
+ @Test
+ public void givenDirectedGraph_whenDFS_thenPrintAllValues() {
+ Graph graph = createDirectedGraph();
+ graph.dfs(0);
+ System.out.println();
+ graph.dfsWithoutRecursion(0);
+ }
+
+ @Test
+ public void givenDirectedGraph_whenGetTopologicalSort_thenPrintValuesSorted() {
+ Graph graph = createDirectedGraph();
+ List list = graph.topologicalSort(0);
+ System.out.println(list);
+ }
+
+ private Graph createDirectedGraph() {
+ Graph graph = new Graph();
+ graph.addVertex(0);
+ graph.addVertex(1);
+ graph.addVertex(2);
+ graph.addVertex(3);
+ graph.addVertex(4);
+ graph.addVertex(5);
+ graph.addEdge(0, 1);
+ graph.addEdge(0, 2);
+ graph.addEdge(1, 3);
+ graph.addEdge(2, 3);
+ graph.addEdge(3, 4);
+ graph.addEdge(4, 5);
+ return graph;
+ }
+}
diff --git a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
index f81247b74d..f99cb52ed7 100644
--- a/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
+++ b/data-structures/src/test/java/com/baeldung/tree/BinaryTreeUnitTest.java
@@ -87,6 +87,8 @@ public class BinaryTreeUnitTest {
BinaryTree bt = createBinaryTree();
bt.traverseInOrder(bt.root);
+ System.out.println();
+ bt.traverseInOrderWithoutRecursion();
}
@Test
@@ -95,6 +97,8 @@ public class BinaryTreeUnitTest {
BinaryTree bt = createBinaryTree();
bt.traversePreOrder(bt.root);
+ System.out.println();
+ bt.traversePreOrderWithoutRecursion();
}
@Test
@@ -103,6 +107,8 @@ public class BinaryTreeUnitTest {
BinaryTree bt = createBinaryTree();
bt.traversePostOrder(bt.root);
+ System.out.println();
+ bt.traversePostOrderWithoutRecursion();
}
@Test
diff --git a/ddd/README.md b/ddd/README.md
index 6b68fe2205..daeb663e3b 100644
--- a/ddd/README.md
+++ b/ddd/README.md
@@ -1,3 +1,7 @@
+## Domain-driven Design (DDD)
+
+This module contains articles about Domain-driven Design (DDD)
+
### Relevant articles
- [Persisting DDD Aggregates](https://www.baeldung.com/spring-persisting-ddd-aggregates)
diff --git a/ddd/pom.xml b/ddd/pom.xml
index 4ac65ea841..c249007ba4 100644
--- a/ddd/pom.xml
+++ b/ddd/pom.xml
@@ -3,7 +3,6 @@
4.0.0
com.baeldung.ddd
ddd
- 0.0.1-SNAPSHOT
ddd
jar
DDD series examples
@@ -35,7 +34,6 @@
org.junit.platform
junit-platform-launcher
- ${junit-platform.version}
test
@@ -85,8 +83,6 @@
1.0.1
- 2.22.0
- 2.0.6.RELEASE
\ No newline at end of file
diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md
index 14e585cd97..47c2d8167d 100644
--- a/deeplearning4j/README.md
+++ b/deeplearning4j/README.md
@@ -1,5 +1,7 @@
-### Sample deeplearning4j Project
-This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library.
+## Deeplearning4j
+
+This module contains articles about Deeplearning4j.
### Relevant Articles:
-- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j)
+- [A Guide to Deeplearning4j](https://www.baeldung.com/deeplearning4j)
+- [Logistic Regression in Java](https://www.baeldung.com/java-logistic-regression)
diff --git a/deeplearning4j/pom.xml b/deeplearning4j/pom.xml
index 181dbc871c..a8663865e0 100644
--- a/deeplearning4j/pom.xml
+++ b/deeplearning4j/pom.xml
@@ -14,6 +14,11 @@
+
+ org.nd4j
+ nd4j-api
+ ${dl4j.version}
+
org.nd4j
nd4j-native-platform
@@ -24,10 +29,26 @@
deeplearning4j-core
${dl4j.version}
+
+ org.deeplearning4j
+ deeplearning4j-nn
+ ${dl4j.version}
+
+
+
+ org.datavec
+ datavec-api
+ ${dl4j.version}
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.3.5
+
- 0.9.1
+ 0.9.1
-
\ No newline at end of file
+
diff --git a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java
index bf341209e1..dcc81eda6e 100644
--- a/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java
+++ b/deeplearning4j/src/main/java/com/baeldung/deeplearning4j/IrisClassifier.java
@@ -3,9 +3,9 @@ package com.baeldung.deeplearning4j;
import org.datavec.api.records.reader.RecordReader;
import org.datavec.api.records.reader.impl.csv.CSVRecordReader;
import org.datavec.api.split.FileSplit;
-import org.datavec.api.util.ClassPathResource;
import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;
import org.deeplearning4j.eval.Evaluation;
+import org.deeplearning4j.nn.conf.BackpropType;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
@@ -19,6 +19,7 @@ import org.nd4j.linalg.dataset.SplitTestAndTrain;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
import org.nd4j.linalg.dataset.api.preprocessor.NormalizerStandardize;
+import org.nd4j.linalg.io.ClassPathResource;
import org.nd4j.linalg.lossfunctions.LossFunctions;
import java.io.IOException;
@@ -52,8 +53,8 @@ public class IrisClassifier {
.iterations(1000)
.activation(Activation.TANH)
.weightInit(WeightInit.XAVIER)
- .learningRate(0.1)
- .regularization(true).l2(0.0001)
+ .regularization(true)
+ .learningRate(0.1).l2(0.0001)
.list()
.layer(0, new DenseLayer.Builder().nIn(FEATURES_COUNT).nOut(3)
.build())
@@ -62,14 +63,14 @@ public class IrisClassifier {
.layer(2, new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.activation(Activation.SOFTMAX)
.nIn(3).nOut(CLASSES_COUNT).build())
- .backprop(true).pretrain(false)
+ .backpropType(BackpropType.Standard).pretrain(false)
.build();
MultiLayerNetwork model = new MultiLayerNetwork(configuration);
model.init();
model.fit(trainingData);
- INDArray output = model.output(testData.getFeatureMatrix());
+ INDArray output = model.output(testData.getFeatures());
Evaluation eval = new Evaluation(CLASSES_COUNT);
eval.eval(testData.getLabels(), output);
diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java
new file mode 100644
index 0000000000..c8580b9c27
--- /dev/null
+++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistClassifier.java
@@ -0,0 +1,165 @@
+package com.baeldung.logreg;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import org.datavec.api.io.labels.ParentPathLabelGenerator;
+import org.datavec.api.split.FileSplit;
+import org.datavec.image.loader.NativeImageLoader;
+import org.datavec.image.recordreader.ImageRecordReader;
+import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator;
+import org.deeplearning4j.eval.Evaluation;
+import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
+import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
+import org.deeplearning4j.nn.conf.inputs.InputType;
+import org.deeplearning4j.nn.conf.layers.ConvolutionLayer;
+import org.deeplearning4j.nn.conf.layers.DenseLayer;
+import org.deeplearning4j.nn.conf.layers.OutputLayer;
+import org.deeplearning4j.nn.conf.layers.SubsamplingLayer;
+import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
+import org.deeplearning4j.nn.weights.WeightInit;
+import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
+import org.deeplearning4j.util.ModelSerializer;
+import org.nd4j.linalg.activations.Activation;
+import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
+import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization;
+import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
+import org.nd4j.linalg.learning.config.Nesterovs;
+import org.nd4j.linalg.lossfunctions.LossFunctions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Handwritten digit image classification based on LeNet-5 architecture by Yann LeCun.
+ *
+ * This code accompanies the article "Logistic regression in Java" and is heavily based on
+ * MnistClassifier .
+ * Some minor changes have been made in order to make article's flow smoother.
+ *
+ */
+
+public class MnistClassifier {
+ private static final Logger logger = LoggerFactory.getLogger(MnistClassifier.class);
+ private static final String basePath = System.getProperty("java.io.tmpdir") + File.separator + "mnist" + File.separator;
+ private static final File modelPath = new File(basePath + "mnist-model.zip");
+ private static final String dataUrl = "http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz";
+
+ public static void main(String[] args) throws Exception {
+ // input image sizes in pixels
+ int height = 28;
+ int width = 28;
+ // input image colour depth (1 for gray scale images)
+ int channels = 1;
+ // the number of output classes
+ int outputClasses = 10;
+ // number of samples that will be propagated through the network in each iteration
+ int batchSize = 54;
+ // total number of training epochs
+ int epochs = 1;
+
+ // initialize a pseudorandom number generator
+ int seed = 1234;
+ Random randNumGen = new Random(seed);
+
+ final String path = basePath + "mnist_png" + File.separator;
+ if (!new File(path).exists()) {
+ logger.info("Downloading data {}", dataUrl);
+ String localFilePath = basePath + "mnist_png.tar.gz";
+ File file = new File(localFilePath);
+ if (!file.exists()) {
+ file.getParentFile().mkdirs();
+ Utils.downloadAndSave(dataUrl, file);
+ Utils.extractTarArchive(file, basePath);
+ }
+ } else {
+ logger.info("Using the local data from folder {}", path);
+ }
+
+ logger.info("Vectorizing the data from folder {}", path);
+ // vectorization of train data
+ File trainData = new File(path + "training");
+ FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
+ // use parent directory name as the image label
+ ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator();
+ ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker);
+ trainRR.initialize(trainSplit);
+ DataSetIterator train = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputClasses);
+
+ // pixel values from 0-255 to 0-1 (min-max scaling)
+ DataNormalization imageScaler = new ImagePreProcessingScaler();
+ imageScaler.fit(train);
+ train.setPreProcessor(imageScaler);
+
+ // vectorization of test data
+ File testData = new File(path + "testing");
+ FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen);
+ ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker);
+ testRR.initialize(testSplit);
+ DataSetIterator test = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputClasses);
+ // same normalization for better results
+ test.setPreProcessor(imageScaler);
+
+ logger.info("Network configuration and training...");
+ // reduce the learning rate as the number of training epochs increases
+ // iteration #, learning rate
+ Map learningRateSchedule = new HashMap<>();
+ learningRateSchedule.put(0, 0.06);
+ learningRateSchedule.put(200, 0.05);
+ learningRateSchedule.put(600, 0.028);
+ learningRateSchedule.put(800, 0.0060);
+ learningRateSchedule.put(1000, 0.001);
+
+ final ConvolutionLayer layer1 = new ConvolutionLayer.Builder(5, 5).nIn(channels)
+ .stride(1, 1)
+ .nOut(20)
+ .activation(Activation.IDENTITY)
+ .build();
+ final SubsamplingLayer layer2 = new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2)
+ .stride(2, 2)
+ .build();
+ // nIn need not specified in later layers
+ final ConvolutionLayer layer3 = new ConvolutionLayer.Builder(5, 5).stride(1, 1)
+ .nOut(50)
+ .activation(Activation.IDENTITY)
+ .build();
+ final DenseLayer layer4 = new DenseLayer.Builder().activation(Activation.RELU)
+ .nOut(500)
+ .build();
+ final OutputLayer layer5 = new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(outputClasses)
+ .activation(Activation.SOFTMAX)
+ .build();
+ final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed)
+ .l2(0.0005) // ridge regression value
+ .updater(new Nesterovs()) //TODO new MapSchedule(ScheduleType.ITERATION, learningRateSchedule)
+ .weightInit(WeightInit.XAVIER)
+ .list()
+ .layer(0, layer1)
+ .layer(1, layer2)
+ .layer(2, layer3)
+ .layer(3, layer2)
+ .layer(4, layer4)
+ .layer(5, layer5)
+ .setInputType(InputType.convolutionalFlat(height, width, channels))
+ .build();
+
+ final MultiLayerNetwork model = new MultiLayerNetwork(config);
+ model.init();
+ model.setListeners(new ScoreIterationListener(100));
+ logger.info("Total num of params: {}", model.numParams());
+
+ // evaluation while training (the score should go down)
+ for (int i = 0; i < epochs; i++) {
+ model.fit(train);
+ logger.info("Completed epoch {}", i);
+ train.reset();
+ test.reset();
+ }
+ Evaluation eval = model.evaluate(test);
+ logger.info(eval.stats());
+
+ ModelSerializer.writeModel(model, modelPath, true);
+ logger.info("The MINIST model has been saved in {}", modelPath.getPath());
+ }
+}
diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/MnistPrediction.java b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistPrediction.java
new file mode 100644
index 0000000000..56097d9a45
--- /dev/null
+++ b/deeplearning4j/src/main/java/com/baeldung/logreg/MnistPrediction.java
@@ -0,0 +1,57 @@
+package com.baeldung.logreg;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+
+import org.datavec.image.loader.NativeImageLoader;
+import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
+import org.deeplearning4j.util.ModelSerializer;
+import org.nd4j.linalg.api.ndarray.INDArray;
+import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MnistPrediction {
+ private static final Logger logger = LoggerFactory.getLogger(MnistPrediction.class);
+ private static final File modelPath = new File(System.getProperty("java.io.tmpdir") + "mnist" + File.separator + "mnist-model.zip");
+ private static final int height = 28;
+ private static final int width = 28;
+ private static final int channels = 1;
+
+ /**
+ * Opens a popup that allows to select a file from the filesystem.
+ * @return
+ */
+ public static String fileChose() {
+ JFileChooser fc = new JFileChooser();
+ int ret = fc.showOpenDialog(null);
+ if (ret == JFileChooser.APPROVE_OPTION) {
+ File file = fc.getSelectedFile();
+ return file.getAbsolutePath();
+ } else {
+ return null;
+ }
+ }
+
+ public static void main(String[] args) throws IOException {
+ if (!modelPath.exists()) {
+ logger.info("The model not found. Have you trained it?");
+ return;
+ }
+ MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath);
+ String path = fileChose();
+ File file = new File(path);
+
+ INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file);
+ new ImagePreProcessingScaler(0, 1).transform(image);
+
+ // Pass through to neural Net
+ INDArray output = model.output(image);
+
+ logger.info("File: {}", path);
+ logger.info("Probabilities: {}", output);
+ }
+
+}
diff --git a/deeplearning4j/src/main/java/com/baeldung/logreg/Utils.java b/deeplearning4j/src/main/java/com/baeldung/logreg/Utils.java
new file mode 100644
index 0000000000..fa4be127cd
--- /dev/null
+++ b/deeplearning4j/src/main/java/com/baeldung/logreg/Utils.java
@@ -0,0 +1,103 @@
+package com.baeldung.logreg;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class for digit classifier.
+ *
+ */
+public class Utils {
+
+ private static final Logger logger = LoggerFactory.getLogger(Utils.class);
+
+ private Utils() {
+ }
+
+ /**
+ * Download the content of the given url and save it into a file.
+ * @param url
+ * @param file
+ */
+ public static void downloadAndSave(String url, File file) throws IOException {
+ CloseableHttpClient client = HttpClientBuilder.create()
+ .build();
+ logger.info("Connecting to {}", url);
+ try (CloseableHttpResponse response = client.execute(new HttpGet(url))) {
+ HttpEntity entity = response.getEntity();
+ if (entity != null) {
+ logger.info("Downloaded {} bytes", entity.getContentLength());
+ try (FileOutputStream outstream = new FileOutputStream(file)) {
+ logger.info("Saving to the local file");
+ entity.writeTo(outstream);
+ outstream.flush();
+ logger.info("Local file saved");
+ }
+ }
+ }
+ }
+
+ /**
+ * Extract a "tar.gz" file into a given folder.
+ * @param file
+ * @param folder
+ */
+ public static void extractTarArchive(File file, String folder) throws IOException {
+ logger.info("Extracting archive {} into folder {}", file.getName(), folder);
+ // @formatter:off
+ try (FileInputStream fis = new FileInputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ GzipCompressorInputStream gzip = new GzipCompressorInputStream(bis);
+ TarArchiveInputStream tar = new TarArchiveInputStream(gzip)) {
+ // @formatter:on
+ TarArchiveEntry entry;
+ while ((entry = (TarArchiveEntry) tar.getNextEntry()) != null) {
+ extractEntry(entry, tar, folder);
+ }
+ }
+ logger.info("Archive extracted");
+ }
+
+ /**
+ * Extract an entry of the input stream into a given folder
+ * @param entry
+ * @param tar
+ * @param folder
+ * @throws IOException
+ */
+ public static void extractEntry(ArchiveEntry entry, InputStream tar, String folder) throws IOException {
+ final int bufferSize = 4096;
+ final String path = folder + entry.getName();
+ if (entry.isDirectory()) {
+ new File(path).mkdirs();
+ } else {
+ int count;
+ byte[] data = new byte[bufferSize];
+ // @formatter:off
+ try (FileOutputStream os = new FileOutputStream(path);
+ BufferedOutputStream dest = new BufferedOutputStream(os, bufferSize)) {
+ // @formatter:off
+ while ((count = tar.read(data, 0, bufferSize)) != -1) {
+ dest.write(data, 0, count);
+ }
+ }
+ }
+ }
+}
diff --git a/disruptor/README.md b/disruptor/README.md
index 779b1e89c4..7d2fca4672 100644
--- a/disruptor/README.md
+++ b/disruptor/README.md
@@ -1,3 +1,7 @@
-## Relevant articles:
+## Disruptor
-- [Concurrency with LMAX Disruptor – An Introduction](http://www.baeldung.com/lmax-disruptor-concurrency)
+This module contains articles about LMAX Disruptor
+
+### Relevant articles:
+
+- [Concurrency with LMAX Disruptor – An Introduction](https://www.baeldung.com/lmax-disruptor-concurrency)
diff --git a/disruptor/pom.xml b/disruptor/pom.xml
index e1d78e7ed6..213331f25c 100644
--- a/disruptor/pom.xml
+++ b/disruptor/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
disruptor
0.1.0-SNAPSHOT
disruptor
@@ -116,10 +115,7 @@
3.3.6
-
- 6.10
- 3.6.1
-
+
2.4.3
3.0.2
1.4.4
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000000..7948b3d663
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles:
+
+- [Introduction to Docker Compose](https://www.baeldung.com/docker-compose)
diff --git a/dozer/README.md b/dozer/README.md
index 5e104d914c..e87e889ce3 100644
--- a/dozer/README.md
+++ b/dozer/README.md
@@ -1,2 +1,7 @@
+## Dozer
+
+This module contains articles about Dozer
+
### Relevant Articles:
-- [A Guide to Mapping With Dozer](http://www.baeldung.com/dozer)
+
+- [A Guide to Mapping With Dozer](https://www.baeldung.com/dozer)
diff --git a/dozer/pom.xml b/dozer/pom.xml
index 8234eb4c79..c781962d83 100644
--- a/dozer/pom.xml
+++ b/dozer/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
dozer
1.0
dozer
diff --git a/drools/README.MD b/drools/README.MD
index 5efbe0d3c3..bcec0cc2f0 100644
--- a/drools/README.MD
+++ b/drools/README.MD
@@ -1,4 +1,9 @@
+## Drools
+
+This module contains articles about Drools
+
### Relevant Articles:
-- [Introduction to Drools](http://www.baeldung.com/drools)
-- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel)
-- [An Example of Backward Chaining in Drools](http://www.baeldung.com/drools-backward-chaining)
+
+- [Introduction to Drools](https://www.baeldung.com/drools)
+- [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel)
+- [An Example of Backward Chaining in Drools](https://www.baeldung.com/drools-backward-chaining)
diff --git a/dubbo/README.md b/dubbo/README.md
index 0a4cd9a204..3ccca4960a 100644
--- a/dubbo/README.md
+++ b/dubbo/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Dubbo
-- [Introduction to Dubbo](http://www.baeldung.com/dubbo)
+This module contains articles about Dubbo
+
+### Relevant articles:
+
+- [Introduction to Dubbo](https://www.baeldung.com/dubbo)
diff --git a/dubbo/pom.xml b/dubbo/pom.xml
index 9fe228bf89..947175b6a0 100644
--- a/dubbo/pom.xml
+++ b/dubbo/pom.xml
@@ -32,7 +32,6 @@
2.5.7
3.4.11
0.10
- 2.19.1
diff --git a/ethereum/README.md b/ethereum/README.md
index d06ca09636..5bae4bbebd 100644
--- a/ethereum/README.md
+++ b/ethereum/README.md
@@ -1,6 +1,8 @@
## Ethereum
+This module contains articles about the Ethereum blockchain
+
### Relevant Articles:
-- [Introduction to EthereumJ](http://www.baeldung.com/ethereumj)
-- [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity)
-- [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j)
+- [Introduction to EthereumJ](https://www.baeldung.com/ethereumj)
+- [Creating and Deploying Smart Contracts with Solidity](https://www.baeldung.com/smart-contracts-ethereum-solidity)
+- [Lightweight Ethereum Clients Using Web3j](https://www.baeldung.com/web3j)
diff --git a/ethereum/pom.xml b/ethereum/pom.xml
index 80e1c04676..f4850df844 100644
--- a/ethereum/pom.xml
+++ b/ethereum/pom.xml
@@ -3,7 +3,6 @@
4.0.0
com.baeldung.ethereum
ethereum
- 0.0.1-SNAPSHOT
ethereum
@@ -207,8 +206,6 @@
- UTF-8
- 8.5.4
1.5.0-RELEASE
3.3.1
1.5.6.RELEASE
diff --git a/feign/README.md b/feign/README.md
index da04c40cdc..03051671d5 100644
--- a/feign/README.md
+++ b/feign/README.md
@@ -1,10 +1,8 @@
-## Feign Hypermedia Client ##
+## Feign
-This is the implementation of a [spring-hypermedia-api][1] client using Feign.
-
-[1]: https://github.com/eugenp/spring-hypermedia-api
+This module contains articles about Feign
### Relevant Articles:
-- [Intro to Feign](http://www.baeldung.com/intro-to-feign)
-- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback)
+- [Intro to Feign](https://www.baeldung.com/intro-to-feign)
+
diff --git a/flyway-cdi-extension/README.md b/flyway-cdi-extension/README.md
index 3e03d5aee8..2f4e8cdb7a 100644
--- a/flyway-cdi-extension/README.md
+++ b/flyway-cdi-extension/README.md
@@ -1,3 +1,7 @@
+## Flyway CDI Extension
+
+This module contains articles about context and dependency injection (CDI) with Flyway
+
### Relevant articles
- [CDI Portable Extension and Flyway](https://www.baeldung.com/cdi-portable-extension)
diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml
index e8b327e35f..49bd6bd9fd 100644
--- a/flyway-cdi-extension/pom.xml
+++ b/flyway-cdi-extension/pom.xml
@@ -3,7 +3,6 @@
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
- com.baeldung
flyway-cdi-extension
1.0-SNAPSHOT
flyway-cdi-extension
@@ -51,8 +50,6 @@
- 1.8
- 1.8
2.0.SP1
3.0.5.Final
5.1.4
diff --git a/geotools/README.md b/geotools/README.md
index 188ff0fddb..5529386070 100644
--- a/geotools/README.md
+++ b/geotools/README.md
@@ -1,3 +1,7 @@
+## GeoTools
+
+This module contains articles about GeoTools
+
### Relevant Articles
-[Introduction to GeoTools](http://www.baeldung.com/geo-tools)
+[Introduction to GeoTools](https://www.baeldung.com/geo-tools)
diff --git a/google-cloud/README.md b/google-cloud/README.md
index 87ca17eac4..5458fb1a93 100644
--- a/google-cloud/README.md
+++ b/google-cloud/README.md
@@ -1,16 +1,16 @@
-## Google Cloud Tutorial Project
+## Google Cloud
+
+This module contains articles about Google Cloud
### Relevant Article:
-- [Intro to Google Cloud Storage With Java](http://www.baeldung.com/java-google-cloud-storage)
+
+- [Intro to Google Cloud Storage With Java](https://www.baeldung.com/java-google-cloud-storage)
### Overview
+
This Maven project contains the Java code for the article linked above.
### Package Organization
+
Java classes for the intro tutorial are in the org.baeldung.google.cloud package. Please note that Google Cloud requires
a user account and credentials, as explained in the tutorial.
-
-
-### Running the tests
-
-```
diff --git a/google-web-toolkit/README.md b/google-web-toolkit/README.md
index 3526fe9962..df9158cddc 100644
--- a/google-web-toolkit/README.md
+++ b/google-web-toolkit/README.md
@@ -1,2 +1,7 @@
+## Google Web Toolkit
+
+This module contains articles about Google Web Toolkit (GWT)
+
### Relevant Articles:
-- [Introduction to GWT](http://www.baeldung.com/gwt)
+
+- [Introduction to GWT](https://www.baeldung.com/gwt)
diff --git a/google-web-toolkit/pom.xml b/google-web-toolkit/pom.xml
index 0723cd3be2..8a7cb87701 100644
--- a/google-web-toolkit/pom.xml
+++ b/google-web-toolkit/pom.xml
@@ -5,7 +5,6 @@
4.0.0
- com.baeldung
google-web-toolkit
1.0-SNAPSHOT
google-web-toolkit
diff --git a/gradle-5/README.md b/gradle-5/README.md
new file mode 100644
index 0000000000..73b6b7e12a
--- /dev/null
+++ b/gradle-5/README.md
@@ -0,0 +1,5 @@
+
+### Relevant Articles:
+
+- [Run a Java main Method Using Gradle](https://www.baeldung.com/gradle-run-java-main)
+
diff --git a/gradle-5/build.gradle b/gradle-5/build.gradle
new file mode 100644
index 0000000000..a728845dff
--- /dev/null
+++ b/gradle-5/build.gradle
@@ -0,0 +1,54 @@
+plugins {
+ id "application"
+}
+apply plugin :"java"
+
+description = "Java MainClass execution examples"
+group = "com.baeldung"
+version = "0.0.1"
+sourceCompatibility = "1.8"
+targetCompatibility = "1.8"
+
+ext {
+ javaMainClass = "com.baeldung.gradle.exec.MainClass"
+}
+
+jar {
+ manifest {
+ attributes(
+ "Main-Class": javaMainClass
+ )
+ }
+}
+
+application {
+ mainClassName = javaMainClass
+}
+
+task runWithJavaExec(type: JavaExec) {
+ group = "Execution"
+ description = "Run the main class with JavaExecTask"
+ classpath = sourceSets.main.runtimeClasspath
+ main = javaMainClass
+}
+
+task runWithExec(type: Exec) {
+ dependsOn build
+ group = "Execution"
+ description = "Run the main class with ExecTask"
+ commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass
+}
+
+task runWithExecJarExecutable(type: Exec) {
+ dependsOn jar
+ group = "Execution"
+ description = "Run the output executable jar with ExecTask"
+ commandLine "java", "-jar", jar.archiveFile.get()
+}
+
+task runWithExecJarOnClassPath(type: Exec) {
+ dependsOn jar
+ group = "Execution"
+ description = "Run the mainClass from the output jar in classpath with ExecTask"
+ commandLine "java", "-classpath", jar.archiveFile.get() , javaMainClass
+}
\ No newline at end of file
diff --git a/gradle-5/gradle/wrapper/gradle-wrapper.jar b/gradle-5/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..736fb7d3f9
Binary files /dev/null and b/gradle-5/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle-5/gradle/wrapper/gradle-wrapper.properties b/gradle-5/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..b33419deee
--- /dev/null
+++ b/gradle-5/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip
diff --git a/gradle-5/gradlew b/gradle-5/gradlew
new file mode 100755
index 0000000000..27309d9231
--- /dev/null
+++ b/gradle-5/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## 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=""
+
+# 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, switch paths to Windows format before running java
+if $cygwin ; 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=$((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
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradle-5/gradlew.bat b/gradle-5/gradlew.bat
new file mode 100644
index 0000000000..832fdb6079
--- /dev/null
+++ b/gradle-5/gradlew.bat
@@ -0,0 +1,90 @@
+@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=
+
+@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
+if "%@eval[2+2]" == "4" goto 4NT_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=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+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-5/src/main/java/com/baeldung/gradle/exec/MainClass.java b/gradle-5/src/main/java/com/baeldung/gradle/exec/MainClass.java
new file mode 100644
index 0000000000..1e0c05389c
--- /dev/null
+++ b/gradle-5/src/main/java/com/baeldung/gradle/exec/MainClass.java
@@ -0,0 +1,8 @@
+package com.baeldung.gradle.exec;
+
+public class MainClass {
+
+ public static void main(String[] args) {
+ System.out.println("Goodbye cruel world ...");
+ }
+}
diff --git a/gradle/README.md b/gradle/README.md
index 14e460f225..84a8508e2c 100644
--- a/gradle/README.md
+++ b/gradle/README.md
@@ -1,6 +1,10 @@
+## Gradle
+
+This module contains articles about Gradle
+
## Relevant articles:
-- [Introduction to Gradle](http://www.baeldung.com/gradle)
-- [Writing Custom Gradle Plugins](http://www.baeldung.com/gradle-create-plugin)
-- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar)
-- [A Custom Task in Gradle](http://www.baeldung.com/gradle-custom-task)
+- [Introduction to Gradle](https://www.baeldung.com/gradle)
+- [Writing Custom Gradle Plugins](https://www.baeldung.com/gradle-create-plugin)
+- [Creating a Fat Jar in Gradle](https://www.baeldung.com/gradle-fat-jar)
+- [A Custom Task in Gradle](https://www.baeldung.com/gradle-custom-task)
- [Using JUnit 5 with Gradle](https://www.baeldung.com/junit-5-gradle)
diff --git a/grails/README.md b/grails/README.md
index faa50a7efd..ec9bb2a504 100644
--- a/grails/README.md
+++ b/grails/README.md
@@ -1,3 +1,7 @@
+## Grails
+
+This module contains articles about Grails
+
### Relevant articles
-- [Build an MVC Web Application with Grails](http://www.baeldung.com/grails-mvc-application)
+- [Build an MVC Web Application with Grails](https://www.baeldung.com/grails-mvc-application)
diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md
index 0033524209..e3fd818400 100644
--- a/graphql/graphql-java/README.md
+++ b/graphql/graphql-java/README.md
@@ -1,3 +1,7 @@
+## GraphQL Java
+
+This module contains articles about GraphQL with Java
+
## Relevant articles:
-- [Introduction to GraphQL](http://www.baeldung.com/graphql)
+- [Introduction to GraphQL](https://www.baeldung.com/graphql)
diff --git a/grpc/README.md b/grpc/README.md
index 5a60ca2e7e..d65dc03e54 100644
--- a/grpc/README.md
+++ b/grpc/README.md
@@ -1,2 +1,6 @@
+## gRPC
+
+This module contains articles about gRPC
+
### Relevant Articles:
-- [Introduction to gRPC](http://www.baeldung.com/grpc-introduction)
+- [Introduction to gRPC](https://www.baeldung.com/grpc-introduction)
diff --git a/gson/README.md b/gson/README.md
index 268116a2ac..df6ba0f516 100644
--- a/gson/README.md
+++ b/gson/README.md
@@ -1,12 +1,12 @@
-=========
-
-## GSON Cookbooks and Examples
+## GSON
+This module contains articles about Gson
### Relevant Articles:
-- [Gson Deserialization Cookbook](http://www.baeldung.com/gson-deserialization-guide)
-- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson)
-- [Exclude Fields from Serialization in Gson](http://www.baeldung.com/gson-exclude-fields-serialization)
+
+- [Gson Deserialization Cookbook](https://www.baeldung.com/gson-deserialization-guide)
+- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson)
+- [Exclude Fields from Serialization in Gson](https://www.baeldung.com/gson-exclude-fields-serialization)
- [Save Data to a JSON File with Gson](https://www.baeldung.com/gson-save-file)
- [Convert JSON to a Map Using Gson](https://www.baeldung.com/gson-json-to-map)
- [Working with Primitive Values in Gson](https://www.baeldung.com/java-gson-primitives)
diff --git a/gson/pom.xml b/gson/pom.xml
index 9d2cf630d0..4aa6c00458 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -2,7 +2,6 @@
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
- com.baeldung
gson
0.1-SNAPSHOT
gson
diff --git a/guava-collections-map/README.md b/guava-collections-map/README.md
new file mode 100644
index 0000000000..b3ec5e2157
--- /dev/null
+++ b/guava-collections-map/README.md
@@ -0,0 +1,12 @@
+=========
+
+## Guava Collections Map examples
+
+This module contains articles about map collections in Guava
+
+### Relevant Articles:
+- [Guava – Maps](https://www.baeldung.com/guava-maps)
+- [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap)
+- [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap)
+- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map)
\ No newline at end of file
diff --git a/guava-collections-map/pom.xml b/guava-collections-map/pom.xml
new file mode 100644
index 0000000000..21597d0e28
--- /dev/null
+++ b/guava-collections-map/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+ com.baeldung.guava
+ guava-collections-map
+ 0.1.0-SNAPSHOT
+ guava-collections-map
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ guava-collections-map
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java
similarity index 97%
rename from guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java
rename to guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java
index 295672d7ad..b9807379eb 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.classtoinstancemap;
import com.google.common.collect.ClassToInstanceMap;
import com.google.common.collect.ImmutableClassToInstanceMap;
import com.google.common.collect.MutableClassToInstanceMap;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java
similarity index 95%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java
rename to guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java
index 69a7505316..0866496ef5 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.initializemaps;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.*;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java
similarity index 51%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java
rename to guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java
index ab38afa5c4..4108df8c96 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java
@@ -1,115 +1,18 @@
-package org.baeldung.guava;
+package com.baeldung.guava.maps;
-import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import org.junit.Test;
import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.ClassToInstanceMap;
-import com.google.common.collect.ContiguousSet;
-import com.google.common.collect.DiscreteDomain;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.HashBiMap;
-import com.google.common.collect.HashMultiset;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.Multiset;
-import com.google.common.collect.Multisets;
-import com.google.common.collect.MutableClassToInstanceMap;
-import com.google.common.collect.Ordering;
-import com.google.common.collect.Range;
-import com.google.common.collect.RangeSet;
-import com.google.common.collect.Sets;
-import com.google.common.collect.Table;
-import com.google.common.collect.Tables;
-import com.google.common.collect.TreeRangeSet;
+import com.google.common.collect.*;
-public class GuavaCollectionTypesUnitTest {
-
- @Test
- public void whenCreateList_thenCreated() {
- final List names = Lists.newArrayList("John", "Adam", "Jane");
-
- names.add("Tom");
- assertEquals(4, names.size());
-
- names.remove("Adam");
- assertThat(names, contains("John", "Jane", "Tom"));
- }
-
- @Test
- public void whenReverseList_thenReversed() {
- final List names = Lists.newArrayList("John", "Adam", "Jane");
-
- final List reversed = Lists.reverse(names);
- assertThat(reversed, contains("Jane", "Adam", "John"));
- }
-
- @Test
- public void whenCreateCharacterListFromString_thenCreated() {
- final List chars = Lists.charactersOf("John");
-
- assertEquals(4, chars.size());
- assertThat(chars, contains('J', 'o', 'h', 'n'));
- }
-
- @Test
- public void whenPartitionList_thenPartitioned() {
- final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom", "Viki", "Tyler");
- final List> result = Lists.partition(names, 2);
-
- assertEquals(3, result.size());
- assertThat(result.get(0), contains("John", "Jane"));
- assertThat(result.get(1), contains("Adam", "Tom"));
- assertThat(result.get(2), contains("Viki", "Tyler"));
- }
-
- @Test
- public void whenRemoveDuplicatesFromList_thenRemoved() {
- final List chars = Lists.newArrayList('h', 'e', 'l', 'l', 'o');
- assertEquals(5, chars.size());
-
- final List result = ImmutableSet.copyOf(chars).asList();
- assertThat(result, contains('h', 'e', 'l', 'o'));
- }
-
- @Test
- public void whenRemoveNullFromList_thenRemoved() {
- final List names = Lists.newArrayList("John", null, "Adam", null, "Jane");
- Iterables.removeIf(names, Predicates.isNull());
-
- assertEquals(3, names.size());
- assertThat(names, contains("John", "Adam", "Jane"));
- }
-
- @Test
- public void whenCreateImmutableList_thenCreated() {
- final List names = Lists.newArrayList("John", "Adam", "Jane");
-
- names.add("Tom");
- assertEquals(4, names.size());
-
- final ImmutableList immutable = ImmutableList.copyOf(names);
- assertThat(immutable, contains("John", "Adam", "Jane", "Tom"));
- }
+public class GuavaMapsUnitTest {
@Test
public void whenCreateImmutableMap_thenCreated() {
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java
similarity index 97%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java
rename to guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java
index f51dcadefc..06e85e41e5 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.multimap;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
rename to guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java
index c0c5efea23..f221a2dcf8 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java
+++ b/guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.rangemap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
diff --git a/guava-collections-set/README.md b/guava-collections-set/README.md
index c36d9e0b61..2e8e1ecdd0 100644
--- a/guava-collections-set/README.md
+++ b/guava-collections-set/README.md
@@ -1,8 +1,10 @@
-# Guava
+## Guava Collections Set
+
+This module contains articles about Google Guava sets
## Relevant Articles:
-- [Guava – Sets](http://www.baeldung.com/guava-sets)
-- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset)
-- [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial)
+- [Guava – Sets](https://www.baeldung.com/guava-sets)
+- [Guide to Guava RangeSet](https://www.baeldung.com/guava-rangeset)
+- [Guava Set + Function = Map](https://www.baeldung.com/guava-set-function-map-tutorial)
- [Guide to Guava Multiset](https://www.baeldung.com/guava-multiset)
diff --git a/guava-collections-set/pom.xml b/guava-collections-set/pom.xml
index 46dcae492d..640a28c4c1 100644
--- a/guava-collections-set/pom.xml
+++ b/guava-collections-set/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava-collections-set
0.1.0-SNAPSHOT
guava-collections-set
@@ -28,8 +27,6 @@
-
- 27.1-jre
3.6.1
diff --git a/guava-collections/README.md b/guava-collections/README.md
index e919a98c2b..51731d7db7 100644
--- a/guava-collections/README.md
+++ b/guava-collections/README.md
@@ -1,20 +1,16 @@
-=========
-
-## Guava and Hamcrest Cookbooks and Examples
+## Guava Collections
+This module contains articles about Google Guava collections
### Relevant Articles:
-- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections)
-- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order)
-- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays)
-- [Partition a List in Java](http://www.baeldung.com/java-list-split)
-- [Filtering and Transforming Collections in Guava](http://www.baeldung.com/guava-filter-and-transform-a-collection)
-- [Guava – Join and Split Collections](http://www.baeldung.com/guava-joiner-and-splitter-tutorial)
-- [Guava – Lists](http://www.baeldung.com/guava-lists)
-- [Guava – Maps](http://www.baeldung.com/guava-maps)
-- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap)
-- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap)
-- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
-- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
-- [Guide to Guava Table](http://www.baeldung.com/guava-table)
-- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map)
\ No newline at end of file
+
+- [Guava Collections Cookbook](https://www.baeldung.com/guava-collections)
+- [Guava Ordering Cookbook](https://www.baeldung.com/guava-order)
+- [Guide to Guava’s Ordering](https://www.baeldung.com/guava-ordering)
+- [Hamcrest Collections Cookbook](https://www.baeldung.com/hamcrest-collections-arrays)
+- [Partition a List in Java](https://www.baeldung.com/java-list-split)
+- [Filtering and Transforming Collections in Guava](https://www.baeldung.com/guava-filter-and-transform-a-collection)
+- [Guava – Join and Split Collections](https://www.baeldung.com/guava-joiner-and-splitter-tutorial)
+- [Guava – Lists](https://www.baeldung.com/guava-lists)
+- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue)
+- [Guide to Guava Table](https://www.baeldung.com/guava-table)
diff --git a/guava-collections/pom.xml b/guava-collections/pom.xml
index ecda3c9595..9dfcceaab8 100644
--- a/guava-collections/pom.xml
+++ b/guava-collections/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava-collections
0.1.0-SNAPSHOT
guava-collections
@@ -43,7 +42,7 @@
- guava
+ guava-collections
src/main/resources
@@ -54,7 +53,6 @@
- 24.0-jre
4.1
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java
index 7b5cef6055..86e8dea21c 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.collections;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java
index 8562193665..447149f002 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.filtertransform;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java
index a08efd7c31..73c4c3291e 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.joinsplit;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsString;
diff --git a/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java
new file mode 100644
index 0000000000..2f414dcdb1
--- /dev/null
+++ b/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java
@@ -0,0 +1,82 @@
+package com.baeldung.guava.lists;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.*;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.Matchers.contains;
+
+public class GuavaListsUnitTest {
+
+ @Test
+ public void whenCreateList_thenCreated() {
+ final List names = Lists.newArrayList("John", "Adam", "Jane");
+
+ names.add("Tom");
+ assertEquals(4, names.size());
+
+ names.remove("Adam");
+ assertThat(names, contains("John", "Jane", "Tom"));
+ }
+
+ @Test
+ public void whenReverseList_thenReversed() {
+ final List names = Lists.newArrayList("John", "Adam", "Jane");
+
+ final List reversed = Lists.reverse(names);
+ assertThat(reversed, contains("Jane", "Adam", "John"));
+ }
+
+ @Test
+ public void whenCreateCharacterListFromString_thenCreated() {
+ final List chars = Lists.charactersOf("John");
+
+ assertEquals(4, chars.size());
+ assertThat(chars, contains('J', 'o', 'h', 'n'));
+ }
+
+ @Test
+ public void whenPartitionList_thenPartitioned() {
+ final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom", "Viki", "Tyler");
+ final List> result = Lists.partition(names, 2);
+
+ assertEquals(3, result.size());
+ assertThat(result.get(0), contains("John", "Jane"));
+ assertThat(result.get(1), contains("Adam", "Tom"));
+ assertThat(result.get(2), contains("Viki", "Tyler"));
+ }
+
+ @Test
+ public void whenRemoveDuplicatesFromList_thenRemoved() {
+ final List chars = Lists.newArrayList('h', 'e', 'l', 'l', 'o');
+ assertEquals(5, chars.size());
+
+ final List result = ImmutableSet.copyOf(chars).asList();
+ assertThat(result, contains('h', 'e', 'l', 'o'));
+ }
+
+ @Test
+ public void whenRemoveNullFromList_thenRemoved() {
+ final List names = Lists.newArrayList("John", null, "Adam", null, "Jane");
+ Iterables.removeIf(names, Predicates.isNull());
+
+ assertEquals(3, names.size());
+ assertThat(names, contains("John", "Adam", "Jane"));
+ }
+
+ @Test
+ public void whenCreateImmutableList_thenCreated() {
+ final List names = Lists.newArrayList("John", "Adam", "Jane");
+
+ names.add("Tom");
+ assertEquals(4, names.size());
+
+ final ImmutableList immutable = ImmutableList.copyOf(names);
+ assertThat(immutable, contains("John", "Adam", "Jane", "Tom"));
+ }
+
+}
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java
index b8be06deb4..46ceccd7ba 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.ordering;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.nullValue;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java
similarity index 98%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java
index dd250898fd..73d464bde5 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.ordering;
import com.google.common.base.Function;
import com.google.common.collect.Ordering;
diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java
similarity index 97%
rename from guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java
index 1071d4a5fb..1cb566dd6b 100644
--- a/guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java;
+package com.baeldung.guava.partition;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java
similarity index 98%
rename from guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java
index c4ddb35da2..8eb259b490 100644
--- a/guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java;
+package com.baeldung.guava.partition;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java
similarity index 98%
rename from guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java
index 63583987ea..d62ca275c1 100644
--- a/guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java;
+package com.baeldung.guava.partition;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java
similarity index 95%
rename from guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java
index e4d29d2e92..b9abef8d1f 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.queues;
import com.google.common.collect.EvictingQueue;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java
similarity index 97%
rename from guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java
index 1c4df03c86..95446e0d44 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.queues;
import com.google.common.collect.MinMaxPriorityQueue;
diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java
index 28e132074e..e9a9560afd 100644
--- a/guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.guava;
+package com.baeldung.guava.table;
import static org.assertj.core.api.Assertions.*;
import java.util.List;
diff --git a/guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java
similarity index 99%
rename from guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java
rename to guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java
index 82b6b8c87c..820f065957 100644
--- a/guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java
+++ b/guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.hamcrest;
+package com.baeldung.hamcrest;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
diff --git a/guava-io/README.md b/guava-io/README.md
new file mode 100644
index 0000000000..81188295e7
--- /dev/null
+++ b/guava-io/README.md
@@ -0,0 +1,8 @@
+## Guava IO
+
+This module contains articles about input/output (IO) with Google Guava
+
+### Relevant Articles:
+
+- [Using Guava CountingOutputStream](https://www.baeldung.com/guava-counting-outputstream)
+- [Guava – Write to File, Read from File](https://www.baeldung.com/guava-write-to-file-read-from-file)
diff --git a/guava-io/pom.xml b/guava-io/pom.xml
new file mode 100644
index 0000000000..aaaf7edd4e
--- /dev/null
+++ b/guava-io/pom.xml
@@ -0,0 +1,25 @@
+
+ 4.0.0
+ guava-io
+ 0.1.0-SNAPSHOT
+ guava-io
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ guava-io
+
+
+ src/main/resources
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java
diff --git a/guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java
similarity index 100%
rename from guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java
rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java
diff --git a/guava-modules/README.md b/guava-modules/README.md
index 79e45a89e7..898b8b7d9f 100644
--- a/guava-modules/README.md
+++ b/guava-modules/README.md
@@ -1,3 +1,4 @@
-
## Guava Modules
+This module contains other modules about Google Guava
+
diff --git a/guava/README.md b/guava/README.md
index 60754dbe57..c67a3604ea 100644
--- a/guava/README.md
+++ b/guava/README.md
@@ -1,20 +1,15 @@
-=========
-
-## Guava and Hamcrest Cookbooks and Examples
+## Guava
+This module contains articles a Google Guava
### Relevant Articles:
-- [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates)
-- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file)
-- [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering)
-- [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions)
-- [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader)
-- [Introduction to Guava Memoizer](http://www.baeldung.com/guava-memoizer)
-- [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus)
-- [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection)
-- [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math)
-- [Bloom Filter in Java using Guava](http://www.baeldung.com/guava-bloom-filter)
-- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream)
-- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers)
-- [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter)
-- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers)
+- [Guava Functional Cookbook](https://www.baeldung.com/guava-functions-predicates)
+- [Guide to Guava’s PreConditions](https://www.baeldung.com/guava-preconditions)
+- [Introduction to Guava CacheLoader](https://www.baeldung.com/guava-cacheloader)
+- [Introduction to Guava Memoizer](https://www.baeldung.com/guava-memoizer)
+- [Guide to Guava’s EventBus](https://www.baeldung.com/guava-eventbus)
+- [Guide to Guava’s Reflection Utilities](https://www.baeldung.com/guava-reflection)
+- [Guide to Mathematical Utilities in Guava](https://www.baeldung.com/guava-math)
+- [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter)
+- [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter)
+
diff --git a/guava/pom.xml b/guava/pom.xml
index 34eb7eafa6..4ca9918455 100644
--- a/guava/pom.xml
+++ b/guava/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
guava
0.1.0-SNAPSHOT
guava
@@ -26,14 +25,6 @@
${assertj.version}
test
-
-
-
- org.hamcrest
- java-hamcrest
- ${java-hamcrest.version}
- test
-
@@ -47,12 +38,8 @@
-
- 24.0-jre
-
3.6.1
- 2.0.0.0
\ No newline at end of file
diff --git a/guava/src/test/java/org/baeldung/hamcrest/README.md b/guava/src/test/java/org/baeldung/hamcrest/README.md
deleted file mode 100644
index 7266ecda3a..0000000000
--- a/guava/src/test/java/org/baeldung/hamcrest/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-### Relevant Articles:
-- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide)
diff --git a/guice/README.md b/guice/README.md
index 77c788c363..712639dfce 100644
--- a/guice/README.md
+++ b/guice/README.md
@@ -1,5 +1,8 @@
-## Google Guice Tutorials Project
+## Google Guice
+
+This module contains articles about Google Guice
### Relevant Articles
-- [Guide to Google Guice](http://www.baeldung.com/guice)
+
+- [Guide to Google Guice](https://www.baeldung.com/guice)
- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection)
diff --git a/hazelcast/README.md b/hazelcast/README.md
index 7adb13f2af..a37009ef7e 100644
--- a/hazelcast/README.md
+++ b/hazelcast/README.md
@@ -1,3 +1,7 @@
+## Hazelcast
+
+This module contains articles about Hazelcast
+
### Relevant Articles:
-- [Guide to Hazelcast with Java](http://www.baeldung.com/java-hazelcast)
+- [Guide to Hazelcast with Java](https://www.baeldung.com/java-hazelcast)
- [Introduction to Hazelcast Jet](https://www.baeldung.com/hazelcast-jet)
diff --git a/hazelcast/pom.xml b/hazelcast/pom.xml
index 705792ad05..9e0b0671d0 100644
--- a/hazelcast/pom.xml
+++ b/hazelcast/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
hazelcast
0.0.1-SNAPSHOT
hazelcast
diff --git a/helidon/README.md b/helidon/README.md
index a092faf9f2..fa5bade4fe 100644
--- a/helidon/README.md
+++ b/helidon/README.md
@@ -1,3 +1,7 @@
+## Helidon
+
+This module contains articles about Helidon
+
### Relevant articles
- [Microservices with Oracle Helidon](https://www.baeldung.com/microservices-oracle-helidon)
diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md
index e3535a133e..098d5f278e 100644
--- a/httpclient-simple/README.md
+++ b/httpclient-simple/README.md
@@ -1,12 +1,15 @@
-=========
-## This module contains articles that are part of the HTTPClient Ebook
+## HTTPClient Ebook
-- [HttpClient 4 – Get the Status Code](http://www.baeldung.com/httpclient-status-code)
-- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl)
-- [HttpClient Timeout](http://www.baeldung.com/httpclient-timeout)
-- [HttpClient 4 – Send Custom Cookie](http://www.baeldung.com/httpclient-4-cookies)
-- [Custom HTTP Header with the HttpClient](http://www.baeldung.com/httpclient-custom-http-header)
-- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication)
+This module contains articles about HTTPClient that are part of the HTTPClient Ebook.
+
+### Relevant Articles
+
+- [HttpClient 4 – Get the Status Code](https://www.baeldung.com/httpclient-status-code)
+- [HttpClient with SSL](https://www.baeldung.com/httpclient-ssl)
+- [HttpClient Timeout](https://www.baeldung.com/httpclient-timeout)
+- [HttpClient 4 – Send Custom Cookie](https://www.baeldung.com/httpclient-4-cookies)
+- [Custom HTTP Header with the HttpClient](https://www.baeldung.com/httpclient-custom-http-header)
+- [HttpClient Basic Authentication](https://www.baeldung.com/httpclient-4-basic-authentication)
- [Posting with HttpClient](https://www.baeldung.com/httpclient-post-http-request)
diff --git a/httpclient-simple/pom.xml b/httpclient-simple/pom.xml
index 7dd54c8fc4..183c4438de 100644
--- a/httpclient-simple/pom.xml
+++ b/httpclient-simple/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
httpclient-simple
0.1-SNAPSHOT
httpclient-simple
@@ -21,12 +20,12 @@
org.springframework.security
spring-security-web
- ${spring.version}
+ ${spring-security.version}
org.springframework.security
spring-security-config
- ${spring.version}
+ ${spring-security.version}
diff --git a/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java b/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java
index a485641b34..d133bc376c 100644
--- a/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java
+++ b/httpclient-simple/src/test/java/com/baeldung/client/RestClientLiveManualTest.java
@@ -6,9 +6,9 @@ import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.security.GeneralSecurityException;
-import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLPeerUnverifiedException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
@@ -46,7 +46,7 @@ public class RestClientLiveManualTest {
// old httpClient will throw UnsupportedOperationException
@Ignore
@Test
- public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk_1() throws GeneralSecurityException {
+ public final void givenAcceptingAllCertificates_whenHttpsUrlIsConsumed_thenOk() throws GeneralSecurityException {
final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
final CloseableHttpClient httpClient = (CloseableHttpClient) requestFactory.getHttpClient();
@@ -92,7 +92,7 @@ public class RestClientLiveManualTest {
}
@Test
- public final void givenAcceptingAllCertificatesUsing4_4_whenHttpsUrlIsConsumedUsingRestTemplate_thenCorrect() throws ClientProtocolException, IOException {
+ public final void givenAcceptingAllCertificatesUsing4_4_whenUsingRestTemplate_thenCorrect() throws ClientProtocolException, IOException {
final CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
@@ -101,4 +101,12 @@ public class RestClientLiveManualTest {
assertThat(response.getStatusCode().value(), equalTo(200));
}
+ @Test(expected = SSLPeerUnverifiedException.class)
+ public void whenHttpsUrlIsConsumed_thenException() throws ClientProtocolException, IOException {
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ String urlOverHttps = "https://localhost:8082/httpclient-simple";
+ HttpGet getMethod = new HttpGet(urlOverHttps);
+ HttpResponse response = httpClient.execute(getMethod);
+ assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
+ }
}
diff --git a/httpclient/README.md b/httpclient/README.md
index a5fc29b089..678b195965 100644
--- a/httpclient/README.md
+++ b/httpclient/README.md
@@ -1,19 +1,20 @@
-=========
-## HttpClient 4.x Cookbooks and Examples
+## HttpClient 4.x
+
+This module contains articles about HttpClient 4.x
###The Course
-The "REST With Spring" Classes: http://bit.ly/restwithspring
+The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [HttpClient 4 – Cancel Request](http://www.baeldung.com/httpclient-cancel-request)
-- [HttpClient 4 Cookbook](http://www.baeldung.com/httpclient4)
-- [Unshorten URLs with HttpClient](http://www.baeldung.com/unshorten-url-httpclient)
-- [HttpClient 4 – Follow Redirects for POST](http://www.baeldung.com/httpclient-redirect-on-http-post)
-- [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload)
-- [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial)
-- [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide)
-- [Advanced HttpClient Configuration](http://www.baeldung.com/httpclient-advanced-config)
-- [HttpClient 4 – Do Not Follow Redirects](http://www.baeldung.com/httpclient-stop-follow-redirect)
-- [Custom User-Agent in HttpClient 4](http://www.baeldung.com/httpclient-user-agent-header)
+- [HttpClient 4 – Cancel Request](https://www.baeldung.com/httpclient-cancel-request)
+- [HttpClient 4 Cookbook](https://www.baeldung.com/httpclient4)
+- [Unshorten URLs with HttpClient](https://www.baeldung.com/unshorten-url-httpclient)
+- [HttpClient 4 – Follow Redirects for POST](https://www.baeldung.com/httpclient-redirect-on-http-post)
+- [Multipart Upload with HttpClient 4](https://www.baeldung.com/httpclient-multipart-upload)
+- [HttpAsyncClient Tutorial](https://www.baeldung.com/httpasyncclient-tutorial)
+- [HttpClient 4 Tutorial](https://www.baeldung.com/httpclient-guide)
+- [Advanced HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config)
+- [HttpClient 4 – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect)
+- [Custom User-Agent in HttpClient 4](https://www.baeldung.com/httpclient-user-agent-header)
diff --git a/httpclient/pom.xml b/httpclient/pom.xml
index 8cd483cfc6..6316ee4eed 100644
--- a/httpclient/pom.xml
+++ b/httpclient/pom.xml
@@ -1,7 +1,6 @@
4.0.0
- com.baeldung
httpclient
0.1-SNAPSHOT
httpclient
@@ -48,11 +47,6 @@
httpmime
${httpclient.version}
-
- commons-codec
- commons-codec
- ${commons-codec.version}
-
org.apache.httpcomponents
httpasyncclient
@@ -82,51 +76,12 @@
-
-
- live
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
-
-
- **/*LiveTest.java
-
-
-
-
-
-
- json
-
-
-
-
-
-
-
-
- 19.0
- 1.10
4.1.4
2.5.1
4.5.8
-
- 1.6.1
\ No newline at end of file
diff --git a/hystrix/README.md b/hystrix/README.md
index cc5c8a197f..d53baee957 100644
--- a/hystrix/README.md
+++ b/hystrix/README.md
@@ -1,3 +1,7 @@
+## Hystrix
+
+This module contains articles about Hystrix.
+
### Relevant Articles:
-- [Hystrix Integration with Existing Spring Application](http://www.baeldung.com/hystrix-integration-with-spring-aop)
-- [Introduction to Hystrix](http://www.baeldung.com/introduction-to-hystrix)
+- [Hystrix Integration with Existing Spring Application](https://www.baeldung.com/hystrix-integration-with-spring-aop)
+- [Introduction to Hystrix](https://www.baeldung.com/introduction-to-hystrix)
diff --git a/hystrix/pom.xml b/hystrix/pom.xml
index e08af2c40f..4aeb47f095 100644
--- a/hystrix/pom.xml
+++ b/hystrix/pom.xml
@@ -41,23 +41,11 @@
hystrix-metrics-event-stream
${hystrix-metrics-event-stream.version}
-
com.netflix.rxjava
rxjava-core
${rxjava-core.version}
-
- org.hamcrest
- hamcrest-all
- ${hamcrest-all.version}
- test
-
-
- org.springframework
- spring-test
- test
-
@@ -65,9 +53,7 @@
1.5.8
0.20.7
- 2.7
1.5.8
- 1.5.8
diff --git a/image-processing/README.md b/image-processing/README.md
index 48604bdb1f..adb35c2318 100644
--- a/image-processing/README.md
+++ b/image-processing/README.md
@@ -1,2 +1,6 @@
+## Image Processing
+
+This module contains articles about image processing.
+
### Relevant Articles:
-- [Working with Images in Java](http://www.baeldung.com/java-images)
+- [Working with Images in Java](https://www.baeldung.com/java-images)
diff --git a/immutables/README.md b/immutables/README.md
index b69a14f035..a93a342f9c 100644
--- a/immutables/README.md
+++ b/immutables/README.md
@@ -1,2 +1,6 @@
+## Immutables
+
+This module contains articles about the Immutables library.
+
### Relevant Articles:
-- [Introduction to Immutables](http://www.baeldung.com/immutables)
+- [Introduction to Immutables](https://www.baeldung.com/immutables)
diff --git a/intelliJ/intelliJ-formatter.xml b/intelliJ/intelliJ-formatter.xml
index 6dd1ae67f3..9b1d12a3be 100644
--- a/intelliJ/intelliJ-formatter.xml
+++ b/intelliJ/intelliJ-formatter.xml
@@ -1,19 +1,15 @@
-
+
-
-
-
-
+
+
+
-
-
-
-
+
@@ -29,19 +25,18 @@
-
-
+
-
-
-
-
+
+
+
-
-
+
+
+
\ No newline at end of file
diff --git a/jackson-2/README.md b/jackson-2/README.md
index d8c233a00e..5e0cb4ec37 100644
--- a/jackson-2/README.md
+++ b/jackson-2/README.md
@@ -1,8 +1,8 @@
-=========
-
## Jackson Cookbooks and Examples
-###The Course
+This module contains articles about Jackson.
+
+### The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
@@ -10,3 +10,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring
- [How to Process YAML with Jackson](https://www.baeldung.com/jackson-yaml)
- [Working with Tree Model Nodes in Jackson](https://www.baeldung.com/jackson-json-node-tree-model)
- [Converting JSON to CSV in Java](https://www.baeldung.com/java-converting-json-to-csv)
+- [Compare Two JSON Objects with Jackson](https://www.baeldung.com/jackson-compare-two-json-objects)
+- [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer)
+- More articles: [[<-- prev]](/../jackson)
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/entities/File.java b/jackson-2/src/main/java/com/baeldung/jackson/entities/File.java
new file mode 100644
index 0000000000..0e8829e927
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/entities/File.java
@@ -0,0 +1,25 @@
+package com.baeldung.jackson.entities;
+
+public class File {
+
+ private Long id;
+
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
\ No newline at end of file
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/entities/Folder.java b/jackson-2/src/main/java/com/baeldung/jackson/entities/Folder.java
new file mode 100644
index 0000000000..c49e46b204
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/entities/Folder.java
@@ -0,0 +1,82 @@
+package com.baeldung.jackson.entities;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class Folder {
+
+ private Long id;
+
+ private String name;
+
+ private String owner;
+
+ private Date created;
+
+ private Date modified;
+
+ private Date lastAccess;
+
+ @JsonIgnore
+ private List files = new ArrayList<>();
+
+ 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 String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public Date getCreated() {
+ return created;
+ }
+
+ public void setCreated(Date created) {
+ this.created = created;
+ }
+
+ public Date getModified() {
+ return modified;
+ }
+
+ public void setModified(Date modified) {
+ this.modified = modified;
+ }
+
+ public Date getLastAccess() {
+ return lastAccess;
+ }
+
+ public void setLastAccess(Date lastAccess) {
+ this.lastAccess = lastAccess;
+ }
+
+ public List getFiles() {
+ return files;
+ }
+
+ public void setFiles(List files) {
+ this.files = files;
+ }
+
+}
\ No newline at end of file
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderBeanSerializerModifier.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderBeanSerializerModifier.java
new file mode 100644
index 0000000000..a3add58dc4
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderBeanSerializerModifier.java
@@ -0,0 +1,21 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.databind.BeanDescription;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializationConfig;
+import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
+
+public class FolderBeanSerializerModifier extends BeanSerializerModifier {
+
+ @Override
+ public JsonSerializer> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer> serializer) {
+
+ if (beanDesc.getBeanClass().equals(Folder.class)) {
+ return new FolderSerializerWithDefaultSerializerStored((JsonSerializer) serializer);
+ }
+
+ return serializer;
+ }
+
+}
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializer.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializer.java
new file mode 100644
index 0000000000..f385e63e09
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializer.java
@@ -0,0 +1,36 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.File;
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FolderSerializer extends StdSerializer {
+
+ public FolderSerializer() {
+ super(Folder.class);
+ }
+
+ @Override
+ public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeStartObject();
+ gen.writeStringField("name", value.getName());
+
+ gen.writeArrayFieldStart("files");
+ for (File file : value.getFiles()) {
+ gen.writeStartObject();
+ gen.writeNumberField("id", file.getId());
+ gen.writeStringField("name", file.getName());
+ gen.writeEndObject();
+ }
+ gen.writeEndArray();
+
+ gen.writeEndObject();
+
+ }
+
+}
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithCallingOwnSerializer.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithCallingOwnSerializer.java
new file mode 100644
index 0000000000..ed5d9fffb8
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithCallingOwnSerializer.java
@@ -0,0 +1,30 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FolderSerializerWithCallingOwnSerializer extends StdSerializer {
+
+ public FolderSerializerWithCallingOwnSerializer() {
+ super(Folder.class);
+ }
+
+ @Override
+ public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeStartObject();
+ gen.writeStringField("name", value.getName());
+
+ provider.defaultSerializeField("files", value.getFiles(), gen);
+
+ provider.defaultSerializeField("details", value, gen);
+
+ gen.writeEndObject();
+
+ }
+
+}
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithDefaultSerializerStored.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithDefaultSerializerStored.java
new file mode 100644
index 0000000000..d4a95cd939
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithDefaultSerializerStored.java
@@ -0,0 +1,35 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FolderSerializerWithDefaultSerializerStored extends StdSerializer {
+
+ private final JsonSerializer defaultSerializer;
+
+ public FolderSerializerWithDefaultSerializerStored(JsonSerializer defaultSerializer) {
+ super(Folder.class);
+ this.defaultSerializer = defaultSerializer;
+ }
+
+ @Override
+ public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeStartObject();
+ gen.writeStringField("name", value.getName());
+
+ provider.defaultSerializeField("files", value.getFiles(), gen);
+
+ gen.writeFieldName("details");
+ defaultSerializer.serialize(value, gen, provider);
+
+ gen.writeEndObject();
+
+ }
+
+}
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithInternalObjectMapper.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithInternalObjectMapper.java
new file mode 100644
index 0000000000..b23dc32205
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithInternalObjectMapper.java
@@ -0,0 +1,34 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FolderSerializerWithInternalObjectMapper extends StdSerializer {
+
+ public FolderSerializerWithInternalObjectMapper() {
+ super(Folder.class);
+ }
+
+ @Override
+ public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeStartObject();
+ gen.writeStringField("name", value.getName());
+
+ // we access internal mapper to delegate the serialization of File list
+ ObjectMapper mapper = (ObjectMapper) gen.getCodec();
+
+ gen.writeFieldName("files");
+ String stringValue = mapper.writeValueAsString(value.getFiles());
+ gen.writeRawValue(stringValue);
+
+ gen.writeEndObject();
+
+ }
+
+}
diff --git a/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithSerializerProvider.java b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithSerializerProvider.java
new file mode 100644
index 0000000000..81990a084d
--- /dev/null
+++ b/jackson-2/src/main/java/com/baeldung/jackson/serialization/custom/serializer/FolderSerializerWithSerializerProvider.java
@@ -0,0 +1,29 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import java.io.IOException;
+
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class FolderSerializerWithSerializerProvider extends StdSerializer {
+
+ public FolderSerializerWithSerializerProvider() {
+ super(Folder.class);
+ }
+
+ @Override
+ public void serialize(Folder value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+
+ gen.writeStartObject();
+ gen.writeStringField("name", value.getName());
+
+ // we delegate the File list serialization to its default serializer
+ provider.defaultSerializeField("files", value.getFiles(), gen);
+
+ gen.writeEndObject();
+
+ }
+
+}
\ No newline at end of file
diff --git a/jackson-2/src/test/java/com/baeldung/jackson/serialization/custom/serializer/CallingDefaultSerializerUnitTest.java b/jackson-2/src/test/java/com/baeldung/jackson/serialization/custom/serializer/CallingDefaultSerializerUnitTest.java
new file mode 100644
index 0000000000..b067e7b501
--- /dev/null
+++ b/jackson-2/src/test/java/com/baeldung/jackson/serialization/custom/serializer/CallingDefaultSerializerUnitTest.java
@@ -0,0 +1,166 @@
+package com.baeldung.jackson.serialization.custom.serializer;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.baeldung.jackson.entities.File;
+import com.baeldung.jackson.entities.Folder;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+
+public class CallingDefaultSerializerUnitTest {
+
+ private ObjectMapper mapper;
+ private Folder mockFolder;
+ private TypeReference> mapType;
+
+ @Before
+ public void setup() {
+
+ mapType = new TypeReference>() {
+ };
+
+ mapper = new ObjectMapper();
+
+ mockFolder = new Folder();
+ mockFolder.setId(1L);
+ mockFolder.setName("Root Folder");
+ mockFolder.setOwner("root");
+ mockFolder.setCreated(Date.from(Instant.now().minusSeconds(60)));
+ mockFolder.setModified(Date.from(Instant.now().minusSeconds(30)));
+ mockFolder.setLastAccess(Date.from(Instant.now()));
+
+ File file1 = new File();
+ file1.setId(1L);
+ file1.setName("File 1");
+
+ File file2 = new File();
+ file2.setId(2L);
+ file2.setName("File 2");
+
+ List files = new ArrayList<>();
+ files.add(file1);
+ files.add(file2);
+ mockFolder.setFiles(files);
+
+ }
+
+ @Test
+ public void givenFolder_whenSerialized_onlyNameAndFilesFieldsSerialized() throws IOException {
+
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(new FolderSerializer());
+ mapper.registerModule(module);
+
+ String json = mapper.writeValueAsString(mockFolder);
+
+ HashMap actual = mapper.readValue(json, mapType);
+
+ assertTrue(actual.containsKey("name"));
+ assertTrue(actual.containsKey("files"));
+ assertEquals(mockFolder.getName(), actual.get("name"));
+
+ List actualFiles = (List) actual.get("files");
+ assertEquals(mockFolder.getFiles().size(), actualFiles.size());
+
+ }
+
+ @Test
+ public void givenFolder_whenSerializedWithSerializerProvider_onlyNameAndFilesFieldsSerialized() throws IOException {
+
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(new FolderSerializerWithSerializerProvider());
+ mapper.registerModule(module);
+
+ String json = mapper.writeValueAsString(mockFolder);
+
+ HashMap actual = mapper.readValue(json, mapType);
+
+ assertTrue(actual.containsKey("name"));
+ assertTrue(actual.containsKey("files"));
+ assertEquals(mockFolder.getName(), actual.get("name"));
+
+ List actualFiles = (List) actual.get("files");
+ assertEquals(mockFolder.getFiles().size(), actualFiles.size());
+
+ }
+
+ @Test
+ public void givenFolder_whenSerializedWithInternalObjectMapper_onlyNameAndFilesFieldsSerialized() throws IOException {
+
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(new FolderSerializerWithInternalObjectMapper());
+ mapper.registerModule(module);
+
+ String json = mapper.writeValueAsString(mockFolder);
+
+ HashMap actual = mapper.readValue(json, mapType);
+
+ assertTrue(actual.containsKey("name"));
+ assertTrue(actual.containsKey("files"));
+ assertEquals(mockFolder.getName(), actual.get("name"));
+
+ List actualFiles = (List) actual.get("files");
+ assertEquals(mockFolder.getFiles().size(), actualFiles.size());
+
+ }
+
+ @Test(expected = StackOverflowError.class)
+ public void givenFolder_whenSerializedWithCallingOwnSerializer_exceptionOccured() throws IOException {
+
+ SimpleModule module = new SimpleModule();
+ module.addSerializer(new FolderSerializerWithCallingOwnSerializer());
+ mapper.registerModule(module);
+
+ mapper.writeValueAsString(mockFolder);
+
+ }
+
+ @Test
+ public void givenFolder_whenSerializedWithDefaultSerializerStored_NameAndFilesAndDetailsFieldsSerialized() throws IOException {
+
+ SimpleModule module = new SimpleModule();
+ module.setSerializerModifier(new FolderBeanSerializerModifier());
+ mapper.registerModule(module);
+
+ String json = mapper.writeValueAsString(mockFolder);
+
+ HashMap actual = mapper.readValue(json, mapType);
+
+ assertTrue(actual.containsKey("name"));
+ assertTrue(actual.containsKey("files"));
+ assertEquals(mockFolder.getName(), actual.get("name"));
+
+ List actualFiles = (List) actual.get("files");
+ assertEquals(mockFolder.getFiles().size(), actualFiles.size());
+
+ Map actualDetails = (Map) actual.get("details");
+ assertTrue(actualDetails.containsKey("id"));
+ assertTrue(actualDetails.containsKey("name"));
+ assertTrue(actualDetails.containsKey("owner"));
+ assertTrue(actualDetails.containsKey("created"));
+ assertTrue(actualDetails.containsKey("modified"));
+ assertTrue(actualDetails.containsKey("lastAccess"));
+
+ assertEquals(mockFolder.getId().longValue(), ((Number)actualDetails.get("id")).longValue());
+ assertEquals(mockFolder.getName(), actualDetails.get("name"));
+ assertEquals(mockFolder.getOwner(), actualDetails.get("owner"));
+ assertEquals(mockFolder.getCreated(), new Date((long) actualDetails.get("created")));
+ assertEquals(mockFolder.getModified(), new Date((long) actualDetails.get("modified")));
+ assertEquals(mockFolder.getLastAccess(), new Date((long) actualDetails.get("lastAccess")));
+
+ }
+
+}
diff --git a/jackson-simple/README.md b/jackson-simple/README.md
index be647e22d5..9d24a20e4a 100644
--- a/jackson-simple/README.md
+++ b/jackson-simple/README.md
@@ -1,13 +1,15 @@
-=========
### Jackson Articles that are also part of the e-book
-###The Course
+This module contains articles about Jackson that are also part of the Jackson Ebook.
+
+### The Course
+
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [Jackson Ignore Properties on Marshalling](http://www.baeldung.com/jackson-ignore-properties-on-serialization)
-- [Jackson Unmarshalling json with Unknown Properties](http://www.baeldung.com/jackson-deserialize-json-unknown-properties)
-- [Jackson Annotation Examples](http://www.baeldung.com/jackson-annotations)
-- [Intro to the Jackson ObjectMapper](http://www.baeldung.com/jackson-object-mapper-tutorial)
-- [Ignore Null Fields with Jackson](http://www.baeldung.com/jackson-ignore-null-fields)
-- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property)
+- [Jackson Ignore Properties on Marshalling](https://www.baeldung.com/jackson-ignore-properties-on-serialization)
+- [Jackson Unmarshalling json with Unknown Properties](https://www.baeldung.com/jackson-deserialize-json-unknown-properties)
+- [Jackson Annotation Examples](https://www.baeldung.com/jackson-annotations)
+- [Intro to the Jackson ObjectMapper](https://www.baeldung.com/jackson-object-mapper-tutorial)
+- [Ignore Null Fields with Jackson](https://www.baeldung.com/jackson-ignore-null-fields)
+- [Jackson – Change Name of Field](https://www.baeldung.com/jackson-name-of-property)
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
similarity index 98%
rename from jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
index 146f274380..da8b464d03 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.test;
+package com.baeldung.jackson.ignore;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@@ -15,9 +15,9 @@ import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault;
import com.baeldung.jackson.dtos.MyDtoWithFilter;
import com.baeldung.jackson.dtos.MyDtoWithSpecialField;
import com.baeldung.jackson.dtos.MyMixInForIgnoreType;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreField;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName;
-import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreField;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreFieldByName;
+import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreNull;
import com.baeldung.jackson.serialization.MyDtoNullKeySerializer;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonGenerator;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
similarity index 94%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
index f573501e85..8cbcb773cc 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
similarity index 95%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
index e7b8ea2a8e..1aee31a1b3 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
similarity index 96%
rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
index bc443500a1..75532f18c2 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.dtos.ignore;
+package com.baeldung.jackson.ignore.dtos;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
index 2745e4f767..a339ddf2c5 100644
--- a/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
+++ b/jackson-simple/src/test/java/com/baeldung/jackson/objectmapper/JavaReadWriteJsonExampleUnitTest.java
@@ -1,20 +1,29 @@
package com.baeldung.jackson.objectmapper;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
import com.baeldung.jackson.objectmapper.dto.Car;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
public class JavaReadWriteJsonExampleUnitTest {
+ @Rule
+ public TemporaryFolder folder = new TemporaryFolder();
+
final String EXAMPLE_JSON = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
final String LOCAL_JSON = "[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"BMW\" }]";
@@ -27,6 +36,19 @@ public class JavaReadWriteJsonExampleUnitTest {
assertThat(carAsString, containsString("renault"));
}
+ @Test
+ public void whenWriteToFile_thanCorrect() throws Exception {
+ File resultFile = folder.newFile("car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car car = new Car("yellow", "renault");
+ objectMapper.writeValue(resultFile, car);
+
+ Car fromFile = objectMapper.readValue(resultFile, Car.class);
+ assertEquals(car.getType(), fromFile.getType());
+ assertEquals(car.getColor(), fromFile.getColor());
+ }
+
@Test
public void whenReadJsonToJava_thanCorrect() throws Exception {
final ObjectMapper objectMapper = new ObjectMapper();
@@ -66,4 +88,26 @@ public class JavaReadWriteJsonExampleUnitTest {
assertNotNull(key);
}
}
+
+ @Test
+ public void wheReadFromFile_thanCorrect() throws Exception {
+ File resource = new File("src/test/resources/json_car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car fromFile = objectMapper.readValue(resource, Car.class);
+
+ assertEquals("BMW", fromFile.getType());
+ assertEquals("Black", fromFile.getColor());
+ }
+
+ @Test
+ public void wheReadFromUrl_thanCorrect() throws Exception {
+ URL resource = new URL("file:src/test/resources/json_car.json");
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ Car fromFile = objectMapper.readValue(resource, Car.class);
+
+ assertEquals("BMW", fromFile.getType());
+ assertEquals("Black", fromFile.getColor());
+ }
}
diff --git a/jackson-simple/src/test/resources/json_car.json b/jackson-simple/src/test/resources/json_car.json
new file mode 100644
index 0000000000..2f6b35b523
--- /dev/null
+++ b/jackson-simple/src/test/resources/json_car.json
@@ -0,0 +1,4 @@
+{
+ "color": "Black",
+ "type": "BMW"
+}
\ No newline at end of file
diff --git a/jackson/README.md b/jackson/README.md
index 01d9419a27..f96a569617 100644
--- a/jackson/README.md
+++ b/jackson/README.md
@@ -1,35 +1,36 @@
-=========
-
## Jackson Cookbooks and Examples
+This module contains articles about Jackson.
+
###The Course
The "REST With Spring" Classes: http://bit.ly/restwithspring
### Relevant Articles:
-- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
-- [Jackson – Custom Serializer](http://www.baeldung.com/jackson-custom-serialization)
-- [Getting Started with Custom Deserialization in Jackson](http://www.baeldung.com/jackson-deserialization)
-- [Jackson Exceptions – Problems and Solutions](http://www.baeldung.com/jackson-exception)
-- [Jackson Date](http://www.baeldung.com/jackson-serialize-dates)
-- [Jackson – Bidirectional Relationships](http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
-- [Jackson JSON Tutorial](http://www.baeldung.com/jackson)
-- [Jackson – Working with Maps and nulls](http://www.baeldung.com/jackson-map-null-values-or-null-key)
-- [Jackson – Decide What Fields Get Serialized/Deserialized](http://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
-- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson)
-- [XML Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-xml-serialization-and-deserialization)
-- [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations)
-- [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance)
-- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat)
-- [Using Optional with Jackson](http://www.baeldung.com/jackson-optional)
-- [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map)
-- [Jackson Streaming API](http://www.baeldung.com/jackson-streaming-api)
-- [Jackson – JsonMappingException (No serializer found for class)](http://www.baeldung.com/jackson-jsonmappingexception)
-- [How To Serialize Enums as JSON Objects with Jackson](http://www.baeldung.com/jackson-serialize-enums)
-- [Jackson – Marshall String to JsonNode](http://www.baeldung.com/jackson-json-to-jsonnode)
-- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array)
-- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria)
-- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values)
+- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)
+- [Jackson – Custom Serializer](https://www.baeldung.com/jackson-custom-serialization)
+- [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization)
+- [Jackson Exceptions – Problems and Solutions](https://www.baeldung.com/jackson-exception)
+- [Jackson Date](https://www.baeldung.com/jackson-serialize-dates)
+- [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion)
+- [Jackson JSON Tutorial](https://www.baeldung.com/jackson)
+- [Jackson – Working with Maps and nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key)
+- [Jackson – Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not)
+- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson)
+- [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization)
+- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations)
+- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance)
+- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat)
+- [Using Optional with Jackson](https://www.baeldung.com/jackson-optional)
+- [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map)
+- [Jackson Streaming API](https://www.baeldung.com/jackson-streaming-api)
+- [Jackson – JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception)
+- [How To Serialize Enums as JSON Objects with Jackson](https://www.baeldung.com/jackson-serialize-enums)
+- [Jackson – Marshall String to JsonNode](https://www.baeldung.com/jackson-json-to-jsonnode)
+- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array)
+- [Serialize Only Fields that meet a Custom Criteria with Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria)
+- [Mapping Nested Values with Jackson](https://www.baeldung.com/jackson-nested-values)
- [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json)
- [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects)
- [Mapping a Dynamic JSON Object with Jackson](https://www.baeldung.com/jackson-mapping-dynamic-object)
+- More articles: [[next -->]](/../jackson-2)
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/Product.java
similarity index 95%
rename from jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java
rename to jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/Product.java
index 13c21e37af..9c997886e5 100644
--- a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/Product.java
@@ -5,7 +5,7 @@ import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnySetter;
-public class ProductJsonAnySetter {
+public class Product {
private String name;
private String category;
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java
new file mode 100644
index 0000000000..2bbef534c3
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java
new file mode 100644
index 0000000000..2c96b6eb80
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/Distance.java
@@ -0,0 +1,31 @@
+package com.baeldung.jackson.deserialization.enums;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+}
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java
new file mode 100644
index 0000000000..36ef7e244a
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java
new file mode 100644
index 0000000000..bae0c0df34
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/CustomEnumDeserializer.java
@@ -0,0 +1,42 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import java.io.IOException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+public class CustomEnumDeserializer extends StdDeserializer {
+
+ private static final long serialVersionUID = -1166032307856492833L;
+
+ public CustomEnumDeserializer() {
+ this(null);
+ }
+
+ public CustomEnumDeserializer(Class> c) {
+ super(c);
+ }
+
+ @Override
+ public Distance deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+
+ JsonNode node = jsonParser.getCodec().readTree(jsonParser);
+
+ String unit = node.get("unit").asText();
+ double meters = node.get("meters").asDouble();
+
+ for (Distance distance : Distance.values()) {
+
+ if (distance.getUnit().equals(unit) &&
+ Double.compare(distance.getMeters(), meters) == 0) {
+
+ return distance;
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java
new file mode 100644
index 0000000000..9cb3a0c391
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/customdeserializer/Distance.java
@@ -0,0 +1,33 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+@JsonDeserialize(using = CustomEnumDeserializer.class)
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+}
\ No newline at end of file
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java
new file mode 100644
index 0000000000..6a478dd263
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java
new file mode 100644
index 0000000000..18235fb5c6
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsoncreator/Distance.java
@@ -0,0 +1,48 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+ @JsonCreator
+ public static Distance forValues(@JsonProperty("unit") String unit, @JsonProperty("meters") double meters) {
+
+ for (Distance distance : Distance.values()) {
+ if (distance.unit.equals(unit) && Double.compare(distance.meters, meters) == 0) {
+
+ return distance;
+ }
+ }
+
+ return null;
+
+ }
+}
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java
new file mode 100644
index 0000000000..7f763f97c4
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java
new file mode 100644
index 0000000000..e671a9ae5b
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonproperty/Distance.java
@@ -0,0 +1,51 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum Distance {
+
+ @JsonProperty("distance-in-km")
+ KILOMETER("km", 1000),
+
+ @JsonProperty("distance-in-miles")
+ MILE("miles", 1609.34),
+
+ @JsonProperty("distance-in-meters")
+ METER("meters", 1),
+
+ @JsonProperty("distance-in-inches")
+ INCH("inches", 0.0254),
+
+ @JsonProperty("distance-in-cm")
+ CENTIMETER("cm", 0.01),
+
+ @JsonProperty("distance-in-mm")
+ MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+}
+
+
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java
new file mode 100644
index 0000000000..014668ea8c
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/City.java
@@ -0,0 +1,15 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+public class City {
+
+ private Distance distance;
+
+ public Distance getDistance() {
+ return distance;
+ }
+
+ public void setDistance(Distance distance) {
+ this.distance = distance;
+ }
+
+}
diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java
new file mode 100644
index 0000000000..44bb5f20c3
--- /dev/null
+++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/enums/jsonvalue/Distance.java
@@ -0,0 +1,35 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum Distance {
+
+ KILOMETER("km", 1000), MILE("miles", 1609.34), METER("meters", 1), INCH("inches", 0.0254), CENTIMETER("cm", 0.01), MILLIMETER("mm", 0.001);
+
+ private String unit;
+ private double meters;
+
+ private Distance(String unit, double meters) {
+ this.unit = unit;
+ this.meters = meters;
+ }
+
+ public void setMeters(double meters) {
+ this.meters = meters;
+ }
+
+ @JsonValue
+ public double getMeters() {
+ return meters;
+ }
+
+ public String getUnit() {
+ return unit;
+ }
+
+ public void setUnit(String unit) {
+ this.unit = unit;
+ }
+
+}
+
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java
index d49677c1a2..c9536bc35a 100644
--- a/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java
@@ -59,7 +59,7 @@ public class DynamicObjectDeserializationUnitTest {
String json = readResource("/deserialize-dynamic-object/flat.json");
// when
- ProductJsonAnySetter product = objectMapper.readValue(json, ProductJsonAnySetter.class);
+ Product product = objectMapper.readValue(json, Product.class);
// then
assertThat(product.getName()).isEqualTo("Pear yPhone 72");
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java
new file mode 100644
index 0000000000..c7ce96e013
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/DefaultEnumDeserializationUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class DefaultEnumDeserializationUnitTest {
+
+ @Test
+ public void givenEnum_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\":\"KILOMETER\"}";
+ City city = new ObjectMapper().readValue(json, City.class);
+
+ assertEquals(Distance.KILOMETER, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java
new file mode 100644
index 0000000000..e8dbfa8df8
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/customdeserializer/EnumCustomDeserializationUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.jackson.deserialization.enums.customdeserializer;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumCustomDeserializationUnitTest {
+
+ @Test
+ public void givenEnumWithCustomDeserializer_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.MILE, city.getDistance());
+ }
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java
new file mode 100644
index 0000000000..d778cbe26b
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsoncreator/EnumDeserializationUsingJsonCreatorUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums.jsoncreator;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonCreatorUnitTest {
+
+ @Test
+ public void givenEnumWithJsonCreator_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": {\"unit\":\"miles\",\"meters\":1609.34}}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.MILE, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java
new file mode 100644
index 0000000000..134f4a29cc
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonproperty/EnumDeserializationUsingJsonPropertyUnitTest.java
@@ -0,0 +1,20 @@
+package com.baeldung.jackson.deserialization.enums.jsonproperty;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonPropertyUnitTest {
+
+ @Test
+ public void givenEnumWithJsonProperty_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": \"distance-in-km\"}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.KILOMETER, city.getDistance());
+
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java
new file mode 100644
index 0000000000..85afcb9a69
--- /dev/null
+++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/enums/jsonvalue/EnumDeserializationUsingJsonValueUnitTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.jackson.deserialization.enums.jsonvalue;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import java.io.IOException;
+import org.junit.Test;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class EnumDeserializationUsingJsonValueUnitTest {
+
+ @Test
+ public void givenEnumWithJsonValue_whenDeserializingJson_thenCorrectRepresentation() throws JsonParseException, IOException {
+ String json = "{\"distance\": \"0.0254\"}";
+
+ City city = new ObjectMapper().readValue(json, City.class);
+ assertEquals(Distance.INCH, city.getDistance());
+ }
+
+}
diff --git a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
index 45c0ba1382..d4fb2401ed 100644
--- a/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/enums/JacksonEnumSerializationUnitTest.java
@@ -2,11 +2,8 @@ package com.baeldung.jackson.enums;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertThat;
-
import java.io.IOException;
-
import org.junit.Test;
-
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -18,5 +15,5 @@ public class JacksonEnumSerializationUnitTest {
assertThat(dtoAsString, containsString("1609.34"));
}
-
+
}
diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
similarity index 99%
rename from jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java
rename to jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
index cd2c2925d6..dd0fe8dc56 100644
--- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java
+++ b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.jackson.test;
+package com.baeldung.jackson.exception.test;
import static org.hamcrest.Matchers.containsString;
import static org.junit.Assert.assertEquals;
diff --git a/java-dates/.gitignore b/java-blockchain/.gitignore
similarity index 100%
rename from java-dates/.gitignore
rename to java-blockchain/.gitignore
diff --git a/java-blockchain/README.md b/java-blockchain/README.md
new file mode 100644
index 0000000000..5afd0d356b
--- /dev/null
+++ b/java-blockchain/README.md
@@ -0,0 +1,7 @@
+## Java Blockchain
+
+This module contains articles about Blockchain in Java
+
+### Relevant Articles:
+
+- [Implementing a Simple Blockchain in Java](https://www.baeldung.com/java-blockchain)
diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml
new file mode 100644
index 0000000000..4c5d0f31d5
--- /dev/null
+++ b/java-blockchain/pom.xml
@@ -0,0 +1,44 @@
+
+ 4.0.0
+ com.baeldung.blockchain
+ java-blockchain
+ 0.1.0-SNAPSHOT
+ java-blockchain
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+ java-blockchain
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+
+
+
+
+
+
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java
new file mode 100644
index 0000000000..6b4e971cd7
--- /dev/null
+++ b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java
@@ -0,0 +1,64 @@
+package com.baeldung.blockchain;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class Block {
+
+ private static Logger logger = Logger.getLogger(Block.class.getName());
+
+ private String hash;
+ private String previousHash;
+ private String data;
+ private long timeStamp;
+ private int nonce;
+
+ public Block(String data, String previousHash, long timeStamp) {
+ this.data = data;
+ this.previousHash = previousHash;
+ this.timeStamp = timeStamp;
+ this.hash = calculateBlockHash();
+ }
+
+ public String mineBlock(int prefix) {
+ String prefixString = new String(new char[prefix]).replace('\0', '0');
+ while (!hash.substring(0, prefix)
+ .equals(prefixString)) {
+ nonce++;
+ hash = calculateBlockHash();
+ }
+ return hash;
+ }
+
+ public String calculateBlockHash() {
+ String dataToHash = previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data;
+ MessageDigest digest = null;
+ byte[] bytes = null;
+ try {
+ digest = MessageDigest.getInstance("SHA-256");
+ bytes = digest.digest(dataToHash.getBytes("UTF-8"));
+ } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
+ logger.log(Level.SEVERE, ex.getMessage());
+ }
+ StringBuffer buffer = new StringBuffer();
+ for (byte b : bytes) {
+ buffer.append(String.format("%02x", b));
+ }
+ return buffer.toString();
+ }
+
+ public String getHash() {
+ return this.hash;
+ }
+
+ public String getPreviousHash() {
+ return this.previousHash;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+}
diff --git a/spring-cloud-data-flow/data-flow-server/src/main/resources/logback.xml b/java-blockchain/src/main/resources/logback.xml
similarity index 100%
rename from spring-cloud-data-flow/data-flow-server/src/main/resources/logback.xml
rename to java-blockchain/src/main/resources/logback.xml
diff --git a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java
new file mode 100644
index 0000000000..883e55c351
--- /dev/null
+++ b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java
@@ -0,0 +1,68 @@
+package com.baeldung.blockchain;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class BlockchainUnitTest {
+
+ public static List blockchain = new ArrayList();
+ public static int prefix = 4;
+ public static String prefixString = new String(new char[prefix]).replace('\0', '0');
+
+ @BeforeClass
+ public static void setUp() {
+ Block genesisBlock = new Block("The is the Genesis Block.", "0", new Date().getTime());
+ genesisBlock.mineBlock(prefix);
+ blockchain.add(genesisBlock);
+ Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash(), new Date().getTime());
+ firstBlock.mineBlock(prefix);
+ blockchain.add(firstBlock);
+ }
+
+ @Test
+ public void givenBlockchain_whenNewBlockAdded_thenSuccess() {
+ Block newBlock = new Block("The is a New Block.", blockchain.get(blockchain.size() - 1)
+ .getHash(), new Date().getTime());
+ newBlock.mineBlock(prefix);
+ assertTrue(newBlock.getHash()
+ .substring(0, prefix)
+ .equals(prefixString));
+ blockchain.add(newBlock);
+ }
+
+ @Test
+ public void givenBlockchain_whenValidated_thenSuccess() {
+ boolean flag = true;
+ for (int i = 0; i < blockchain.size(); i++) {
+ String previousHash = i == 0 ? "0"
+ : blockchain.get(i - 1)
+ .getHash();
+ flag = blockchain.get(i)
+ .getHash()
+ .equals(blockchain.get(i)
+ .calculateBlockHash())
+ && previousHash.equals(blockchain.get(i)
+ .getPreviousHash())
+ && blockchain.get(i)
+ .getHash()
+ .substring(0, prefix)
+ .equals(prefixString);
+ if (!flag)
+ break;
+ }
+ assertTrue(flag);
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ blockchain.clear();
+ }
+
+}
diff --git a/jackson-simple/src/test/resources/.gitignore b/java-blockchain/src/test/resources/.gitignore
similarity index 100%
rename from jackson-simple/src/test/resources/.gitignore
rename to java-blockchain/src/test/resources/.gitignore
diff --git a/java-collections-conversions-2/README.md b/java-collections-conversions-2/README.md
new file mode 100644
index 0000000000..761e56253e
--- /dev/null
+++ b/java-collections-conversions-2/README.md
@@ -0,0 +1,7 @@
+## Java Collections Cookbooks and Examples
+
+This module contains articles about conversions among Collection types and arrays in Java.
+
+### Relevant Articles:
+- [Array to String Conversions](https://www.baeldung.com/java-array-to-string)
+- More articles: [[<-- prev]](../java-collections-conversions)
\ No newline at end of file
diff --git a/java-collections-conversions-2/pom.xml b/java-collections-conversions-2/pom.xml
new file mode 100644
index 0000000000..72673527ac
--- /dev/null
+++ b/java-collections-conversions-2/pom.xml
@@ -0,0 +1,36 @@
+
+ 4.0.0
+ java-collections-conversions-2
+ 0.1.0-SNAPSHOT
+ java-collections-conversions-2
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+ java-collections-conversions-2
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+
diff --git a/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
similarity index 98%
rename from java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java
rename to java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
index b563475997..73cf9d6baa 100644
--- a/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java
+++ b/java-collections-conversions-2/src/test/java/com/baeldung/convertarraytostring/ArrayToStringUnitTest.java
@@ -1,15 +1,14 @@
-package org.baeldung.convertarraytostring;
+package com.baeldung.convertarraytostring;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md
index 614f20f186..2d3aa41f2d 100644
--- a/java-collections-conversions/README.md
+++ b/java-collections-conversions/README.md
@@ -1,16 +1,16 @@
-=========
-
## Java Collections Cookbooks and Examples
+This module contains articles about conversions among Collection types and arrays in Java.
+
### Relevant Articles:
-- [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array)
-- [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array)
-- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list)
-- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set)
-- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string)
-- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map)
-- [Array to String Conversions](https://www.baeldung.com/java-array-to-string)
+- [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array)
+- [Converting between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array)
+- [Converting between a List and a Set in Java](https://www.baeldung.com/convert-list-to-set-and-set-to-list)
+- [Convert a Map to an Array, List or Set in Java](https://www.baeldung.com/convert-map-values-to-array-list-set)
+- [Converting a List to String in Java](https://www.baeldung.com/java-list-to-string)
+- [How to Convert List to Map in Java](https://www.baeldung.com/java-list-to-map)
- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist)
- [Java 8 Collectors toMap](https://www.baeldung.com/java-collectors-tomap)
- [Converting Iterable to Collection in Java](https://www.baeldung.com/java-iterable-to-collection)
- [Converting Iterator to List](https://www.baeldung.com/java-convert-iterator-to-list)
+- More articles: [[next -->]](../java-collections-conversions-2)
\ No newline at end of file
diff --git a/java-collections-conversions/pom.xml b/java-collections-conversions/pom.xml
index 24d918d105..b5ab4f841a 100644
--- a/java-collections-conversions/pom.xml
+++ b/java-collections-conversions/pom.xml
@@ -32,6 +32,16 @@
+
+ java-collections-conversions-2
+
+
+ src/main/resources
+ true
+
+
+
+
4.1
3.6.1
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
similarity index 97%
rename from java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
index 1de600aebf..ad2ab2a756 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/FooUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertcollectiontoarraylist/CollectionToArrayListUnitTest.java
@@ -14,10 +14,10 @@ import static org.junit.Assert.*;
*
* @author chris
*/
-public class FooUnitTest {
+public class CollectionToArrayListUnitTest {
private static Collection srcCollection = new HashSet<>();
- public FooUnitTest() {
+ public CollectionToArrayListUnitTest() {
}
@BeforeClass
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convert/iteratortolist/ConvertIteratorToListServiceUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
similarity index 98%
rename from java-collections-conversions/src/test/java/com/baeldung/convert/iteratortolist/ConvertIteratorToListServiceUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
index ced2ddcfc0..4d6cba7d27 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convert/iteratortolist/ConvertIteratorToListServiceUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertiteratortolist/ConvertIteratorToListServiceUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert.iteratortolist;
+package com.baeldung.convertiteratortolist;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
diff --git a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
similarity index 96%
rename from java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
index 6e766433d1..5e6828a3d5 100644
--- a/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDiplicatedIdToMapServiceUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/convertlisttomap/ConvertListWithDuplicatedIdToMapServiceUnitTest.java
@@ -11,7 +11,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
-public class ConvertListWithDiplicatedIdToMapServiceUnitTest {
+public class ConvertListWithDuplicatedIdToMapServiceUnitTest {
List duplicatedIdList;
private ConvertListToMapService convertListService = new ConvertListToMapService();
diff --git a/java-collections-conversions/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java b/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
similarity index 99%
rename from java-collections-conversions/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java
rename to java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
index a5f684a141..4977c122e7 100644
--- a/java-collections-conversions/src/test/java/org/baeldung/java/collections/JavaCollectionConversionUnitTest.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/java/collections/JavaCollectionConversionUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.collections;
+package com.baeldung.java.collections;
import java.util.ArrayList;
import java.util.Arrays;
diff --git a/java-collections-conversions/src/test/java/org/baeldung/java/lists/ListToSTring.java b/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
similarity index 91%
rename from java-collections-conversions/src/test/java/org/baeldung/java/lists/ListToSTring.java
rename to java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
index 3fc26bcb51..0fdc096d14 100644
--- a/java-collections-conversions/src/test/java/org/baeldung/java/lists/ListToSTring.java
+++ b/java-collections-conversions/src/test/java/com/baeldung/java/lists/ListToStringUnitTest.java
@@ -1,4 +1,4 @@
-package org.baeldung.java.lists;
+package com.baeldung.java.lists;
import java.util.Arrays;
import java.util.List;
@@ -7,7 +7,7 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-public class ListToSTring {
+public class ListToStringUnitTest {
@Test
public void whenListToString_thenPrintDefault() {
diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md
index ff84e93ce4..0db83fbae7 100644
--- a/java-collections-maps-2/README.md
+++ b/java-collections-maps-2/README.md
@@ -1,3 +1,17 @@
-## Relevant Articles:
+## Java Collections Cookbooks and Examples
+
+This module contains articles about Map data structures in Java.
+
+### Relevant Articles:
- [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives)
- [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap)
+- [Guide to Java HashMap]()
+- [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap)
+- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion)
+- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map)
+- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps)
+- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
+- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
+- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap)
+- More articles: [[<-- prev>]](/../java-collections-maps)
diff --git a/java-collections-maps-2/pom.xml b/java-collections-maps-2/pom.xml
index e242a8655e..a246559f61 100644
--- a/java-collections-maps-2/pom.xml
+++ b/java-collections-maps-2/pom.xml
@@ -41,6 +41,22 @@
commons-lang3
${commons-lang3.version}
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
org.assertj
assertj-core
@@ -50,6 +66,9 @@
+ 0.6.5
+ 4.1
+ 1.7.0
8.2.0
3.0.2
8.1.0
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
new file mode 100644
index 0000000000..5559895730
--- /dev/null
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java
@@ -0,0 +1,133 @@
+package com.baeldung.map;
+
+import java.util.*;
+
+public class Product {
+
+ private String name;
+ private String description;
+ private List tags;
+
+ public Product(String name, String description) {
+ this.name = name;
+ this.description = description;
+ this.tags = new ArrayList<>();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public List getTags() {
+ return tags;
+ }
+
+ public Product addTagsOfOtherProdcut(Product product) {
+ this.tags.addAll(product.getTags());
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ Product product = (Product) o;
+ return Objects.equals(name, product.name) &&
+ Objects.equals(description, product.description);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name, description);
+ }
+
+ public static void forEach() {
+
+ HashMap productsByName = new HashMap<>();
+ productsByName.forEach( (key, product)
+ -> System.out.println("Key: " + key + " Product:" + product.getDescription())
+ //do something with the key and value
+ );
+
+ //Prior to Java 8:
+ for(Map.Entry entry : productsByName.entrySet()) {
+ Product product = entry.getValue();
+ String key = entry.getKey();
+ //do something with the key and value
+ }
+ }
+
+ public static void getOrDefault() {
+
+ HashMap productsByName = new HashMap<>();
+ Product chocolate = new Product("chocolate", "something sweet");
+ Product defaultProduct = productsByName.getOrDefault("horse carriage", chocolate);
+ Product bike = productsByName.getOrDefault("E-Bike", chocolate);
+
+ //Prior to Java 8:
+ Product bike2 = productsByName.containsKey("E-Bike")
+ ? productsByName.get("E-Bike")
+ : chocolate;
+ Product defaultProduct2 = productsByName.containsKey("horse carriage")
+ ? productsByName.get("horse carriage")
+ : chocolate;
+ }
+
+ public static void putIfAbsent() {
+
+ HashMap productsByName = new HashMap<>();
+ Product chocolate = new Product("chocolate", "something sweet");
+ productsByName.putIfAbsent("E-Bike", chocolate);
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.put("E-Bike", chocolate);
+ }
+ }
+
+ public static void merge() {
+
+ HashMap productsByName = new HashMap<>();
+ Product eBike2 = new Product("E-Bike", "A bike with a battery");
+ eBike2.getTags().add("sport");
+ productsByName.merge("E-Bike", eBike2, Product::addTagsOfOtherProdcut);
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2);
+ } else {
+ productsByName.put("E-Bike", eBike2);
+ }
+ }
+
+ public static void compute() {
+
+ HashMap productsByName = new HashMap<>();
+ Product eBike2 = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.compute("E-Bike", (k,v) -> {
+ if(v != null) {
+ return v.addTagsOfOtherProdcut(eBike2);
+ } else {
+ return eBike2;
+ }
+ });
+
+ //Prior to Java 8:
+ if(productsByName.containsKey("E-Bike")) {
+ productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2);
+ } else {
+ productsByName.put("E-Bike", eBike2);
+ }
+ }
+}
diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
similarity index 96%
rename from java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
index aca0d05ef1..d13be924ff 100644
--- a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import com.google.common.base.Joiner;
import org.apache.commons.lang3.StringUtils;
diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
index caabca4a09..416ba4dd9a 100644
--- a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import com.google.common.base.Splitter;
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
similarity index 98%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
index 2ebc9413c8..cb18f3aa11 100644
--- a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java
@@ -1,4 +1,6 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
+
+import org.apache.commons.lang3.SerializationUtils;
import java.util.HashMap;
import java.util.Map;
@@ -6,8 +8,6 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
-import org.apache.commons.lang3.SerializationUtils;
-
public class CopyHashMap {
public static HashMap copyUsingConstructor(HashMap originalMap) {
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
similarity index 98%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
index 4dbaceac62..4d63abcfd0 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map.initialize;
+package com.baeldung.map.initialize;
import java.util.AbstractMap;
import java.util.Collections;
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java b/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
similarity index 100%
rename from java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
index 93a98ba6fd..8c33c857ee 100644
--- a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java
@@ -1,11 +1,7 @@
-package com.baeldung.map.util;
+package com.baeldung.map.mapmax;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
import java.util.Map.Entry;
-import java.util.Optional;
public class MapMax {
diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
index b5e56f6141..d7fb0d1a1d 100644
--- a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.sort;
+package com.baeldung.map.mergemaps;
public class Employee implements Comparable {
diff --git a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
index 052cfb8bad..4f187bad90 100644
--- a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java
@@ -1,7 +1,7 @@
-package com.baeldung.map.java_8;
+package com.baeldung.map.mergemaps;
-import com.baeldung.sort.Employee;
import one.util.streamex.EntryStream;
+
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
similarity index 98%
rename from java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
index d835950c68..30bec12ccc 100644
--- a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java
@@ -1,4 +1,4 @@
-package com.baeldung.map;
+package com.baeldung.map.primitives;
import cern.colt.map.AbstractIntDoubleMap;
import cern.colt.map.OpenIntDoubleHashMap;
diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
rename to java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
index b8a2b32060..14610ffb00 100644
--- a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java
+++ b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java
@@ -1,8 +1,8 @@
-package com.baeldung.sort;
+package com.baeldung.map.sort;
+import com.baeldung.map.mergemaps.Employee;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableSortedMap;
-import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import java.util.*;
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
new file mode 100644
index 0000000000..2015909870
--- /dev/null
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java
@@ -0,0 +1,124 @@
+package com.baeldung.map;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ProductUnitTest {
+
+
+ @Test
+ public void getExistingValue() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ Product nextPurchase = productsByName.get("E-Bike");
+
+ assertEquals("A bike with a battery", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void getNonExistingValue() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ Product nextPurchase = productsByName.get("Car");
+
+ assertNull(nextPurchase);
+ }
+
+ @Test
+ public void getExistingValueAfterSameKeyInsertedTwice() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+ Product newEBike = new Product("E-Bike", "A bike with a better battery");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+ productsByName.put(newEBike.getName(), newEBike);
+
+ Product nextPurchase = productsByName.get("E-Bike");
+
+ assertEquals("A bike with a better battery", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void getExistingValueWithNullKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product defaultProduct = new Product("Chocolate", "At least buy chocolate");
+
+ productsByName.put(null, defaultProduct);
+ productsByName.put(defaultProduct.getName(), defaultProduct);
+
+ Product nextPurchase = productsByName.get(null);
+ assertEquals("At least buy chocolate", nextPurchase.getDescription());
+
+ nextPurchase = productsByName.get("Chocolate");
+ assertEquals("At least buy chocolate", nextPurchase.getDescription());
+ }
+
+ @Test
+ public void insertSameObjectWithDifferentKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product defaultProduct = new Product("Chocolate", "At least buy chocolate");
+
+ productsByName.put(null, defaultProduct);
+ productsByName.put(defaultProduct.getName(), defaultProduct);
+
+ assertSame(productsByName.get(null), productsByName.get("Chocolate"));
+ }
+
+ @Test
+ public void checkIfKeyExists() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.put(eBike.getName(), eBike);
+
+ assertTrue(productsByName.containsKey("E-Bike"));
+ }
+
+ @Test
+ public void checkIfValueExists() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+
+ productsByName.put(eBike.getName(), eBike);
+
+ assertTrue(productsByName.containsValue(eBike));
+ }
+
+ @Test
+ public void removeExistingKey() {
+ HashMap productsByName = new HashMap<>();
+
+ Product eBike = new Product("E-Bike", "A bike with a battery");
+ Product roadBike = new Product("Road bike", "A bike for competition");
+
+ productsByName.put(eBike.getName(), eBike);
+ productsByName.put(roadBike.getName(), roadBike);
+
+ productsByName.remove("E-Bike");
+
+ assertNull(productsByName.get("E-Bike"));
+ }
+
+}
diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
index d9923e74a0..4517dea328 100644
--- a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import org.apache.commons.collections4.MapUtils;
import org.junit.Assert;
diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
similarity index 95%
rename from java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
index 8fb906efd0..2f80b30871 100644
--- a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.convert;
+package com.baeldung.map.convert;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
similarity index 98%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
index c400eea153..e2d5e327e1 100644
--- a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java
@@ -1,13 +1,12 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
-import static org.assertj.core.api.Assertions.assertThat;
+import com.google.common.collect.ImmutableMap;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Test;
-
-import com.google.common.collect.ImmutableMap;
+import static org.assertj.core.api.Assertions.assertThat;
public class CopyHashMapUnitTest {
diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
similarity index 91%
rename from java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
index 7963fa811c..5db55c26ea 100644
--- a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java
@@ -1,4 +1,4 @@
-package com.baeldung.map;
+package com.baeldung.map.copyhashmap;
import java.io.Serializable;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
similarity index 94%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
index 80a8983d6f..7c6dffe787 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java
@@ -1,10 +1,10 @@
-package com.baeldung.java.map.initialize;
+package com.baeldung.map.initialize;
-import static org.junit.Assert.assertEquals;
+import org.junit.Test;
import java.util.Map;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class MapInitializerUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
index 883265cc8b..30b945bfc8 100644
--- a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java
@@ -1,14 +1,13 @@
-package com.baeldung.map.util;
+package com.baeldung.map.mapmax;
-
-import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.Assert.assertEquals;
public class MapMaxUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
similarity index 91%
rename from java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
index f2dfc992c2..1057e3b9f0 100644
--- a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java
@@ -1,16 +1,14 @@
-package com.baeldung.collection;
-
-import java.util.ConcurrentModificationException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
+package com.baeldung.map.treemaphashmap;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
-public class WhenComparingTreeMapVsHashMap {
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class TreeMapVsHashMapUnitTest {
@Test
public void whenInsertObjectsTreeMap_thenNaturalOrder() {
diff --git a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
similarity index 98%
rename from java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
rename to java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
index d7bcb31867..293f24c378 100644
--- a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java
+++ b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.weakhashmap;
+package com.baeldung.map.weakhashmap;
import org.junit.Test;
diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md
index 2eeb2c8843..87fefe1b9d 100644
--- a/java-collections-maps/README.md
+++ b/java-collections-maps/README.md
@@ -1,23 +1,16 @@
-=========
-
## Java Collections Cookbooks and Examples
+This module contains articles about Map data structures in Java.
+
### Relevant Articles:
-- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap)
-- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap)
-- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap)
-- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap)
-- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap)
-- [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map)
-- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap)
-- [How to Store Duplicate Keys in a Map in Java?](http://www.baeldung.com/java-map-duplicate-keys)
-- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap)
+- [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap)
+- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap)
+- [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap)
+- [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap)
+- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys)
- [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value)
-- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort)
-- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max)
-- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps)
- [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists)
- [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps)
- [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps)
-- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion)
- [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map)
+- More articles: [[next -->]](/../java-collections-maps-2)
diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml
index 83cc97a21e..b755582580 100644
--- a/java-collections-maps/pom.xml
+++ b/java-collections-maps/pom.xml
@@ -36,11 +36,6 @@
${assertj.version}
test
-
- one.util
- streamex
- ${streamex.version}
-
@@ -49,6 +44,5 @@
1.7.0
3.6.1
7.1.0
- 0.6.5
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
similarity index 96%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
index 688c7592f3..91b7197a92 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java
@@ -1,12 +1,12 @@
/**
*
*/
-package com.baeldung.java.map;
+package com.baeldung.map;
import java.util.HashSet;
import java.util.Map;
-import java.util.Set;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.stream.Stream;
/**
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
similarity index 97%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
index ae3c3edc39..9993d7862c 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
similarity index 94%
rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
rename to java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
index 1e237580ec..b687e57d85 100644
--- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java
+++ b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import java.util.LinkedHashMap;
import java.util.Map;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
similarity index 92%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
index b239ae07d8..d308aac7eb 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java
@@ -1,16 +1,13 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import com.google.common.collect.ImmutableMap;
+import org.junit.jupiter.api.Test;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import org.junit.jupiter.api.Test;
-
-import com.google.common.collect.ImmutableMap;
+import static org.junit.jupiter.api.Assertions.*;
public class ImmutableMapUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
similarity index 78%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
index 2c97a97690..dbad2e5b5e 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java
@@ -1,13 +1,11 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import org.junit.Test;
import java.util.Collections;
import java.util.Map;
-import org.junit.Test;
+import static org.junit.Assert.*;
public class KeyCheckUnitTest {
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
similarity index 96%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
index 3a0affa6f3..721b48ea7b 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java
@@ -1,13 +1,9 @@
-package com.baeldung.java.map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+package com.baeldung.map;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.TreeMultimap;
import org.apache.commons.collections4.MultiMap;
import org.apache.commons.collections4.MultiMapUtils;
import org.apache.commons.collections4.MultiValuedMap;
@@ -18,10 +14,9 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.LinkedHashMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.TreeMultimap;
+import java.util.*;
+
+import static org.assertj.core.api.Assertions.assertThat;
public class MapMultipleValuesUnitTest {
private static final Logger LOG = LoggerFactory.getLogger(MapMultipleValuesUnitTest.class);
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
index 7582eb87fb..eaf68ccba5 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.map;
+package com.baeldung.map;
import org.junit.Test;
import org.slf4j.Logger;
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
index e31385e972..f8e4c8fd8a 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java
@@ -1,9 +1,12 @@
/**
*
*/
-package com.baeldung.java.map;
+package com.baeldung.map;
-import static org.junit.Assert.assertEquals;
+import com.google.common.collect.HashBiMap;
+import org.apache.commons.collections4.BidiMap;
+import org.apache.commons.collections4.bidimap.DualHashBidiMap;
+import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
@@ -11,11 +14,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.stream.Collectors;
-import org.apache.commons.collections4.BidiMap;
-import org.apache.commons.collections4.bidimap.DualHashBidiMap;
-import org.junit.Test;
-
-import com.google.common.collect.HashBiMap;
+import static org.junit.Assert.assertEquals;
/**
* @author swpraman
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
similarity index 99%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
index b3aaf8925f..686c1cef87 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java
@@ -1,15 +1,4 @@
-package com.baeldung.java.map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
+package com.baeldung.map;
import org.apache.commons.collections4.MultiMapUtils;
import org.apache.commons.collections4.MultiSet;
@@ -18,6 +7,17 @@ import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
import org.junit.Test;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
public class MultiValuedMapUnitTest {
@Test
diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
similarity index 97%
rename from java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java
rename to java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
index e8aa12d4bd..0edd0cd87b 100644
--- a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java
+++ b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java
@@ -1,24 +1,21 @@
-package com.baeldung.java.map.compare;
+package com.baeldung.map.compare;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsMapContaining.hasEntry;
-import static org.hamcrest.collection.IsMapContaining.hasKey;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import com.google.common.base.Equivalence;
+import com.google.common.collect.MapDifference;
+import com.google.common.collect.MapDifference.ValueDifference;
+import com.google.common.collect.Maps;
+import org.junit.Before;
+import org.junit.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.common.base.Equivalence;
-import com.google.common.collect.MapDifference;
-import com.google.common.collect.MapDifference.ValueDifference;
-import com.google.common.collect.Maps;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsMapContaining.hasEntry;
+import static org.hamcrest.collection.IsMapContaining.hasKey;
+import static org.junit.Assert.*;
public class HashMapComparisonUnitTest {
diff --git a/java-dates-2/.gitignore b/java-dates-2/.gitignore
deleted file mode 100644
index 6471aabbcf..0000000000
--- a/java-dates-2/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-*.class
-
-0.*
-
-#folders#
-/target
-/neoDb*
-/data
-/src/main/webapp/WEB-INF/classes
-*/META-INF/*
-.resourceCache
-
-# Packaged files #
-*.jar
-*.war
-*.ear
-
-# Files generated by integration tests
-*.txt
-backup-pom.xml
-/bin/
-/temp
-
-#IntelliJ specific
-.idea/
-*.iml
-
-#jenv
-.java-version
\ No newline at end of file
diff --git a/java-dates-2/README.md b/java-dates-2/README.md
deleted file mode 100644
index 35286115d4..0000000000
--- a/java-dates-2/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-## Relevant Articles:
-- [Converting Between LocalDate and XMLGregorianCalendar](https://www.baeldung.com/java-localdate-to-xmlgregoriancalendar)
-- [Convert Time to Milliseconds in Java](https://www.baeldung.com/java-time-milliseconds)
diff --git a/java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java b/java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java
new file mode 100644
index 0000000000..34914962f9
--- /dev/null
+++ b/java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java
@@ -0,0 +1,19 @@
+package com.baeldung.date.conversion;
+
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.util.Date;
+
+public class ConvertToOffsetDateTime {
+
+ public static OffsetDateTime convert(Date date) {
+ return date.toInstant()
+ .atOffset(ZoneOffset.UTC);
+ }
+
+ public static OffsetDateTime convert(Date date, int hour, int minute) {
+ return date.toInstant()
+ .atOffset(ZoneOffset.ofHoursMinutes(hour, minute));
+ }
+
+}
diff --git a/java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java
new file mode 100644
index 0000000000..c927da00c8
--- /dev/null
+++ b/java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.date.conversion;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.time.OffsetDateTime;
+import java.util.Date;
+
+import org.junit.Test;
+
+public class ConvertToOffsetDateTimeUnitTest {
+
+ @Test
+ public void whenDateIsNotNull_thenConvertToOffsetDateTime() {
+ Date date = new Date();
+ assertTrue(ConvertToOffsetDateTime.convert(date) instanceof OffsetDateTime);
+ }
+
+ @Test
+ public void givenDate_whenHasOffset_thenConvertWithOffset() {
+ Date date = new Date();
+ date.setHours(6);
+ date.setMinutes(30);
+ OffsetDateTime odt = ConvertToOffsetDateTime.convert(date, 3, 30);
+ assertEquals(10, odt.getHour());
+ assertEquals(0, odt.getMinute());
+ }
+
+}
diff --git a/java-dates/README.md b/java-dates/README.md
deleted file mode 100644
index 8171e5def9..0000000000
--- a/java-dates/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-=========
-
-## Java Dates Cookbooks and Examples
-
-### Relevant Articles:
-- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster)
-- [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings)
-- [Period and Duration in Java](http://www.baeldung.com/java-period-duration)
-- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference)
-- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions)
-- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api)
-- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro)
-- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8)
-- [Get Date Without Time in Java](http://www.baeldung.com/java-date-without-time)
-- [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates)
-- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime)
-- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones)
-- [Extracting Year, Month and Day from Date in Java](http://www.baeldung.com/java-year-month-day)
-- [Guide to java.util.GregorianCalendar](http://www.baeldung.com/java-gregorian-calendar)
-- [Measure Elapsed Time in Java](http://www.baeldung.com/java-measure-elapsed-time)
-- [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end)
-- [Calculate Age in Java](http://www.baeldung.com/java-get-age)
-- [Increment Date in Java](http://www.baeldung.com/java-increment-date)
-- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date)
-- [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter)
-- [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string)
-- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp)
-- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp)
-- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format)
-- [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/java-dates/src/main/java/com/baeldung/datetime/README.md b/java-dates/src/main/java/com/baeldung/datetime/README.md
deleted file mode 100644
index 7d843af9ea..0000000000
--- a/java-dates/src/main/java/com/baeldung/datetime/README.md
+++ /dev/null
@@ -1 +0,0 @@
-### Relevant Articles:
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java b/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java
new file mode 100644
index 0000000000..13a2ba6a1a
--- /dev/null
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseDateTimeFormatter.java
@@ -0,0 +1,21 @@
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+public class UseDateTimeFormatter {
+ public String formatAsIsoDate(LocalDateTime localDateTime) {
+ return localDateTime.format(DateTimeFormatter.ISO_DATE);
+ }
+
+ public String formatCustom(LocalDateTime localDateTime, String pattern) {
+ return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
+ }
+
+ public String formatWithStyleAndLocale(LocalDateTime localDateTime, FormatStyle formatStyle, Locale locale) {
+ return localDateTime.format(DateTimeFormatter.ofLocalizedDateTime(formatStyle)
+ .withLocale(locale));
+ }
+}
diff --git a/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java b/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java
new file mode 100644
index 0000000000..ed8499d6e0
--- /dev/null
+++ b/java-dates/src/main/java/com/baeldung/datetime/UseOffsetDateTime.java
@@ -0,0 +1,11 @@
+package com.baeldung.datetime;
+
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+public class UseOffsetDateTime {
+ public OffsetDateTime offsetOfLocalDateTimeAndOffset(LocalDateTime localDateTime, ZoneOffset offset) {
+ return OffsetDateTime.of(localDateTime, offset);
+ }
+}
diff --git a/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java b/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
deleted file mode 100644
index db6b353ba6..0000000000
--- a/java-dates/src/test/java/com/baeldung/dateapi/JavaDurationUnitTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.dateapi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-
-import org.junit.Test;
-
-public class JavaDurationUnitTest {
-
- @Test
- public void test2() {
- Instant start = Instant.parse("2017-10-03T10:15:30.00Z");
- Instant end = Instant.parse("2017-10-03T10:16:30.00Z");
-
- Duration duration = Duration.between(start, end);
-
- assertFalse(duration.isNegative());
-
- assertEquals(60, duration.getSeconds());
- assertEquals(1, duration.toMinutes());
-
- Duration fromDays = Duration.ofDays(1);
- assertEquals(86400, fromDays.getSeconds());
-
- Duration fromMinutes = Duration.ofMinutes(60);
- assertEquals(1, fromMinutes.toHours());
-
- assertEquals(120, duration.plusSeconds(60).getSeconds());
- assertEquals(30, duration.minusSeconds(30).getSeconds());
-
- assertEquals(120, duration.plus(60, ChronoUnit.SECONDS).getSeconds());
- assertEquals(30, duration.minus(30, ChronoUnit.SECONDS).getSeconds());
-
- Duration fromChar1 = Duration.parse("P1DT1H10M10.5S");
- Duration fromChar2 = Duration.parse("PT10M");
- }
-
-}
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java
new file mode 100644
index 0000000000..797e0b954a
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseDateTimeFormatterUnitTest.java
@@ -0,0 +1,36 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class UseDateTimeFormatterUnitTest {
+ private final UseDateTimeFormatter subject = new UseDateTimeFormatter();
+ private final LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
+
+ @Test
+ public void givenALocalDate_whenFormattingAsIso_thenPass() {
+ String result = subject.formatAsIsoDate(localDateTime);
+
+ assertThat(result).isEqualTo("2015-01-25");
+ }
+
+ @Test
+ public void givenALocalDate_whenFormattingWithPattern_thenPass() {
+ String result = subject.formatCustom(localDateTime, "yyyy/MM/dd");
+
+ assertThat(result).isEqualTo("2015/01/25");
+ }
+
+ @Test
+ public void givenALocalDate_whenFormattingWithStyleAndLocale_thenPass() {
+ String result = subject.formatWithStyleAndLocale(localDateTime, FormatStyle.MEDIUM, Locale.UK);
+
+ assertThat(result).isEqualTo("25 Jan 2015, 06:30:00");
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java
new file mode 100644
index 0000000000..5b58dd3848
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseOffsetDateTimeUnitTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+import org.junit.Test;
+
+public class UseOffsetDateTimeUnitTest {
+ private final UseOffsetDateTime subject = new UseOffsetDateTime();
+
+ @Test
+ public void givenAZoneOffSetAndLocalDateTime_whenCombing_thenValidResult() {
+ ZoneOffset offset = ZoneOffset.of("+02:00");
+ LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 6, 30);
+
+ OffsetDateTime result = subject.offsetOfLocalDateTimeAndOffset(localDateTime, offset);
+
+ assertThat(result.toString()).isEqualTo("2015-02-20T06:30+02:00");
+ }
+}
\ No newline at end of file
diff --git a/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java b/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java
new file mode 100644
index 0000000000..78d9a647fe
--- /dev/null
+++ b/java-dates/src/test/java/com/baeldung/datetime/UseToInstantUnitTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.datetime;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.time.LocalDateTime;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.junit.Test;
+
+public class UseToInstantUnitTest {
+
+ private UseToInstant subject = new UseToInstant();
+
+ @Test
+ public void givenAGregorianCalenderDate_whenConvertingToLocalDate_thenAsExpected() {
+ GregorianCalendar givenCalender = new GregorianCalendar(2018, Calendar.JULY, 28);
+
+ LocalDateTime localDateTime = subject.convertDateToLocalDate(givenCalender);
+
+ assertThat(localDateTime).isEqualTo("2018-07-28T00:00:00");
+ }
+
+ @Test
+ public void givenADate_whenConvertingToLocalDate_thenAsExpected() {
+ Date givenDate = new Date(1465817690000L);
+
+ LocalDateTime localDateTime = subject.convertDateToLocalDate(givenDate);
+
+ assertThat(localDateTime).isEqualTo("2016-06-13T13:34:50");
+ }
+}
\ No newline at end of file
diff --git a/java-ee-8-security-api/README.md b/java-ee-8-security-api/README.md
index 1735419236..b01a073e35 100644
--- a/java-ee-8-security-api/README.md
+++ b/java-ee-8-security-api/README.md
@@ -1,3 +1,7 @@
+## Java EE 8 Security API
+
+This module contains articles about the Security API in Java EE 8.
+
### Relevant articles
- - [Java EE 8 Security API](http://www.baeldung.com/java-ee-8-security)
+ - [Java EE 8 Security API](https://www.baeldung.com/java-ee-8-security)
diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml
index 4d4e2ba3b3..f43f3d7c5f 100644
--- a/java-ee-8-security-api/pom.xml
+++ b/java-ee-8-security-api/pom.xml
@@ -14,6 +14,13 @@
1.0.0-SNAPSHOT
+
+ app-auth-basic-store-db
+ app-auth-form-store-ldap
+ app-auth-custom-form-store-custom
+ app-auth-custom-no-store
+
+
@@ -58,17 +65,9 @@
-
- app-auth-basic-store-db
- app-auth-form-store-ldap
- app-auth-custom-form-store-custom
- app-auth-custom-no-store
-
-
9080
9443
-
8.0
2.3
18.0.0.1
diff --git a/java-jdi/README.md b/java-jdi/README.md
new file mode 100644
index 0000000000..c8c2d3e9ab
--- /dev/null
+++ b/java-jdi/README.md
@@ -0,0 +1,7 @@
+## Java JDI
+
+This module contains articles about JDI, the Java Debug Interface.
+
+###Relevant articles
+
+- [An Intro to the Java Debug Interface (JDI)](https://www.baeldung.com/java-debug-interface)
diff --git a/java-jdi/pom.xml b/java-jdi/pom.xml
new file mode 100644
index 0000000000..3d70461dce
--- /dev/null
+++ b/java-jdi/pom.xml
@@ -0,0 +1,130 @@
+
+ 4.0.0
+ java-jdi
+ 0.1.0-SNAPSHOT
+ java-jdi
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.slf4j
+ slf4j-api
+ ${org.slf4j.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ com.sun
+ tools
+ ${tools.version}
+ system
+ ${java.home}/../lib/tools.jar
+
+
+
+
+ java-jdi
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ ${maven-javadoc-plugin.version}
+
+ 1.8
+ 1.8
+
+
+
+
+
+
+
+ integration
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ integration-test
+
+ test
+
+
+
+ **/*IntegrationTest.java
+
+
+
+
+
+
+ json
+
+
+
+
+
+
+
+
+
+ 3.5
+
+ 3.6.1
+ 1.8
+ 1.7.21
+ 1.1.7
+ 1.8
+ 2.21.0
+ 3.0.0-M1
+ 3.0.2
+
+
diff --git a/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java
new file mode 100644
index 0000000000..4fb49024fb
--- /dev/null
+++ b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java
@@ -0,0 +1,14 @@
+package com.baeldung.jdi;
+
+public class JDIExampleDebuggee {
+
+ public static void main(String[] args) {
+ String jpda = "Java Platform Debugger Architecture";
+ System.out.println("Hi Everyone, Welcome to " + jpda); //add a break point here
+
+ String jdi = "Java Debug Interface"; //add a break point here and also stepping in here
+ String text = "Today, we'll dive into " + jdi;
+ System.out.println(text);
+ }
+
+}
diff --git a/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java
new file mode 100644
index 0000000000..41a568e55f
--- /dev/null
+++ b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java
@@ -0,0 +1,171 @@
+package com.baeldung.jdi;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Map;
+
+import com.sun.jdi.AbsentInformationException;
+import com.sun.jdi.Bootstrap;
+import com.sun.jdi.ClassType;
+import com.sun.jdi.IncompatibleThreadStateException;
+import com.sun.jdi.LocalVariable;
+import com.sun.jdi.Location;
+import com.sun.jdi.StackFrame;
+import com.sun.jdi.VMDisconnectedException;
+import com.sun.jdi.Value;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.Connector;
+import com.sun.jdi.connect.IllegalConnectorArgumentsException;
+import com.sun.jdi.connect.LaunchingConnector;
+import com.sun.jdi.connect.VMStartException;
+import com.sun.jdi.event.BreakpointEvent;
+import com.sun.jdi.event.ClassPrepareEvent;
+import com.sun.jdi.event.Event;
+import com.sun.jdi.event.EventSet;
+import com.sun.jdi.event.LocatableEvent;
+import com.sun.jdi.event.StepEvent;
+import com.sun.jdi.request.BreakpointRequest;
+import com.sun.jdi.request.ClassPrepareRequest;
+import com.sun.jdi.request.StepRequest;
+
+public class JDIExampleDebugger {
+
+ private Class debugClass;
+ private int[] breakPointLines;
+
+ public Class getDebugClass() {
+ return debugClass;
+ }
+
+ public void setDebugClass(Class debugClass) {
+ this.debugClass = debugClass;
+ }
+
+ public int[] getBreakPointLines() {
+ return breakPointLines;
+ }
+
+ public void setBreakPointLines(int[] breakPointLines) {
+ this.breakPointLines = breakPointLines;
+ }
+
+ /**
+ * Sets the debug class as the main argument in the connector and launches the VM
+ * @return VirtualMachine
+ * @throws IOException
+ * @throws IllegalConnectorArgumentsException
+ * @throws VMStartException
+ */
+ public VirtualMachine connectAndLaunchVM() throws IOException, IllegalConnectorArgumentsException, VMStartException {
+ LaunchingConnector launchingConnector = Bootstrap.virtualMachineManager().defaultConnector();
+ Map arguments = launchingConnector.defaultArguments();
+ arguments.get("main").setValue(debugClass.getName());
+ VirtualMachine vm = launchingConnector.launch(arguments);
+ return vm;
+ }
+
+ /**
+ * Creates a request to prepare the debug class, add filter as the debug class and enables it
+ * @param vm
+ */
+ public void enableClassPrepareRequest(VirtualMachine vm) {
+ ClassPrepareRequest classPrepareRequest = vm.eventRequestManager().createClassPrepareRequest();
+ classPrepareRequest.addClassFilter(debugClass.getName());
+ classPrepareRequest.enable();
+ }
+
+ /**
+ * Sets the break points at the line numbers mentioned in breakPointLines array
+ * @param vm
+ * @param event
+ * @throws AbsentInformationException
+ */
+ public void setBreakPoints(VirtualMachine vm, ClassPrepareEvent event) throws AbsentInformationException {
+ ClassType classType = (ClassType) event.referenceType();
+ for(int lineNumber: breakPointLines) {
+ Location location = classType.locationsOfLine(lineNumber).get(0);
+ BreakpointRequest bpReq = vm.eventRequestManager().createBreakpointRequest(location);
+ bpReq.enable();
+ }
+ }
+
+ /**
+ * Displays the visible variables
+ * @param event
+ * @throws IncompatibleThreadStateException
+ * @throws AbsentInformationException
+ */
+ public void displayVariables(LocatableEvent event) throws IncompatibleThreadStateException, AbsentInformationException {
+ StackFrame stackFrame = event.thread().frame(0);
+ if(stackFrame.location().toString().contains(debugClass.getName())) {
+ Map visibleVariables = stackFrame.getValues(stackFrame.visibleVariables());
+ System.out.println("Variables at " +stackFrame.location().toString() + " > ");
+ for (Map.Entry entry : visibleVariables.entrySet()) {
+ System.out.println(entry.getKey().name() + " = " + entry.getValue());
+ }
+ }
+ }
+
+ /**
+ * Enables step request for a break point
+ * @param vm
+ * @param event
+ */
+ public void enableStepRequest(VirtualMachine vm, BreakpointEvent event) {
+ //enable step request for last break point
+ if(event.location().toString().contains(debugClass.getName()+":"+breakPointLines[breakPointLines.length-1])) {
+ StepRequest stepRequest = vm.eventRequestManager().createStepRequest(event.thread(), StepRequest.STEP_LINE, StepRequest.STEP_OVER);
+ stepRequest.enable();
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ JDIExampleDebugger debuggerInstance = new JDIExampleDebugger();
+ debuggerInstance.setDebugClass(JDIExampleDebuggee.class);
+ int[] breakPoints = {6, 9};
+ debuggerInstance.setBreakPointLines(breakPoints);
+ VirtualMachine vm = null;
+
+ try {
+ vm = debuggerInstance.connectAndLaunchVM();
+ debuggerInstance.enableClassPrepareRequest(vm);
+
+ EventSet eventSet = null;
+ while ((eventSet = vm.eventQueue().remove()) != null) {
+ for (Event event : eventSet) {
+ if (event instanceof ClassPrepareEvent) {
+ debuggerInstance.setBreakPoints(vm, (ClassPrepareEvent)event);
+ }
+
+ if (event instanceof BreakpointEvent) {
+ event.request().disable();
+ debuggerInstance.displayVariables((BreakpointEvent) event);
+ debuggerInstance.enableStepRequest(vm, (BreakpointEvent)event);
+ }
+
+ if (event instanceof StepEvent) {
+ debuggerInstance.displayVariables((StepEvent) event);
+ }
+ vm.resume();
+ }
+ }
+ } catch (VMDisconnectedException e) {
+ System.out.println("Virtual Machine is disconnected.");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ finally {
+ InputStreamReader reader = new InputStreamReader(vm.process().getInputStream());
+ OutputStreamWriter writer = new OutputStreamWriter(System.out);
+ char[] buf = new char[512];
+
+ reader.read(buf);
+ writer.write(buf);
+ writer.flush();
+ }
+
+ }
+
+}
diff --git a/java-lite/README.md b/java-lite/README.md
index a4e2edd49f..96fb6f1a93 100644
--- a/java-lite/README.md
+++ b/java-lite/README.md
@@ -1,4 +1,8 @@
+## JavaLite
+
+This module contains articles about JavaLite.
+
### Relevant Articles:
-- [A Guide to JavaLite – Building a RESTful CRUD application](http://www.baeldung.com/javalite-rest)
-- [Introduction to ActiveWeb](http://www.baeldung.com/activeweb)
+- [A Guide to JavaLite – Building a RESTful CRUD application](https://www.baeldung.com/javalite-rest)
+- [Introduction to ActiveWeb](https://www.baeldung.com/activeweb)
diff --git a/java-math/README.md b/java-math/README.md
index d821348204..d80a07258a 100644
--- a/java-math/README.md
+++ b/java-math/README.md
@@ -1,4 +1,8 @@
-## Relevant articles:
+## Java Math
+
+This module contains articles about math in Java.
+
+### Relevant articles:
- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial)
- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm)
@@ -7,4 +11,8 @@
- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines)
- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred)
- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage)
-- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
\ No newline at end of file
+- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude)
+- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging)
+- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication)
+- [Calculating Logarithms in Java](https://www.baeldung.com/java-logarithms)
+- [Finding Greatest Common Divisor in Java](https://www.baeldung.com/java-greatest-common-divisor)
diff --git a/java-math/pom.xml b/java-math/pom.xml
index f71577b707..b5c31c4487 100644
--- a/java-math/pom.xml
+++ b/java-math/pom.xml
@@ -17,6 +17,26 @@
commons-math3
${commons-math3.version}
+
+ org.ejml
+ ejml-all
+ ${ejml.version}
+
+
+ org.nd4j
+ nd4j-native
+ ${nd4j.version}
+
+
+ org.la4j
+ la4j
+ ${la4j.version}
+
+
+ colt
+ colt
+ ${colt.version}
+
com.google.guava
guava
@@ -44,6 +64,17 @@
combinatoricslib3
${combinatoricslib3.version}
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh.version}
+
@@ -64,6 +95,11 @@
1.11
27.0.1-jre
3.3.0
+ 0.38
+ 1.0.0-beta4
+ 1.2.0
+ 0.6.0
+ 1.19
\ No newline at end of file
diff --git a/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java b/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java
new file mode 100644
index 0000000000..d4844abd9c
--- /dev/null
+++ b/java-math/src/main/java/com/baeldung/algorithms/gcd/GCDImplementation.java
@@ -0,0 +1,55 @@
+package com.baeldung.algorithms.gcd;
+
+public class GCDImplementation {
+
+ public static int gcdByBruteForce(int n1, int n2) {
+ int gcd = 1;
+ for (int i = 1; i <= n1 && i <= n2; i++) {
+ if (n1 % i == 0 && n2 % i == 0) {
+ gcd = i;
+ }
+ }
+ return gcd;
+ }
+
+ public static int gcdByEuclidsAlgorithm(int n1, int n2) {
+ if (n2 == 0) {
+ return n1;
+ }
+ return gcdByEuclidsAlgorithm(n2, n1 % n2);
+ }
+
+ public static int gcdBySteinsAlgorithm(int n1, int n2) {
+ if (n1 == 0) {
+ return n2;
+ }
+
+ if (n2 == 0) {
+ return n1;
+ }
+
+ int n;
+ for (n = 0; ((n1 | n2) & 1) == 0; n++) {
+ n1 >>= 1;
+ n2 >>= 1;
+ }
+
+ while ((n1 & 1) == 0) {
+ n1 >>= 1;
+ }
+
+ do {
+ while ((n2 & 1) == 0) {
+ n2 >>= 1;
+ }
+
+ if (n1 > n2) {
+ int temp = n1;
+ n1 = n2;
+ n2 = temp;
+ }
+ n2 = (n2 - n1);
+ } while (n2 != 0);
+ return n1 << n;
+ }
+}
diff --git a/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java b/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java
new file mode 100644
index 0000000000..0676250959
--- /dev/null
+++ b/java-math/src/main/java/com/baeldung/matrices/HomemadeMatrix.java
@@ -0,0 +1,23 @@
+package com.baeldung.matrices;
+
+public class HomemadeMatrix {
+ public static double[][] multiplyMatrices(double[][] firstMatrix, double[][] secondMatrix) {
+ double[][] result = new double[firstMatrix.length][secondMatrix[0].length];
+
+ for (int row = 0; row < result.length; row++) {
+ for (int col = 0; col < result[row].length; col++) {
+ result[row][col] = multiplyMatricesCell(firstMatrix, secondMatrix, row, col);
+ }
+ }
+
+ return result;
+ }
+
+ private static double multiplyMatricesCell(double[][] firstMatrix, double[][] secondMatrix, int row, int col) {
+ double cell = 0;
+ for (int i = 0; i < secondMatrix.length; i++) {
+ cell += firstMatrix[row][i] * secondMatrix[i][col];
+ }
+ return cell;
+ }
+}
\ No newline at end of file
diff --git a/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java
new file mode 100644
index 0000000000..d2c91a2eb8
--- /dev/null
+++ b/java-math/src/test/java/com/baeldung/algorithms/gcd/GCDImplementationUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.algorithms.gcd;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GCDImplementationUnitTest {
+
+ @Test
+ public void whenCalculatingGCDByBruteForceMethod_thenCorrect() {
+ int n1 = 60;
+ int n2 = 90;
+ int gcd = GCDImplementation.gcdByBruteForce(n1, n2);
+ assertThat(gcd).isEqualTo(30);
+ }
+
+ @Test
+ public void whenCalculatingGCDByEuclidsAlgorithm_thenCorrect() {
+ int n1 = 60;
+ int n2 = 90;
+ int gcd = GCDImplementation.gcdByEuclidsAlgorithm(n1, n2);
+ assertThat(gcd).isEqualTo(30);
+ }
+
+ @Test
+ public void whenCalculatingGCDBySteinsAlgorithm_thenCorrect() {
+ int n1 = 60;
+ int n2 = 90;
+ int gcd = GCDImplementation.gcdBySteinsAlgorithm(n1, n2);
+ assertThat(gcd).isEqualTo(30);
+ }
+}
diff --git a/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java b/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java
new file mode 100644
index 0000000000..facad1edc4
--- /dev/null
+++ b/java-math/src/test/java/com/baeldung/algorithms/logarithm/LogarithmUnitTest.java
@@ -0,0 +1,31 @@
+package com.baeldung.algorithms.logarithm;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.Test;
+
+public class LogarithmUnitTest {
+
+ @Test
+ public void givenLog10_shouldReturnValidResults() {
+ assertEquals(Math.log10(100), 2);
+ assertEquals(Math.log10(1000), 3);
+ }
+
+ @Test
+ public void givenLogE_shouldReturnValidResults() {
+ assertEquals(Math.log(Math.E), 1);
+ assertEquals(Math.log(10), 2.30258, 0.00001);
+ }
+
+ @Test
+ public void givenCustomLog_shouldReturnValidResults() {
+ assertEquals(customLog(2, 256), 8);
+ assertEquals(customLog(10, 100), 2);
+ }
+
+ private static double customLog(double base, double logNumber) {
+ return Math.log(logNumber) / Math.log(base);
+ }
+
+}
diff --git a/java-math/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java b/java-math/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java
new file mode 100644
index 0000000000..171a1d28a4
--- /dev/null
+++ b/java-math/src/test/java/com/baeldung/matrices/MatrixMultiplicationBenchmarking.java
@@ -0,0 +1,84 @@
+package com.baeldung.matrices;
+
+import cern.colt.matrix.DoubleFactory2D;
+import cern.colt.matrix.DoubleMatrix2D;
+import cern.colt.matrix.linalg.Algebra;
+import org.apache.commons.math3.linear.Array2DRowRealMatrix;
+import org.apache.commons.math3.linear.RealMatrix;
+import org.ejml.simple.SimpleMatrix;
+import org.la4j.Matrix;
+import org.la4j.matrix.dense.Basic2DMatrix;
+import org.nd4j.linalg.api.ndarray.INDArray;
+import org.nd4j.linalg.factory.Nd4j;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.concurrent.TimeUnit;
+
+public class MatrixMultiplicationBenchmarking {
+
+ public static void main(String[] args) throws Exception {
+ Options opt = new OptionsBuilder()
+ .include(MatrixMultiplicationBenchmarking.class.getSimpleName())
+ .mode(Mode.AverageTime)
+ .forks(2)
+ .warmupIterations(5)
+ .measurementIterations(10)
+ .timeUnit(TimeUnit.MICROSECONDS)
+ .build();
+
+ new Runner(opt).run();
+ }
+
+ @Benchmark
+ public Object homemadeMatrixMultiplication(MatrixProvider matrixProvider) {
+ return HomemadeMatrix.multiplyMatrices(matrixProvider.getFirstMatrix(), matrixProvider.getSecondMatrix());
+ }
+
+ @Benchmark
+ public Object ejmlMatrixMultiplication(MatrixProvider matrixProvider) {
+ SimpleMatrix firstMatrix = new SimpleMatrix(matrixProvider.getFirstMatrix());
+ SimpleMatrix secondMatrix = new SimpleMatrix(matrixProvider.getSecondMatrix());
+
+ return firstMatrix.mult(secondMatrix);
+ }
+
+ @Benchmark
+ public Object apacheCommonsMatrixMultiplication(MatrixProvider matrixProvider) {
+ RealMatrix firstMatrix = new Array2DRowRealMatrix(matrixProvider.getFirstMatrix());
+ RealMatrix secondMatrix = new Array2DRowRealMatrix(matrixProvider.getSecondMatrix());
+
+ return firstMatrix.multiply(secondMatrix);
+ }
+
+ @Benchmark
+ public Object la4jMatrixMultiplication(MatrixProvider matrixProvider) {
+ Matrix firstMatrix = new Basic2DMatrix(matrixProvider.getFirstMatrix());
+ Matrix secondMatrix = new Basic2DMatrix(matrixProvider.getSecondMatrix());
+
+ return firstMatrix.multiply(secondMatrix);
+ }
+
+ @Benchmark
+ public Object nd4jMatrixMultiplication(MatrixProvider matrixProvider) {
+ INDArray firstMatrix = Nd4j.create(matrixProvider.getFirstMatrix());
+ INDArray secondMatrix = Nd4j.create(matrixProvider.getSecondMatrix());
+
+ return firstMatrix.mmul(secondMatrix);
+ }
+
+ @Benchmark
+ public Object coltMatrixMultiplication(MatrixProvider matrixProvider) {
+ DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense;
+
+ DoubleMatrix2D firstMatrix = doubleFactory2D.make(matrixProvider.getFirstMatrix());
+ DoubleMatrix2D secondMatrix = doubleFactory2D.make(matrixProvider.getSecondMatrix());
+
+ Algebra algebra = new Algebra();
+ return algebra.mult(firstMatrix, secondMatrix);
+ }
+
+}
\ No newline at end of file
diff --git a/java-math/src/test/java/com/baeldung/matrices/MatrixProvider.java b/java-math/src/test/java/com/baeldung/matrices/MatrixProvider.java
new file mode 100644
index 0000000000..33bd074b6e
--- /dev/null
+++ b/java-math/src/test/java/com/baeldung/matrices/MatrixProvider.java
@@ -0,0 +1,33 @@
+package com.baeldung.matrices;
+
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+
+@State(Scope.Benchmark)
+public class MatrixProvider {
+ private double[][] firstMatrix;
+ private double[][] secondMatrix;
+
+ public MatrixProvider() {
+ firstMatrix =
+ new double[][] {
+ new double[] {1d, 5d},
+ new double[] {2d, 3d},
+ new double[] {1d ,7d}
+ };
+
+ secondMatrix =
+ new double[][] {
+ new double[] {1d, 2d, 3d, 7d},
+ new double[] {5d, 2d, 8d, 1d}
+ };
+ }
+
+ public double[][] getFirstMatrix() {
+ return firstMatrix;
+ }
+
+ public double[][] getSecondMatrix() {
+ return secondMatrix;
+ }
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
similarity index 82%
rename from libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
index 05944e7b3a..e7d99fbe3e 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/apache/RealMatrixUnitTest.java
@@ -7,15 +7,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class RealMatrixUnitTest {
+class RealMatrixUnitTest {
@Test
- @Benchmark
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
RealMatrix firstMatrix = new Array2DRowRealMatrix(
new double[][] {
new double[] {1d, 5d},
@@ -43,5 +38,4 @@ public class RealMatrixUnitTest {
assertThat(actual).isEqualTo(expected);
}
-
}
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
similarity index 83%
rename from libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
index fb4a419eb0..da66cd7d61 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/colt/DoubleMatrix2DUnitTest.java
@@ -8,15 +8,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class DoubleMatrix2DUnitTest {
+class DoubleMatrix2DUnitTest {
@Test
- @Benchmark
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
DoubleFactory2D doubleFactory2D = DoubleFactory2D.dense;
DoubleMatrix2D firstMatrix = doubleFactory2D.make(
@@ -48,4 +43,4 @@ public class DoubleMatrix2DUnitTest {
assertThat(actual).isEqualTo(expected);
}
-}
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
similarity index 81%
rename from libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
index b025266a1d..60381ece63 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/ejml/SimpleMatrixUnitTest.java
@@ -6,15 +6,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class SimpleMatrixUnitTest {
+class SimpleMatrixUnitTest {
@Test
- @Benchmark
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
SimpleMatrix firstMatrix = new SimpleMatrix(
new double[][] {
new double[] {1d, 5d},
@@ -43,4 +38,4 @@ public class SimpleMatrixUnitTest {
assertThat(actual).matches(m -> m.isIdentical(expected, 0d));
}
-}
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
similarity index 86%
rename from libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
index be9e483d5b..d1a062ee79 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/homemade/HomemadeMatrixUnitTest.java
@@ -5,15 +5,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class HomemadeMatrixUnitTest {
+class HomemadeMatrixUnitTest {
@Test
- @Benchmark
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
double[][] firstMatrix = {
new double[]{1d, 5d},
new double[]{2d, 3d},
@@ -55,4 +50,5 @@ public class HomemadeMatrixUnitTest {
}
return cell;
}
-}
+
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
similarity index 80%
rename from libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
index afb84ff3db..01731a3dd5 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/la4j/Basic2DMatrixUnitTest.java
@@ -7,15 +7,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class Basic2DMatrixUnitTest {
+class Basic2DMatrixUnitTest {
@Test
- @Benchmark
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
Matrix firstMatrix = new Basic2DMatrix(
new double[][]{
new double[]{1d, 5d},
@@ -44,4 +39,4 @@ public class Basic2DMatrixUnitTest {
assertThat(actual).isEqualTo(expected);
}
-}
+}
\ No newline at end of file
diff --git a/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java b/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
similarity index 82%
rename from libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
rename to java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
index fb3030bccf..72ef60a571 100644
--- a/libraries-2/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
+++ b/java-math/src/test/java/com/baeldung/matrices/nd4j/INDArrayUnitTest.java
@@ -7,14 +7,10 @@ import org.openjdk.jmh.annotations.*;
import static org.assertj.core.api.Assertions.assertThat;
-@BenchmarkMode(Mode.AverageTime)
-@Fork(value = 2)
-@Warmup(iterations = 5)
-@Measurement(iterations = 10)
-public class INDArrayUnitTest {
+class INDArrayUnitTest {
@Test
- public void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
+ void givenTwoMatrices_whenMultiply_thenMultiplicatedMatrix() {
INDArray firstMatrix = Nd4j.create(
new double[][]{
new double[]{1d, 5d},
@@ -43,4 +39,4 @@ public class INDArrayUnitTest {
assertThat(actual).isEqualTo(expected);
}
-}
+}
\ No newline at end of file
diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md
new file mode 100644
index 0000000000..e200c4aa03
--- /dev/null
+++ b/java-numbers-2/README.md
@@ -0,0 +1,18 @@
+## Java Number Cookbooks and Examples
+
+This module contains articles about numbers in Java.
+
+### Relevant Articles
+- [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion)
+- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math)
+- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area)
+- [NaN in Java](https://www.baeldung.com/java-not-a-number)
+- [Generating Prime Numbers in Java](https://www.baeldung.com/java-generate-prime-numbers)
+- [Using Math.pow in Java](https://www.baeldung.com/java-math-pow)
+- [Check If a Number Is Prime in Java](https://www.baeldung.com/java-prime-numbers)
+- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
+- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple)
+- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers)
+- [Generating Random Numbers in a Range in Java](https://www.baeldung.com/java-generating-random-numbers)
+- [Listing Numbers Within a Range in Java](https://www.baeldung.com/java-listing-numbers-within-a-range)
+- More articles: [[<-- prev]](/../java-numbers)
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java
diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/Circle.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/area/circle/Circle.java
rename to java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java
diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java
rename to java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java
diff --git a/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java b/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java
new file mode 100644
index 0000000000..62cead726f
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/binarynumbers/BinaryNumbers.java
@@ -0,0 +1,140 @@
+package com.baeldung.binarynumbers;
+
+public class BinaryNumbers {
+
+ /**
+ * This method takes a decimal number and convert it into a binary number.
+ * example:- input:10, output:1010
+ *
+ * @param decimalNumber
+ * @return binary number
+ */
+ public Integer convertDecimalToBinary(Integer decimalNumber) {
+
+ if (decimalNumber == 0) {
+ return decimalNumber;
+ }
+
+ StringBuilder binaryNumber = new StringBuilder();
+ Integer quotient = decimalNumber;
+
+ while (quotient > 0) {
+
+ int remainder = quotient % 2;
+ binaryNumber.append(remainder);
+ quotient /= 2;
+ }
+
+ binaryNumber = binaryNumber.reverse();
+ return Integer.valueOf(binaryNumber.toString());
+ }
+
+ /**
+ * This method takes a binary number and convert it into a decimal number.
+ * example:- input:101, output:5
+ *
+ * @param binary number
+ * @return decimal Number
+ */
+ public Integer convertBinaryToDecimal(Integer binaryNumber) {
+
+ Integer decimalNumber = 0;
+ Integer base = 1;
+
+ while (binaryNumber > 0) {
+
+ int lastDigit = binaryNumber % 10;
+ binaryNumber = binaryNumber / 10;
+
+ decimalNumber += lastDigit * base;
+ base = base * 2;
+ }
+ return decimalNumber;
+ }
+
+ /**
+ * This method accepts two binary numbers and returns sum of input numbers.
+ * Example:- firstNum: 101, secondNum: 100, output: 1001
+ *
+ * @param firstNum
+ * @param secondNum
+ * @return addition of input numbers
+ */
+ public Integer addBinaryNumber(Integer firstNum, Integer secondNum) {
+
+ StringBuilder output = new StringBuilder();
+
+ int carry = 0;
+ int temp;
+
+ while (firstNum != 0 || secondNum != 0) {
+
+ temp = (firstNum % 10 + secondNum % 10 + carry) % 2;
+ output.append(temp);
+
+ carry = (firstNum % 10 + secondNum % 10 + carry) / 2;
+
+ firstNum = firstNum / 10;
+ secondNum = secondNum / 10;
+ }
+
+ if (carry != 0) {
+ output.append(carry);
+ }
+
+ return Integer.valueOf(output.reverse()
+ .toString());
+ }
+
+ /**
+ * This method takes two binary number as input and subtract second number from the first number.
+ * example:- firstNum: 1000, secondNum: 11, output: 101
+ * @param firstNum
+ * @param secondNum
+ * @return Result of subtraction of secondNum from first
+ */
+ public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) {
+
+ int onesComplement = Integer.valueOf(getOnesComplement(secondNum));
+ StringBuilder output = new StringBuilder();
+ int carry = 0;
+ int temp;
+
+ while (firstNum != 0 || onesComplement != 0) {
+
+ temp = (firstNum % 10 + onesComplement % 10 + carry) % 2;
+ output.append(temp);
+
+ carry = (firstNum % 10 + onesComplement % 10 + carry) / 2;
+
+ firstNum = firstNum / 10;
+ onesComplement = onesComplement / 10;
+ }
+
+ String additionOfFirstNumAndOnesComplement = output.reverse()
+ .toString();
+
+ if (carry == 1) {
+ return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry);
+ } else {
+ return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement));
+ }
+ }
+
+ public Integer getOnesComplement(Integer num) {
+
+ StringBuilder onesComplement = new StringBuilder();
+ while (num > 0) {
+ int lastDigit = num % 10;
+ if (lastDigit == 0) {
+ onesComplement.append(1);
+ } else {
+ onesComplement.append(0);
+ }
+ num = num / 10;
+ }
+ return Integer.valueOf(onesComplement.reverse()
+ .toString());
+ }
+
+}
\ No newline at end of file
diff --git a/java-numbers-2/src/main/java/com/baeldung/lcm/BigIntegerLCM.java b/java-numbers-2/src/main/java/com/baeldung/lcm/BigIntegerLCM.java
new file mode 100644
index 0000000000..affface9c0
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/lcm/BigIntegerLCM.java
@@ -0,0 +1,13 @@
+package com.baeldung.lcm;
+
+import java.math.BigInteger;
+
+public class BigIntegerLCM {
+
+ public static BigInteger lcm(BigInteger number1, BigInteger number2) {
+ BigInteger gcd = number1.gcd(number2);
+ BigInteger absProduct = number1.multiply(number2).abs();
+ return absProduct.divide(gcd);
+ }
+
+}
diff --git a/java-numbers-2/src/main/java/com/baeldung/lcm/EuclideanAlgorithm.java b/java-numbers-2/src/main/java/com/baeldung/lcm/EuclideanAlgorithm.java
new file mode 100644
index 0000000000..4032d119fa
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/lcm/EuclideanAlgorithm.java
@@ -0,0 +1,40 @@
+package com.baeldung.lcm;
+
+import java.util.Arrays;
+
+public class EuclideanAlgorithm {
+
+ public static int gcd(int number1, int number2) {
+ if (number1 == 0 || number2 == 0) {
+ return number1 + number2;
+ } else {
+ int absNumber1 = Math.abs(number1);
+ int absNumber2 = Math.abs(number2);
+ int biggerValue = Math.max(absNumber1, absNumber2);
+ int smallerValue = Math.min(absNumber1, absNumber2);
+ return gcd(biggerValue % smallerValue, smallerValue);
+ }
+ }
+
+ public static int lcm(int number1, int number2) {
+ if (number1 == 0 || number2 == 0)
+ return 0;
+ else {
+ int gcd = gcd(number1, number2);
+ return Math.abs(number1 * number2) / gcd;
+ }
+ }
+
+ public static int lcmForArray(int[] numbers) {
+ int lcm = numbers[0];
+ for (int i = 1; i <= numbers.length - 1; i++) {
+ lcm = lcm(lcm, numbers[i]);
+ }
+ return lcm;
+ }
+
+ public static int lcmByLambda(int... numbers) {
+ return Arrays.stream(numbers).reduce(1, (lcmSoFar, currentNumber) -> Math.abs(lcmSoFar * currentNumber) / gcd(lcmSoFar, currentNumber));
+ }
+
+}
diff --git a/java-numbers-2/src/main/java/com/baeldung/lcm/PrimeFactorizationAlgorithm.java b/java-numbers-2/src/main/java/com/baeldung/lcm/PrimeFactorizationAlgorithm.java
new file mode 100644
index 0000000000..cfdc3bfe96
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/lcm/PrimeFactorizationAlgorithm.java
@@ -0,0 +1,42 @@
+package com.baeldung.lcm;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class PrimeFactorizationAlgorithm {
+
+ public static Map getPrimeFactors(int number) {
+ int absNumber = Math.abs(number);
+ Map primeFactorsMap = new HashMap();
+ for (int factor = 2; factor <= absNumber; factor++) {
+ while (absNumber % factor == 0) {
+ Integer power = primeFactorsMap.get(factor);
+ if (power == null) {
+ power = 0;
+ }
+ primeFactorsMap.put(factor, power + 1);
+ absNumber /= factor;
+ }
+ }
+ return primeFactorsMap;
+ }
+
+ public static int lcm(int number1, int number2) {
+ if (number1 == 0 || number2 == 0) {
+ return 0;
+ }
+ Map primeFactorsForNum1 = getPrimeFactors(number1);
+ Map primeFactorsForNum2 = getPrimeFactors(number2);
+ Set primeFactorsUnionSet = new HashSet(primeFactorsForNum1.keySet());
+ primeFactorsUnionSet.addAll(primeFactorsForNum2.keySet());
+ int lcm = 1;
+ for (Integer primeFactor : primeFactorsUnionSet) {
+ lcm *= Math.pow(primeFactor, Math.max(primeFactorsForNum1.getOrDefault(primeFactor, 0),
+ primeFactorsForNum2.getOrDefault(primeFactor, 0)));
+ }
+ return lcm;
+ }
+
+}
diff --git a/java-numbers-2/src/main/java/com/baeldung/lcm/SimpleAlgorithm.java b/java-numbers-2/src/main/java/com/baeldung/lcm/SimpleAlgorithm.java
new file mode 100644
index 0000000000..6ba4966dc7
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/lcm/SimpleAlgorithm.java
@@ -0,0 +1,18 @@
+package com.baeldung.lcm;
+
+public class SimpleAlgorithm {
+ public static int lcm(int number1, int number2) {
+ if (number1 == 0 || number2 == 0) {
+ return 0;
+ }
+ int absNumber1 = Math.abs(number1);
+ int absNumber2 = Math.abs(number2);
+ int absHigherNumber = Math.max(absNumber1, absNumber2);
+ int absLowerNumber = Math.min(absNumber1, absNumber2);
+ int lcm = absHigherNumber;
+ while (lcm % absLowerNumber != 0) {
+ lcm += absHigherNumber;
+ }
+ return lcm;
+ }
+}
diff --git a/java-numbers/src/main/java/com/baeldung/nan/NaNExample.java b/java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/nan/NaNExample.java
rename to java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java
diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java
new file mode 100644
index 0000000000..937583cdb5
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java
@@ -0,0 +1,36 @@
+package com.baeldung.numbersinrange;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class NumbersInARange {
+
+ public List getNumbersInRange(int start, int end) {
+ List result = new ArrayList<>();
+ for (int i = start; i < end; i++) {
+ result.add(i);
+ }
+ return result;
+ }
+
+ public List getNumbersUsingIntStreamRange(int start, int end) {
+ return IntStream.range(start, end)
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ public List getNumbersUsingIntStreamRangeClosed(int start, int end) {
+ return IntStream.rangeClosed(start, end)
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ public List getNumbersUsingIntStreamIterate(int start, int limit) {
+ return IntStream.iterate(start, i -> i + 1)
+ .limit(limit)
+ .boxed()
+ .collect(Collectors.toList());
+ }
+}
diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java
new file mode 100644
index 0000000000..dc6ddfe781
--- /dev/null
+++ b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java
@@ -0,0 +1,22 @@
+package com.baeldung.numbersinrange;
+
+import java.util.Random;
+
+public class RandomNumbersInARange {
+
+ public int getRandomNumber(int min, int max) {
+ return (int) ((Math.random() * (max - min)) + min);
+ }
+
+ public int getRandomNumberUsingNextInt(int min, int max) {
+ Random random = new Random();
+ return random.nextInt(max - min) + min;
+ }
+
+ public int getRandomNumberUsingInts(int min, int max) {
+ Random random = new Random();
+ return random.ints(min, max)
+ .findFirst()
+ .getAsInt();
+ }
+}
diff --git a/java-numbers/src/main/java/com/baeldung/pow/PowerExample.java b/java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java
similarity index 100%
rename from java-numbers/src/main/java/com/baeldung/pow/PowerExample.java
rename to java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java
diff --git a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
similarity index 96%
rename from java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java
rename to java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
index 750807ce77..7511141a84 100644
--- a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java
+++ b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java
@@ -1,59 +1,59 @@
-package com.baeldung.prime;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-public class PrimeGenerator {
- public static List sieveOfEratosthenes(int n) {
- final boolean prime[] = new boolean[n + 1];
- Arrays.fill(prime, true);
-
- for (int p = 2; p * p <= n; p++) {
- if (prime[p]) {
- for (int i = p * 2; i <= n; i += p)
- prime[i] = false;
- }
- }
-
- final List primes = new LinkedList<>();
- for (int i = 2; i <= n; i++) {
- if (prime[i])
- primes.add(i);
- }
- return primes;
- }
-
- public static List primeNumbersBruteForce(int max) {
- final List primeNumbers = new LinkedList();
- for (int i = 2; i <= max; i++) {
- if (isPrimeBruteForce(i)) {
- primeNumbers.add(i);
- }
- }
- return primeNumbers;
- }
-
- private static boolean isPrimeBruteForce(int x) {
- for (int i = 2; i < x; i++) {
- if (x % i == 0) {
- return false;
- }
- }
- return true;
- }
-
- public static List primeNumbersTill(int max) {
- return IntStream.rangeClosed(2, max)
- .filter(x -> isPrime(x))
- .boxed()
- .collect(Collectors.toList());
- }
-
- private static boolean isPrime(int x) {
- return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
- .allMatch(n -> x % n != 0);
- }
-}
+package com.baeldung.prime;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class PrimeGenerator {
+ public static List sieveOfEratosthenes(int n) {
+ final boolean prime[] = new boolean[n + 1];
+ Arrays.fill(prime, true);
+
+ for (int p = 2; p * p <= n; p++) {
+ if (prime[p]) {
+ for (int i = p * 2; i <= n; i += p)
+ prime[i] = false;
+ }
+ }
+
+ final List primes = new LinkedList<>();
+ for (int i = 2; i <= n; i++) {
+ if (prime[i])
+ primes.add(i);
+ }
+ return primes;
+ }
+
+ public static List primeNumbersBruteForce(int max) {
+ final List primeNumbers = new LinkedList();
+ for (int i = 2; i <= max; i++) {
+ if (isPrimeBruteForce(i)) {
+ primeNumbers.add(i);
+ }
+ }
+ return primeNumbers;
+ }
+
+ private static boolean isPrimeBruteForce(int x) {
+ for (int i = 2; i < x; i++) {
+ if (x % i == 0) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static List primeNumbersTill(int max) {
+ return IntStream.rangeClosed(2, max)
+ .filter(x -> isPrime(x))
+ .boxed()
+ .collect(Collectors.toList());
+ }
+
+ private static boolean isPrime(int x) {
+ return IntStream.rangeClosed(2, (int) (Math.sqrt(x)))
+ .allMatch(n -> x % n != 0);
+ }
+}
diff --git a/java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
similarity index 100%
rename from java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java
diff --git a/java-numbers-2/src/test/java/com/baeldung/binarynumbers/BinaryNumbersUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/binarynumbers/BinaryNumbersUnitTest.java
new file mode 100644
index 0000000000..ca6022261d
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/binarynumbers/BinaryNumbersUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.binarynumbers;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class BinaryNumbersUnitTest {
+
+ private BinaryNumbers binaryNumbers = new BinaryNumbers();
+
+ @Test
+ public void given_decimalNumber_then_returnBinaryNumber() {
+ assertEquals(Integer.valueOf(1000), binaryNumbers.convertDecimalToBinary(8));
+ assertEquals(Integer.valueOf(10100), binaryNumbers.convertDecimalToBinary(20));
+ }
+
+ @Test
+ public void given_decimalNumber_then_convertToBinaryNumber() {
+ assertEquals("1000", Integer.toBinaryString(8));
+ assertEquals("10100", Integer.toBinaryString(20));
+ }
+
+ @Test
+ public void given_binaryNumber_then_ConvertToDecimalNumber() {
+ assertEquals(8, Integer.parseInt("1000", 2));
+ assertEquals(20, Integer.parseInt("10100", 2));
+ }
+
+ @Test
+ public void given_binaryNumber_then_returnDecimalNumber() {
+ assertEquals(Integer.valueOf(8), binaryNumbers.convertBinaryToDecimal(1000));
+ assertEquals(Integer.valueOf(20), binaryNumbers.convertBinaryToDecimal(10100));
+ }
+
+ @Test
+ public void given_twoBinaryNumber_then_returnAddition() {
+ // adding 4 and 10
+ assertEquals(Integer.valueOf(1110), binaryNumbers.addBinaryNumber(100, 1010));
+
+ // adding 26 and 14
+ assertEquals(Integer.valueOf(101000), binaryNumbers.addBinaryNumber(11010, 1110));
+ }
+
+ @Test
+ public void given_twoBinaryNumber_then_returnSubtraction() {
+ // subtracting 16 from 25
+ assertEquals(Integer.valueOf(1001), binaryNumbers.substractBinaryNumber(11001, 10000));
+
+ // subtracting 29 from 16, the output here is negative
+ assertEquals(Integer.valueOf(1101), binaryNumbers.substractBinaryNumber(10000, 11101));
+ }
+
+ @Test
+ public void given_binaryLiteral_thenReturnDecimalValue() {
+
+ byte five = 0b101;
+ assertEquals((byte) 5, five);
+
+ short three = 0b11;
+ assertEquals((short) 3, three);
+
+ int nine = 0B1001;
+ assertEquals(9, nine);
+
+ long twentyNine = 0B11101;
+ assertEquals(29, twentyNine);
+
+ int minusThirtySeven = -0B100101;
+ assertEquals(-37, minusThirtySeven);
+
+ }
+
+}
diff --git a/java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java
similarity index 100%
rename from java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java
diff --git a/java-numbers-2/src/test/java/com/baeldung/lcm/BigIntegerLCMUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/lcm/BigIntegerLCMUnitTest.java
new file mode 100644
index 0000000000..10bee4c087
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/lcm/BigIntegerLCMUnitTest.java
@@ -0,0 +1,18 @@
+package com.baeldung.lcm;
+
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigInteger;
+
+public class BigIntegerLCMUnitTest {
+
+ @Test
+ public void testLCM() {
+ BigInteger number1 = new BigInteger("12");
+ BigInteger number2 = new BigInteger("18");
+ BigInteger expectedLCM = new BigInteger("36");
+ Assert.assertEquals(expectedLCM, BigIntegerLCM.lcm(number1, number2));
+ }
+}
diff --git a/java-numbers-2/src/test/java/com/baeldung/lcm/EuclideanAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/lcm/EuclideanAlgorithmUnitTest.java
new file mode 100644
index 0000000000..09a53cfa4e
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/lcm/EuclideanAlgorithmUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.lcm;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EuclideanAlgorithmUnitTest {
+
+ @Test
+ public void testGCD() {
+ Assert.assertEquals(6, EuclideanAlgorithm.gcd(12, 18));
+ }
+
+ @Test
+ public void testLCM() {
+ Assert.assertEquals(36, EuclideanAlgorithm.lcm(12, 18));
+ }
+
+ @Test
+ public void testLCMForArray() {
+ Assert.assertEquals(15, EuclideanAlgorithm.lcmForArray(new int[]{3, 5, 15}));
+ }
+
+ @Test
+ public void testLCMByLambdaForArray() {
+ Assert.assertEquals(15, EuclideanAlgorithm.lcmByLambda(new int[]{3, 5, 15}));
+ }
+}
diff --git a/java-numbers-2/src/test/java/com/baeldung/lcm/PrimeFactorizationAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/lcm/PrimeFactorizationAlgorithmUnitTest.java
new file mode 100644
index 0000000000..b33b81f85e
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/lcm/PrimeFactorizationAlgorithmUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.lcm;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.baeldung.lcm.PrimeFactorizationAlgorithm.*;
+
+
+public class PrimeFactorizationAlgorithmUnitTest {
+
+ @Test
+ public void testGetPrimeFactors() {
+ Map expectedPrimeFactorsMapForTwelve = new HashMap<>();
+ expectedPrimeFactorsMapForTwelve.put(2, 2);
+ expectedPrimeFactorsMapForTwelve.put(3, 1);
+ Map expectedPrimeFactorsMapForEighteen = new HashMap<>();
+ expectedPrimeFactorsMapForEighteen.put(2, 1);
+ expectedPrimeFactorsMapForEighteen.put(3, 2);
+ Assert.assertEquals(expectedPrimeFactorsMapForTwelve, getPrimeFactors(12));
+ Assert.assertEquals(expectedPrimeFactorsMapForEighteen, getPrimeFactors(18));
+ }
+
+ @Test
+ public void testLCM() {
+ Assert.assertEquals(36, PrimeFactorizationAlgorithm.lcm(12, 18));
+ }
+}
diff --git a/java-numbers-2/src/test/java/com/baeldung/lcm/SimpleAlgorithmUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/lcm/SimpleAlgorithmUnitTest.java
new file mode 100644
index 0000000000..bc0a1690f4
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/lcm/SimpleAlgorithmUnitTest.java
@@ -0,0 +1,15 @@
+package com.baeldung.lcm;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static com.baeldung.lcm.SimpleAlgorithm.*;
+
+public class SimpleAlgorithmUnitTest {
+
+ @Test
+ public void testLCM() {
+ Assert.assertEquals(36, lcm(12, 18));
+ }
+
+}
diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java
new file mode 100644
index 0000000000..3225257166
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.numbersinrange;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+
+public class NumbersInARangeUnitTest {
+
+ @Test
+ public void givenTheRange1To10_andUsingForLoop_thenExpectCorrectResult() {
+ NumbersInARange numbersInARange = new NumbersInARange();
+ List numbers = numbersInARange.getNumbersInRange(1, 10);
+
+ assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9), numbers);
+ }
+
+ @Test
+ public void givenTheRange1To10_andUsingIntStreamRange_thenExpectCorrectResult() {
+ NumbersInARange numbersInARange = new NumbersInARange();
+ List numbers = numbersInARange.getNumbersUsingIntStreamRange(1, 10);
+
+ assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9), numbers);
+ }
+
+ @Test
+ public void givenTheRange1To10_andUsingIntStreamRangeClosed_thenExpectCorrectResult() {
+ NumbersInARange numbersInARange = new NumbersInARange();
+ List numbers = numbersInARange.getNumbersUsingIntStreamRangeClosed(1, 10);
+
+ assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9,10), numbers);
+ }
+
+ @Test
+ public void givenTheRange1To10_andUsingIntStreamIterate_thenExpectCorrectResult() {
+ NumbersInARange numbersInARange = new NumbersInARange();
+ List numbers = numbersInARange.getNumbersUsingIntStreamIterate(1, 10);
+
+ assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9,10), numbers);
+ }
+}
diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java
new file mode 100644
index 0000000000..77b2cbbfef
--- /dev/null
+++ b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.numbersinrange;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class RandomNumbersInARangeUnitTest {
+
+ @Test
+ public void givenTheRange1To10_andUsingMathRandom_thenExpectCorrectResult() {
+ RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange();
+ int number = randomNumbersInARange.getRandomNumber(1, 10);
+
+ assertTrue(number >= 1);
+ assertTrue(number < 10);
+ }
+
+ @Test
+ public void givenTheRange1To10_andUsingRandomInts_thenExpectCorrectResult() {
+ RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange();
+ int number = randomNumbersInARange.getRandomNumberUsingInts(1, 10);
+
+ assertTrue(number >= 1);
+ assertTrue(number < 10);
+ }
+
+ @Test
+ public void givenTheRange1To10_andUsingRandomNextInt_thenExpectCorrectResult() {
+ RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange();
+ int number = randomNumbersInARange.getRandomNumberUsingNextInt(1, 10);
+
+ assertTrue(number >= 1);
+ assertTrue(number < 10);
+ }
+}
diff --git a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
similarity index 97%
rename from java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
rename to java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
index 210bde076b..2509bd73d4 100644
--- a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
+++ b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java
@@ -1,28 +1,29 @@
-package com.baeldung.prime;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Test;
-
-import static com.baeldung.prime.PrimeGenerator.*;
-import static org.junit.Assert.*;
-
-public class PrimeGeneratorUnitTest {
- @Test
- public void whenBruteForced_returnsSuccessfully() {
- final List primeNumbers = primeNumbersBruteForce(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-
- @Test
- public void whenOptimized_returnsSuccessfully() {
- final List primeNumbers = primeNumbersTill(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-
- @Test
- public void whenSieveOfEratosthenes_returnsSuccessfully() {
- final List primeNumbers = sieveOfEratosthenes(20);
- assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
- }
-}
+package com.baeldung.prime;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.baeldung.prime.PrimeGenerator.*;
+import static org.junit.Assert.*;
+
+public class PrimeGeneratorUnitTest {
+ @Test
+ public void whenBruteForced_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersBruteForce(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenOptimized_returnsSuccessfully() {
+ final List primeNumbers = primeNumbersTill(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+
+ @Test
+ public void whenSieveOfEratosthenes_returnsSuccessfully() {
+ final List primeNumbers = sieveOfEratosthenes(20);
+ assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers);
+ }
+}
diff --git a/java-numbers/README.md b/java-numbers/README.md
index 2b1131f325..eee6fceab1 100644
--- a/java-numbers/README.md
+++ b/java-numbers/README.md
@@ -1,14 +1,10 @@
-=========
-
## Java Number Cookbooks and Examples
+This module contains articles about numbers in Java.
+
### Relevant Articles:
- [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int)
-- [NaN in Java](http://www.baeldung.com/java-not-a-number)
- [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number)
-- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers)
-- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow)
-- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers)
- [BigDecimal and BigInteger in Java](http://www.baeldung.com/java-bigdecimal-biginteger)
- [Find All Pairs of Numbers in an Array That Add Up to a Given Sum](http://www.baeldung.com/java-algorithm-number-pairs-sum)
- [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double)
@@ -17,5 +13,4 @@
- [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root)
- [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string)
- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order)
-- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area)
-- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math)
\ No newline at end of file
+- More articles: [[next -->]](/../java-numbers-2)
diff --git a/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java b/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java
index 217f1e06de..5e9f5bbcb4 100644
--- a/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java
+++ b/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java
@@ -1,8 +1,12 @@
package com.baeldung.nth.root.calculator;
-public class NthRootCalculator
-{
- public Double calculate(Double base, Double n) {
- return Math.pow(Math.E, Math.log(base)/n);
+public class NthRootCalculator {
+
+ public double calculateWithRound(double base, double n) {
+ return Math.round(calculate(base, n));
+ }
+
+ public double calculate(double base, double n) {
+ return Math.pow(base, 1.0 / n);
}
}
diff --git a/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java b/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java
index 3fcd36812f..50190da38c 100644
--- a/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java
+++ b/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java
@@ -7,7 +7,7 @@ public class Main {
NthRootCalculator calculator = new NthRootCalculator();
Double base = Double.parseDouble(args[0]);
Double n = Double.parseDouble(args[1]);
- Double result = calculator.calculate(base, n);
+ Double result = calculator.calculateWithRound(base, n);
System.out.println("The " + n + " root of " + base + " equals to " + result + ".");
}
}
diff --git a/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
index ab962fc150..35970536ed 100644
--- a/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
+++ b/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java
@@ -1,19 +1,22 @@
package com.baeldung.nth.root.calculator;
-import static org.junit.Assert.assertEquals;
-
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.junit.MockitoJUnitRunner;
+
+import static org.junit.Assert.assertEquals;
public class NthRootCalculatorUnitTest {
private NthRootCalculator nthRootCalculator = new NthRootCalculator();
@Test
- public void whenBaseIs125AndNIs3_thenNthRootIs5() {
- Double result = nthRootCalculator.calculate(125.0, 3.0);
- assertEquals(result, (Double) 5.0d);
+ public void whenBaseIs125AndNIs3_thenNthIs5() {
+ double nth = nthRootCalculator.calculateWithRound(125,3);
+ assertEquals(5, nth, 0);
+ }
+
+ @Test
+ public void whenBaseIs625AndNIs4_thenNthIs5() {
+ double nth = nthRootCalculator.calculate(625,4);
+ assertEquals(5, nth, 0.00001);
}
}
diff --git a/java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java
deleted file mode 100644
index a2fd839ba4..0000000000
--- a/java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.baeldung.nth.root.main;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.InjectMocks;
-import static org.junit.Assert.assertEquals;
-
-public class MainUnitTest {
- @InjectMocks
- private Main main;
-
- private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
- private final PrintStream originalOut = System.out;
-
- @Before
- public void setUpStreams() {
- System.setOut(new PrintStream(outContent));
- }
-
- @After
- public void restoreStreams() {
- System.setOut(originalOut);
- }
-
- @Test
- public void givenThatTheBaseIs125_andTheExpIs3_whenMainIsCalled_thenTheCorrectResultIsPrinted() {
- main.main(new String[]{"125.0", "3.0"});
- assertEquals("The 3.0 root of 125.0 equals to 5.0.\n", outContent.toString().replaceAll("\r", ""));
- }
-}
diff --git a/java-rmi/README.md b/java-rmi/README.md
index 4d12060395..244f986639 100644
--- a/java-rmi/README.md
+++ b/java-rmi/README.md
@@ -1,3 +1,7 @@
+## Java RMI
+
+This module contains articles about RMI (Remote Method Invocation) in Java.
+
### Relevant articles
-- [Getting Started with Java RMI](http://www.baeldung.com/java-rmi)
+- [Getting Started with Java RMI](https://www.baeldung.com/java-rmi)
diff --git a/java-spi/README.md b/java-spi/README.md
index d2658c42fe..2ccef98a10 100644
--- a/java-spi/README.md
+++ b/java-spi/README.md
@@ -1,4 +1,7 @@
+## Java SPI
+
+This module contains articles about the SPI (Service Provider Interface) in Java.
### Relevant Articles:
-- [Java Service Provider Interface](http://www.baeldung.com/java-spi)
+- [Java Service Provider Interface](https://www.baeldung.com/java-spi)
diff --git a/java-streams-2/README.md b/java-streams-2/README.md
index 851d3d71e2..66fbe69ed4 100644
--- a/java-streams-2/README.md
+++ b/java-streams-2/README.md
@@ -1,4 +1,9 @@
+## Java Streams Cookbooks and Examples
+
+This module contains articles about the Stream API in Java.
+
### Relevant Articles:
- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce)
- [How to Break from Java Stream forEach](https://www.baeldung.com/java-break-stream-foreach)
- [Java IntStream Conversions](https://www.baeldung.com/java-intstream-convert)
+- More articles: [[<-- prev]](/java-streams)
diff --git a/java-streams-2/pom.xml b/java-streams-2/pom.xml
index f7a0379ac5..4cebd44427 100644
--- a/java-streams-2/pom.xml
+++ b/java-streams-2/pom.xml
@@ -2,9 +2,9 @@
4.0.0
com.baeldung.javastreams2
- javastreams2
+ java-streams-2
1.0
- javastreams2
+ java-streams-2
jar
diff --git a/java-streams/README.md b/java-streams/README.md
index 0c9588c47e..a57fdec7fa 100644
--- a/java-streams/README.md
+++ b/java-streams/README.md
@@ -1,20 +1,21 @@
-=========
-
## Java Streams Cookbooks and Examples
+This module contains articles about the Stream API in Java.
+
### Relevant Articles:
-- [The Java 8 Stream API Tutorial](http://www.baeldung.com/java-8-streams)
-- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction)
-- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams)
-- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany)
-- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element)
-- [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
-- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream)
-- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices)
-- [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams)
+- [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams)
+- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction)
+- [Java 8 and Infinite Streams](https://www.baeldung.com/java-inifinite-streams)
+- [Java 8 Stream findFirst() vs. findAny()](https://www.baeldung.com/java-stream-findfirst-vs-findany)
+- [How to Get the Last Element of a Stream in Java?](https://www.baeldung.com/java-stream-last-element)
+- [“Stream has already been operated upon or closed” Exception in Java](https://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
+- [Iterable to Stream in Java](https://www.baeldung.com/java-iterable-to-stream)
+- [How to Iterate Over a Stream With Indices](https://www.baeldung.com/java-stream-indices)
+- [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams)
- [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering)
- [Introduction to Protonpack](https://www.baeldung.com/java-protonpack)
- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda)
- [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count)
- [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api)
- [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams)
+- More articles: [[next -->]](/java-streams-2)
diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
similarity index 97%
rename from java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
index 8c2e0628fa..5f52fe375e 100644
--- a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java
+++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.java8.streams;
import org.junit.Test;
diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
similarity index 99%
rename from java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
index 5005cf7f47..75cfbc049f 100644
--- a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java
+++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8;
+package com.baeldung.java8.streams;
import com.baeldung.stream.Product;
import org.junit.Before;
diff --git a/java-strings-2/README.MD b/java-strings-2/README.MD
deleted file mode 100644
index c6d4f0222a..0000000000
--- a/java-strings-2/README.MD
+++ /dev/null
@@ -1,7 +0,0 @@
-## Relevant Articles
-
-- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
-- [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring)
-- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
-- [Blank and Empty Strings in Java](https://www.baeldung.com/java-blank-empty-strings)
-- [String Initialization in Java](https://www.baeldung.com/java-string-initialization)
diff --git a/java-strings-2/README.md b/java-strings-2/README.md
new file mode 100644
index 0000000000..ced813163d
--- /dev/null
+++ b/java-strings-2/README.md
@@ -0,0 +1,27 @@
+## Java Strings Cookbooks and Examples
+
+This module contains articles about strings in Java.
+
+### Relevant Articles:
+
+- [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting)
+- [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring)
+- [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords)
+- [Java – Generate Random String](https://www.baeldung.com/java-random-string)
+- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
+- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
+- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array)
+- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string)
+- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
+- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
+- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
+- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
+- [Check if a String is a Pangram in Java](https://www.baeldung.com/java-string-pangram)
+- [Check If a String Contains Multiple Keywords](https://www.baeldung.com/string-contains-multiple-words)
+- [Checking for Empty or Blank Strings in Java](https://www.baeldung.com/java-blank-empty-strings)
+- [String Initialization in Java](https://www.baeldung.com/java-string-initialization)
+- [Java Multi-line String](https://www.baeldung.com/java-multiline-string)
+- [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring)
+- [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string)
+- [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case)
+- More articles: [[<-- prev>]](/java-strings) [[next -->]](/java-strings-3)
diff --git a/java-strings-2/pom.xml b/java-strings-2/pom.xml
index 7342953d15..be47b1ec89 100755
--- a/java-strings-2/pom.xml
+++ b/java-strings-2/pom.xml
@@ -40,6 +40,16 @@
commons-lang3
${commons-lang3.version}
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
junit
junit
@@ -52,32 +62,54 @@
${org.hamcrest.version}
test
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ org.passay
+ passay
+ ${passay.version}
+
org.apache.commons
commons-text
${commons-text.version}
+
+ com.vdurmont
+ emoji-java
+ ${emoji-java.version}
+
+
+ org.ahocorasick
+ ahocorasick
+ ${ahocorasick.version}
+
javax.validation
validation-api
- 2.0.0.Final
+ ${validation-api.version}
org.hibernate.validator
hibernate-validator
- 6.0.2.Final
+ ${hibernate-validator.version}
javax.el
javax.el-api
- 3.0.0
+ ${javax.el-api.version}
org.glassfish.web
javax.el
- 2.2.6
+ ${javax.el.version}
-
@@ -105,9 +137,19 @@
3.8.1
+ 1.10
+ 1.3.1
+
+ 3.6.1
+ 4.0.0
+ 0.4.0
61.1
28.0-jre
1.4
+ 2.0.0.Final
+ 6.0.2.Final
+ 3.0.0
+ 2.2.6
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/MatchWords.java b/java-strings-2/src/main/java/com/baeldung/string/MatchWords.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/string/MatchWords.java
rename to java-strings-2/src/main/java/com/baeldung/string/MatchWords.java
diff --git a/java-strings/src/main/java/com/baeldung/string/Pangram.java b/java-strings-2/src/main/java/com/baeldung/string/Pangram.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/string/Pangram.java
rename to java-strings-2/src/main/java/com/baeldung/string/Pangram.java
diff --git a/java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java b/java-strings-2/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
rename to java-strings-2/src/main/java/com/baeldung/string/padding/StringPaddingUtil.java
diff --git a/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java b/java-strings-2/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java
rename to java-strings-2/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java
diff --git a/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java b/java-strings-2/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
rename to java-strings-2/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java
diff --git a/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java b/java-strings-2/src/test/java/com/baeldung/StringConcatenationUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/StringConcatenationUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java
index 7889e6ad53..a0fc845d52 100644
--- a/java-strings/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java
+++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8.base64;
+package com.baeldung.base64encodinganddecoding;
import org.apache.commons.codec.binary.Base64;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
index 62cfa4c0a1..191a3628e8 100644
--- a/java-strings/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java
+++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8.base64;
+package com.baeldung.base64encodinganddecoding;
import org.junit.Test;
diff --git a/java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java
similarity index 97%
rename from java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java
index c5f7051c25..e2bb7bb64d 100644
--- a/java-strings/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java
+++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java8.base64;
+package com.baeldung.base64encodinganddecoding;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
diff --git a/java-strings/src/test/java/com/baeldung/string/MatchWordsUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/MatchWordsUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/MatchWordsUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/MatchWordsUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/PangramUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/PangramUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/PangramUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/RemovingEmojiFromStringUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java
diff --git a/java-strings-2/src/test/java/com/baeldung/string/changecase/ToLowerCaseUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/changecase/ToLowerCaseUnitTest.java
new file mode 100644
index 0000000000..c395b61068
--- /dev/null
+++ b/java-strings-2/src/test/java/com/baeldung/string/changecase/ToLowerCaseUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.string.changecase;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class ToLowerCaseUnitTest {
+
+ private static final Locale TURKISH = new Locale("tr");
+ private String name = "John Doe";
+ private String foreignUppercase = "\u0049";
+
+ @Test
+ public void givenMixedCaseString_WhenToLowerCase_ThenResultIsLowerCase() {
+ assertEquals("john doe", name.toLowerCase());
+ }
+
+ @Test
+ public void givenForeignString_WhenToLowerCaseWithoutLocale_ThenResultIsLowerCase() {
+ assertEquals("\u0069", foreignUppercase.toLowerCase());
+ }
+
+ @Test
+ public void givenForeignString_WhenToLowerCaseWithLocale_ThenResultIsLowerCase() {
+ assertEquals("\u0131", foreignUppercase.toLowerCase(TURKISH));
+ }
+}
diff --git a/java-strings-2/src/test/java/com/baeldung/string/changecase/ToUpperCaseUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/changecase/ToUpperCaseUnitTest.java
new file mode 100644
index 0000000000..1807f854b2
--- /dev/null
+++ b/java-strings-2/src/test/java/com/baeldung/string/changecase/ToUpperCaseUnitTest.java
@@ -0,0 +1,29 @@
+package com.baeldung.string.changecase;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Locale;
+
+import org.junit.Test;
+
+public class ToUpperCaseUnitTest {
+
+ private static final Locale TURKISH = new Locale("tr");
+ private String name = "John Doe";
+ private String foreignLowercase = "\u0069";
+
+ @Test
+ public void givenMixedCaseString_WhenToUpperCase_ThenResultIsUpperCase() {
+ assertEquals("JOHN DOE", name.toUpperCase());
+ }
+
+ @Test
+ public void givenForeignString_WhenToUpperCaseWithoutLocale_ThenResultIsUpperCase() {
+ assertEquals("\u0049", foreignLowercase.toUpperCase());
+ }
+
+ @Test
+ public void givenForeignString_WhenToUpperCaseWithLocale_ThenResultIsUpperCase() {
+ assertEquals("\u0130", foreignLowercase.toUpperCase(TURKISH));
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/LocaleUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringAnagramUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringChangeCaseUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringCountOccurrencesUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringFormatUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringInternUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringJoinerUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringPalindromeUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringReverseUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringSplitUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringToByteArrayUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringToCharArrayUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/interview/StringToIntegerUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/padding/StringPaddingUtilUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java b/java-strings-2/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
rename to java-strings-2/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java
diff --git a/java-strings-3/README.md b/java-strings-3/README.md
new file mode 100644
index 0000000000..6276dfc621
--- /dev/null
+++ b/java-strings-3/README.md
@@ -0,0 +1,9 @@
+## Java Strings Cookbooks and Examples
+
+This module contains articles about strings in Java.
+
+### Relevant Articles:
+- [Java String equalsIgnoreCase()](https://www.baeldung.com/java-string-equalsignorecase)
+- [Finding the Difference Between Two Strings](https://www.baeldung.com/java-difference-between-two-strings)
+- [Counting Words in a String](https://www.baeldung.com/java-word-counting)
+- More articles: [[<-- prev>]](/java-strings-2)
diff --git a/java-strings-3/pom.xml b/java-strings-3/pom.xml
new file mode 100644
index 0000000000..4589780c15
--- /dev/null
+++ b/java-strings-3/pom.xml
@@ -0,0 +1,161 @@
+
+ 4.0.0
+ java-strings-3
+ 0.1.0-SNAPSHOT
+ jar
+ java-strings-3
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-core.version}
+
+
+ com.ibm.icu
+ icu4j
+ ${icu4j.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+ commons-codec
+ commons-codec
+ ${commons-codec.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.bitbucket.cowwoc
+ diff-match-patch
+ 1.2
+ test
+
+
+
+
+ org.passay
+ passay
+ ${passay.version}
+
+
+ org.apache.commons
+ commons-text
+ ${commons-text.version}
+
+
+ com.vdurmont
+ emoji-java
+ ${emoji-java.version}
+
+
+ org.ahocorasick
+ ahocorasick
+ ${ahocorasick.version}
+
+
+ javax.validation
+ validation-api
+ ${validation-api.version}
+
+
+ org.hibernate.validator
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+ javax.el
+ javax.el-api
+ ${javax.el-api.version}
+
+
+ org.glassfish.web
+ javax.el
+ ${javax.el.version}
+
+
+
+
+ java-strings-3
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+ -parameters
+
+
+
+
+
+
+ 3.8.1
+ 1.10
+ 1.3.1
+
+ 3.6.1
+ 4.0.0
+ 0.4.0
+ 61.1
+ 28.0-jre
+ 1.4
+ 2.0.0.Final
+ 6.0.2.Final
+ 3.0.0
+ 2.2.6
+
+
+
\ No newline at end of file
diff --git a/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java
new file mode 100644
index 0000000000..30275773a6
--- /dev/null
+++ b/java-strings-3/src/main/java/com/baeldung/string/wordcount/WordCounter.java
@@ -0,0 +1,49 @@
+package com.baeldung.string.wordcount;
+
+import java.util.StringTokenizer;
+
+public class WordCounter {
+ static final int WORD = 0;
+ static final int SEPARATOR = 1;
+
+ public static int countWordsUsingRegex(String arg) {
+ if (arg == null) {
+ return 0;
+ }
+ final String[] words = arg.split("[\\pP\\s&&[^']]+");
+ return words.length;
+ }
+
+ public static int countWordsUsingTokenizer(String arg) {
+ if (arg == null) {
+ return 0;
+ }
+ final StringTokenizer stringTokenizer = new StringTokenizer(arg);
+ return stringTokenizer.countTokens();
+ }
+
+ public static int countWordsManually(String arg) {
+ if (arg == null) {
+ return 0;
+ }
+ int flag = SEPARATOR;
+ int count = 0;
+ int stringLength = arg.length();
+ int characterCounter = 0;
+
+ while (characterCounter < stringLength) {
+ if (isAllowedInWord(arg.charAt(characterCounter)) && flag == SEPARATOR) {
+ flag = WORD;
+ count++;
+ } else if (!isAllowedInWord(arg.charAt(characterCounter))) {
+ flag = SEPARATOR;
+ }
+ characterCounter++;
+ }
+ return count;
+ }
+
+ private static boolean isAllowedInWord(char charAt) {
+ return charAt == '\'' || Character.isLetter(charAt);
+ }
+}
diff --git a/java-dates/src/test/resources/.gitignore b/java-strings-3/src/main/resources/.gitignore
similarity index 100%
rename from java-dates/src/test/resources/.gitignore
rename to java-strings-3/src/main/resources/.gitignore
diff --git a/java-strings-3/src/test/java/com/baeldung/string/equalsIgnoreCase/StringEqualsIgnoreCaseUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/equalsIgnoreCase/StringEqualsIgnoreCaseUnitTest.java
new file mode 100644
index 0000000000..5aab63db94
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/string/equalsIgnoreCase/StringEqualsIgnoreCaseUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.string.equalsIgnoreCase;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringEqualsIgnoreCaseUnitTest {
+ private String string1 = "equals ignore case";
+ private String string2 = "EQUALS IGNORE CASE";
+
+ @Test
+ public void givenEqualStringsWithDifferentCase_whenUsingEqualsIgnoreCase_ThenTheyAreEqual() {
+ assertThat(string1.equalsIgnoreCase(string2)).isTrue();
+ }
+
+ @Test
+ public void givenEqualStringsWithDifferentCase_whenUsingApacheCommonsEqualsIgnoreCase_ThenTheyAreEqual() {
+ assertThat(StringUtils.equalsIgnoreCase(string1, string2)).isTrue();
+ }
+
+ @Test
+ public void givenAStringAndNullValue_whenUsingApacheCommonsEqualsIgnoreCase_ThenTheyAreNotEqual() {
+ assertThat(StringUtils.equalsIgnoreCase(string1, null)).isFalse();
+ }
+}
diff --git a/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java
new file mode 100644
index 0000000000..fdd045978f
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/string/wordcount/WordCountUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.string.wordcount;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+import java.util.StringTokenizer;
+
+public class WordCountUnitTest {
+ private String string1 = "This is a test sentence with eight words";
+ private String string2 = "This#is%a test sentence with eight words";
+
+ @Test
+ public void givenStringWith8Words_whenUsingRegexCount_ThenResultEqual8() {
+ assertEquals(8, WordCounter.countWordsUsingRegex(string2));
+ assertEquals(9, WordCounter.countWordsUsingRegex("no&one#should%ever-write-like,this;but:well"));
+ assertEquals(7, WordCounter.countWordsUsingRegex("the farmer's wife--she was from Albuquerque"));
+ }
+
+ @Test
+ public void givenStringWith8Words_whenUsingManualMethod_ThenWordCountEqual8() {
+ assertEquals(8, WordCounter.countWordsManually(string1));
+ assertEquals(9, WordCounter.countWordsManually("no&one#should%ever-write-like,this but well"));
+ assertEquals(7, WordCounter.countWordsManually("the farmer's wife--she was from Albuquerque"));
+ }
+
+ @Test
+ public void givenAStringWith8Words_whenUsingTokenizer_ThenWordCountEqual8() {
+ assertEquals(8, WordCounter.countWordsUsingTokenizer(string1));
+ assertEquals(3, new StringTokenizer("three blind mice").countTokens());
+ assertEquals(4, new StringTokenizer("see\thow\tthey\trun").countTokens());
+ assertEquals(7, new StringTokenizer("the farmer's wife--she was from Albuquerque", " -").countTokens());
+ assertEquals(10, new StringTokenizer("did,you,ever,see,such,a,sight,in,your,life", ",").countTokens());
+ }
+}
diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java
new file mode 100644
index 0000000000..20e87a1f4e
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java
@@ -0,0 +1,73 @@
+package com.baeldung.stringdiff;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch;
+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 org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@State(Scope.Benchmark)
+public class StringDiffBenchmarkUnitTest {
+
+ private DiffMatchPatch diffMatchPatch = new DiffMatchPatch();
+
+ private List inputs = randomizeInputs(10000);
+
+ public static void main(String[] args) throws RunnerException {
+ Options opts = new OptionsBuilder().include(".*")
+ .warmupIterations(1)
+ .measurementIterations(50)
+ .jvmArgs("-Xms2g", "-Xmx2g")
+ .shouldDoGC(true)
+ .forks(1)
+ .build();
+
+ new Runner(opts).run();
+ }
+
+ @Benchmark
+ public int diffMatchPatch() {
+ for (int i = 0; i < inputs.size() - 1; i++) {
+ diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false);
+ }
+ return inputs.size();
+ }
+
+ @Benchmark
+ public int stringUtils() {
+ for (int i = 0; i < inputs.size() - 1; i++) {
+ StringUtils.difference(inputs.get(i), inputs.get(i + 1));
+ }
+ return inputs.size();
+ }
+
+ /**
+ * Creates a list of a given size, containing 30 character long strings,
+ * each starting with a static prefix of 10 characters and followed by
+ * a random 20 character suffix
+ *
+ * @return a {@link List} of randomised strings
+ */
+ private List randomizeInputs(int size) {
+ String staticPart = "ABCDEF1234";
+ List inputs = new ArrayList<>();
+ for (int i = 0; i < size; i++) {
+ inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20));
+ }
+ return inputs;
+ }
+}
diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java
new file mode 100644
index 0000000000..94b7deb64d
--- /dev/null
+++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.stringdiff;
+
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.commons.lang3.StringUtils;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch;
+import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Operation;
+import org.junit.Test;
+
+public class StringDiffUnitTest {
+
+ private DiffMatchPatch diffMatchPatch = new DiffMatchPatch();
+
+ // Test samples
+ private final String text1 = "ABCDELMN";
+ private final String text2 = "ABCFGLMN";
+
+ @Test
+ public void givenTwoStrings_whenDiffMatchPatch_thenReturnCorrectDiff() {
+ assertThat(diffMatchPatch.diffMain(text1, text2, false), containsInAnyOrder(
+ new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"),
+ new DiffMatchPatch.Diff(Operation.DELETE, "DE"),
+ new DiffMatchPatch.Diff(Operation.INSERT, "FG"),
+ new DiffMatchPatch.Diff(Operation.EQUAL, "LMN")));
+ assertThat(diffMatchPatch.diffMain(text2, text1, false), containsInAnyOrder(
+ new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"),
+ new DiffMatchPatch.Diff(Operation.INSERT, "DE"),
+ new DiffMatchPatch.Diff(Operation.DELETE, "FG"),
+ new DiffMatchPatch.Diff(Operation.EQUAL, "LMN")));
+ }
+
+ @Test
+ public void givenTwoStrings_whenStringUtilsDifference_thenReturnCorrectDiff() {
+ assertThat(StringUtils.difference(text1, text2), is("FGLMN"));
+ assertThat(StringUtils.difference(text2, text1), is("DELMN"));
+ }
+}
diff --git a/spring-all/.gitignore b/java-strings-3/src/test/resources/.gitignore
similarity index 100%
rename from spring-all/.gitignore
rename to java-strings-3/src/test/resources/.gitignore
diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md
new file mode 100644
index 0000000000..1300cf028e
--- /dev/null
+++ b/java-strings-ops/README.md
@@ -0,0 +1,16 @@
+## Java Strings Cookbooks and Examples
+
+This module contains articles about operations on strings in Java.
+
+### Relevant Articles:
+- [Check If a String Is a Palindrome](https://www.baeldung.com/java-palindrome)
+- [Comparing Strings in Java](https://www.baeldung.com/java-compare-strings)
+- [Check If a String Is Numeric in Java](https://www.baeldung.com/java-check-string-number)
+- [Get Substring from String in Java](https://www.baeldung.com/java-substring)
+- [How to Remove the Last Character of a String?](https://www.baeldung.com/java-remove-last-character-of-string)
+- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
+- [Count Occurrences of a Char in a String](https://www.baeldung.com/java-count-chars)
+- [Guide to Java String Pool](https://www.baeldung.com/java-string-pool)
+- [Split a String in Java](https://www.baeldung.com/java-split-string)
+- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
+- [Java toString() Method](https://www.baeldung.com/java-tostring)
diff --git a/java-strings-ops/pom.xml b/java-strings-ops/pom.xml
new file mode 100644
index 0000000000..b6a7ea2728
--- /dev/null
+++ b/java-strings-ops/pom.xml
@@ -0,0 +1,99 @@
+
+ 4.0.0
+ com.baeldung
+ java-strings-ops
+ 0.1.0-SNAPSHOT
+ jar
+ java-strings-ops
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter-api.version}
+ test
+
+
+
+ org.hamcrest
+ hamcrest-library
+ ${org.hamcrest.version}
+ test
+
+
+
+
+
+ java-strings-ops
+
+
+ src/main/resources
+ true
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${java.version}
+ ${java.version}
+ -parameters
+
+
+
+
+
+
+
+ 3.8.1
+
+ 3.6.1
+ 27.0.1-jre
+ 5.3.1
+
+
+
diff --git a/java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java b/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
similarity index 91%
rename from java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
rename to java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
index bebffe52f1..ad203ab348 100644
--- a/java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/AppendCharAtPositionX.java
@@ -8,7 +8,7 @@ package com.baeldung.string;
*
*/
public class AppendCharAtPositionX {
-
+
public String addCharUsingCharArray(String str, char ch, int position) {
validate(str, position);
int len = str.length();
@@ -30,15 +30,14 @@ public class AppendCharAtPositionX {
sb.insert(position, ch);
return sb.toString();
}
-
+
private void validate(String str, int position) {
if (str == null) {
throw new IllegalArgumentException("Str should not be null");
}
int len = str.length();
if (position < 0 || position > len) {
- throw new IllegalArgumentException("position[" + position + "] should be "
- + "in the range 0.." + len + " for string " + str);
+ throw new IllegalArgumentException("position[" + position + "] should be " + "in the range 0.." + len + " for string " + str);
}
}
diff --git a/java-strings/src/main/java/com/baeldung/string/Palindrome.java b/java-strings-ops/src/main/java/com/baeldung/string/Palindrome.java
similarity index 100%
rename from java-strings/src/main/java/com/baeldung/string/Palindrome.java
rename to java-strings-ops/src/main/java/com/baeldung/string/Palindrome.java
diff --git a/java-strings/src/main/java/com/baeldung/string/StringHelper.java b/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
similarity index 62%
rename from java-strings/src/main/java/com/baeldung/string/StringHelper.java
rename to java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
index a9cc71d36a..dac0d1272e 100644
--- a/java-strings/src/main/java/com/baeldung/string/StringHelper.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/StringHelper.java
@@ -12,10 +12,15 @@ class StringHelper {
}
static String removeLastCharOptional(String s) {
- return Optional.ofNullable(s).filter(str -> str.length() != 0).map(str -> str.substring(0, str.length() - 1)).orElse(s);
+ return Optional.ofNullable(s)
+ .filter(str -> str.length() != 0)
+ .map(str -> str.substring(0, str.length() - 1))
+ .orElse(s);
}
static String removeLastCharRegexOptional(String s) {
- return Optional.ofNullable(s).map(str -> str.replaceAll(".$", "")).orElse(s);
+ return Optional.ofNullable(s)
+ .map(str -> str.replaceAll(".$", ""))
+ .orElse(s);
}
}
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
similarity index 85%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
index 4ae1f5aa83..c4e2742da6 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/Benchmarking.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/Benchmarking.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import java.util.concurrent.TimeUnit;
@@ -13,13 +13,11 @@ import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
-
public class Benchmarking {
public static void main(String[] args) throws RunnerException {
- Options opt = new OptionsBuilder()
- .include(Benchmarking.class.getSimpleName())
- .forks(1)
- .build();
+ Options opt = new OptionsBuilder().include(Benchmarking.class.getSimpleName())
+ .forks(1)
+ .build();
new Runner(opt).run();
}
@@ -28,45 +26,45 @@ public class Benchmarking {
public static class ExecutionPlan {
public String number = Integer.toString(Integer.MAX_VALUE);
public boolean isNumber = false;
- public IsNumeric isNumeric= new IsNumeric();
+ public IsNumeric isNumeric = new IsNumeric();
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingCoreJava(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingCoreJava(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingRegularExpressions(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingRegularExpressions(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingNumberUtils_isCreatable(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingNumberUtils_isCreatable(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingNumberUtils_isParsable(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingNumberUtils_isParsable(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingStringUtils_isNumeric(ExecutionPlan plan) {
plan.isNumber = plan.isNumeric.usingStringUtils_isNumeric(plan.number);
}
-
- @Benchmark
+
+ @Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public void usingStringUtils_isNumericSpace(ExecutionPlan plan) {
diff --git a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
similarity index 89%
rename from java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
index 9462244bbb..2785df0c9b 100644
--- a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/CheckIntegerInput.java
@@ -1,14 +1,13 @@
-package com.baeldung.string.checkinputs;
+package com.baeldung.string.isnumeric;
import java.util.Scanner;
public class CheckIntegerInput {
public static void main(String[] args) {
-
try (Scanner scanner = new Scanner(System.in)) {
System.out.println("Enter an integer : ");
-
+
if (scanner.hasNextInt()) {
System.out.println("You entered : " + scanner.nextInt());
} else {
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
similarity index 88%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
index c438071e42..508cedd168 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumeric.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumeric.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
@@ -6,29 +6,29 @@ import org.apache.commons.lang3.math.NumberUtils;
public class IsNumeric {
public boolean usingCoreJava(String strNum) {
try {
- double d = Double.parseDouble(strNum);
+ Double.parseDouble(strNum);
} catch (NumberFormatException | NullPointerException nfe) {
return false;
}
return true;
}
-
+
public boolean usingRegularExpressions(String strNum) {
return strNum.matches("-?\\d+(\\.\\d+)?");
}
-
+
public boolean usingNumberUtils_isCreatable(String strNum) {
return NumberUtils.isCreatable(strNum);
}
-
+
public boolean usingNumberUtils_isParsable(String strNum) {
return NumberUtils.isParsable(strNum);
}
-
+
public boolean usingStringUtils_isNumeric(String strNum) {
return StringUtils.isNumeric(strNum);
}
-
+
public boolean usingStringUtils_isNumericSpace(String strNum) {
return StringUtils.isNumericSpace(strNum);
}
diff --git a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
similarity index 60%
rename from java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java
rename to java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
index c0a6edae50..bb3c96c06e 100644
--- a/java-strings/src/main/java/com/baeldung/stringisnumeric/IsNumericDriver.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/isnumeric/IsNumericDriver.java
@@ -1,34 +1,31 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import org.apache.log4j.Logger;
public class IsNumericDriver {
- private static IsNumeric isNumeric;
private static Logger LOG = Logger.getLogger(IsNumericDriver.class);
- static {
- isNumeric =new IsNumeric();
-
- }
-
+
+ private static IsNumeric isNumeric = new IsNumeric();
+
public static void main(String[] args) {
LOG.info("Testing all methods...");
-
+
boolean res = isNumeric.usingCoreJava("1001");
LOG.info("Using Core Java : " + res);
-
+
res = isNumeric.usingRegularExpressions("1001");
LOG.info("Using Regular Expressions : " + res);
-
- res =isNumeric.usingNumberUtils_isCreatable("1001");
+
+ res = isNumeric.usingNumberUtils_isCreatable("1001");
LOG.info("Using NumberUtils.isCreatable : " + res);
-
- res =isNumeric.usingNumberUtils_isParsable("1001");
+
+ res = isNumeric.usingNumberUtils_isParsable("1001");
LOG.info("Using NumberUtils.isParsable : " + res);
-
- res =isNumeric.usingStringUtils_isNumeric("1001");
+
+ res = isNumeric.usingStringUtils_isNumeric("1001");
LOG.info("Using StringUtils.isNumeric : " + res);
-
- res =isNumeric.usingStringUtils_isNumericSpace("1001");
+
+ res = isNumeric.usingStringUtils_isNumericSpace("1001");
LOG.info("Using StringUtils.isNumericSpace : " + res);
}
}
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/Customer.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
similarity index 71%
rename from java-strings/src/main/java/com/baeldung/string/tostring/Customer.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
index e914a83f0e..7ab3936cb9 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/Customer.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Customer.java
@@ -3,17 +3,20 @@ package com.baeldung.string.tostring;
public class Customer {
private String firstName;
private String lastName;
-
+
public String getFirstName() {
- return firstName;
+ return firstName;
}
+
public void setFirstName(String firstName) {
- this.firstName = firstName;
+ this.firstName = firstName;
}
+
public String getLastName() {
- return lastName;
+ return lastName;
}
+
public void setLastName(String lastName) {
- this.lastName = lastName;
+ this.lastName = lastName;
}
}
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
similarity index 68%
rename from java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
index 1736657276..391ced61d3 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerArrayToString.java
@@ -4,16 +4,17 @@ import java.util.Arrays;
public class CustomerArrayToString extends Customer {
private Order[] orders;
-
+
public Order[] getOrders() {
return orders;
}
+
public void setOrders(Order[] orders) {
this.orders = orders;
}
+
@Override
public String toString() {
- return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
- }
+ return "Customer [orders=" + Arrays.toString(orders) + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ }
}
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
similarity index 69%
rename from java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
index 9bede1b3fc..ae3d999b12 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerComplexObjectToString.java
@@ -2,7 +2,7 @@ package com.baeldung.string.tostring;
public class CustomerComplexObjectToString extends Customer {
private Order order;
-
+
public Order getOrder() {
return order;
}
@@ -13,7 +13,6 @@ public class CustomerComplexObjectToString extends Customer {
@Override
public String toString() {
- return "Customer [order=" + order + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
- }
+ return "Customer [order=" + order + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ }
}
\ No newline at end of file
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
similarity index 69%
rename from java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
index 86e08ca447..01fe4c8b09 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerPrimitiveToString.java
@@ -2,18 +2,17 @@ package com.baeldung.string.tostring;
public class CustomerPrimitiveToString extends Customer {
private long balance;
-
+
public long getBalance() {
return balance;
}
-
+
public void setBalance(long balance) {
this.balance = balance;
}
-
+
@Override
public String toString() {
- return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName()
- + ", getLastName()=" + getLastName() + "]";
+ return "Customer [balance=" + balance + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
}
}
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
similarity index 89%
rename from java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
index 2da1163c63..2a9e3700ec 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerReflectionToString.java
@@ -4,36 +4,36 @@ import java.util.List;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-public class CustomerReflectionToString extends Customer{
+public class CustomerReflectionToString extends Customer {
private Integer score;
private List orders;
private StringBuffer fullname;
-
+
public Integer getScore() {
return score;
}
-
+
public void setScore(Integer score) {
this.score = score;
}
-
+
public List getOrders() {
return orders;
}
-
+
public void setOrders(List orders) {
this.orders = orders;
}
-
+
public StringBuffer getFullname() {
return fullname;
}
-
+
public void setFullname(StringBuffer fullname) {
this.fullname = fullname;
}
-
+
@Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
similarity index 78%
rename from java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
index 6c7b999045..b3ff97dc07 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/CustomerWrapperCollectionToString.java
@@ -6,34 +6,33 @@ public class CustomerWrapperCollectionToString extends Customer {
private Integer score;
private List orders;
private StringBuffer fullname;
-
+
public Integer getScore() {
return score;
}
-
+
public void setScore(Integer score) {
this.score = score;
}
-
+
public List getOrders() {
return orders;
}
-
+
public void setOrders(List orders) {
this.orders = orders;
}
-
+
public StringBuffer getFullname() {
return fullname;
}
-
+
public void setFullname(StringBuffer fullname) {
this.fullname = fullname;
}
-
+
@Override
public String toString() {
- return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname
- + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
+ return "Customer [score=" + score + ", orders=" + orders + ", fullname=" + fullname + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName() + "]";
}
}
diff --git a/java-strings/src/main/java/com/baeldung/string/tostring/Order.java b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
similarity index 96%
rename from java-strings/src/main/java/com/baeldung/string/tostring/Order.java
rename to java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
index 017e2d9bc8..58e0fcce5a 100644
--- a/java-strings/src/main/java/com/baeldung/string/tostring/Order.java
+++ b/java-strings-ops/src/main/java/com/baeldung/string/tostring/Order.java
@@ -1,7 +1,7 @@
package com.baeldung.string.tostring;
public class Order {
-
+
private String orderId;
private String desc;
private long value;
@@ -38,9 +38,10 @@ public class Order {
public void setStatus(String status) {
this.status = status;
}
+
@Override
public String toString() {
- return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
+ return "Order [orderId=" + orderId + ", desc=" + desc + ", value=" + value + "]";
}
}
diff --git a/java-strings-ops/src/main/resources/log4j.properties b/java-strings-ops/src/main/resources/log4j.properties
new file mode 100644
index 0000000000..2ea9fa9209
--- /dev/null
+++ b/java-strings-ops/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+# Root logger option
+log4j.rootLogger=DEBUG, stdout
+
+# Redirect log messages 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/spring-cloud-data-flow/data-flow-shell/src/main/resources/logback.xml b/java-strings-ops/src/main/resources/logback.xml
similarity index 100%
rename from spring-cloud-data-flow/data-flow-shell/src/main/resources/logback.xml
rename to java-strings-ops/src/main/resources/logback.xml
diff --git a/java-strings/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
similarity index 89%
rename from java-strings/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
index e2dd0ac1db..d58684445b 100644
--- a/java-strings/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/java/countingChars/CountCharsExampleUnitTest.java
@@ -10,7 +10,6 @@ import org.junit.Test;
import com.google.common.base.CharMatcher;
-
/***
* Example of counting chars in a String.
*/
@@ -78,16 +77,21 @@ public class CountCharsExampleUnitTest {
@Test
public void givenString_whenUsingJava8Features_thenCountChars() {
String someString = "elephant";
- long count = someString.chars().filter(ch -> ch == 'e').count();
+ long count = someString.chars()
+ .filter(ch -> ch == 'e')
+ .count();
assertEquals(2, count);
- long count2 = someString.codePoints().filter(ch -> ch == 'e').count();
+ long count2 = someString.codePoints()
+ .filter(ch -> ch == 'e')
+ .count();
assertEquals(2, count2);
}
@Test
public void givenString_whenUsingGuavaCharMatcher_thenCountChars() {
- int count = CharMatcher.is('e').countIn("elephant");
+ int count = CharMatcher.is('e')
+ .countIn("elephant");
assertEquals(2, count);
}
diff --git a/java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
similarity index 86%
rename from java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
index 2cdf6145d3..7c5409fe29 100644
--- a/java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java
@@ -12,99 +12,99 @@ import org.junit.Test;
*
*/
public class AppendCharAtPositionXUnitTest {
-
+
private AppendCharAtPositionX appendCharAtPosition = new AppendCharAtPositionX();
private String word = "Titanc";
private char letter = 'i';
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingCharArray(word, letter, 0));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingSubstring(word, letter, 0));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtBeginning_shouldAddCharacter() {
assertEquals("iTitanc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 0));
}
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingCharArray(word, letter, 3));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingSubstring(word, letter, 3));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtMiddle_shouldAddCharacter() {
assertEquals("Titianc", appendCharAtPosition.addCharUsingStringBuilder(word, letter, 3));
}
-
+
@Test
public void whenUsingCharacterArrayAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingCharArray(word, letter, word.length()));
}
-
+
@Test
public void whenUsingSubstringAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingSubstring(word, letter, word.length()));
- }
-
+ }
+
@Test
public void whenUsingStringBuilderAndCharacterAddedAtEnd_shouldAddCharacter() {
assertEquals("Titanci", appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length()));
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtNegativePosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, -1);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtInvalidPosition_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(word, letter, word.length() + 2);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingCharacterArrayAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
}
-
- @Test(expected=IllegalArgumentException.class)
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingSubstringAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
- }
-
- @Test(expected=IllegalArgumentException.class)
+ }
+
+ @Test(expected = IllegalArgumentException.class)
public void whenUsingStringBuilderAndCharacterAddedAtPositionXAndStringIsNull_shouldThrowException() {
appendCharAtPosition.addCharUsingStringBuilder(null, letter, 3);
}
-
+
}
diff --git a/java-strings/src/test/java/com/baeldung/string/PalindromeUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
similarity index 98%
rename from java-strings/src/test/java/com/baeldung/string/PalindromeUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
index 49f2542f39..8dea72d8ca 100644
--- a/java-strings/src/test/java/com/baeldung/string/PalindromeUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/PalindromeUnitTest.java
@@ -1,6 +1,7 @@
package com.baeldung.string;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertTrue;
+
import org.junit.Test;
public class PalindromeUnitTest {
@@ -20,9 +21,9 @@ public class PalindromeUnitTest {
"No mists or frost Simon",
"Stella won no wallets"
};
-
+
private Palindrome palindrome = new Palindrome();
-
+
@Test
public void whenWord_shouldBePalindrome() {
for (String word : words)
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java
new file mode 100644
index 0000000000..1936bfb6fb
--- /dev/null
+++ b/java-strings-ops/src/test/java/com/baeldung/string/SplitUnitTest.java
@@ -0,0 +1,65 @@
+package com.baeldung.string;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.base.Splitter;
+
+public class SplitUnitTest {
+
+ @Test
+ public void givenString_whenSplit_thenReturnsArray_through_JavaLangString() {
+ assertThat("peter,james,thomas".split(",")).containsExactly("peter", "james", "thomas");
+
+ assertThat("car jeep scooter".split(" ")).containsExactly("car", "jeep", "scooter");
+
+ assertThat("1-120-232323".split("-")).containsExactly("1", "120", "232323");
+
+ assertThat("192.168.1.178".split("\\.")).containsExactly("192", "168", "1", "178");
+
+ assertThat("b a, e, l.d u, n g".split("\\s+|,\\s*|\\.\\s*")).containsExactly("b", "a", "e", "l", "d", "u", "n", "g");
+ }
+
+ @Test
+ public void givenString_whenSplit_thenReturnsArray_through_StringUtils() {
+ StringUtils.split("car jeep scooter");
+
+ assertThat(StringUtils.split("car jeep scooter")).containsExactly("car", "jeep", "scooter");
+
+ assertThat(StringUtils.split("car jeep scooter")).containsExactly("car", "jeep", "scooter");
+
+ assertThat(StringUtils.split("car:jeep:scooter", ":")).containsExactly("car", "jeep", "scooter");
+
+ assertThat(StringUtils.split("car.jeep.scooter", ".")).containsExactly("car", "jeep", "scooter");
+ }
+
+ @Test
+ public void givenString_whenSplit_thenReturnsList_Splitter() {
+ // given
+ List resultList = Splitter.on(',')
+ .trimResults()
+ .omitEmptyStrings()
+ .splitToList("car,jeep,, scooter");
+
+ assertThat(resultList).containsExactly("car", "jeep", "scooter");
+ }
+
+ @Test
+ public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_Regex() {
+ assertThat(" car , jeep, scooter ".trim()
+ .split("\\s*,\\s*")).containsExactly("car", "jeep", "scooter");
+
+ }
+
+ @Test
+ public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_java_8() {
+ assertThat(Arrays.stream(" car , jeep, scooter ".split(","))
+ .map(String::trim)
+ .toArray(String[]::new)).containsExactly("car", "jeep", "scooter");
+ }
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/StringComparisonUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
similarity index 93%
rename from java-strings/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
index 539f66d9b4..5339a0c72e 100644
--- a/java-strings/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/StringComparisonUnitTest.java
@@ -1,16 +1,16 @@
package com.baeldung.string;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Objects;
+
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import java.util.Objects;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
public class StringComparisonUnitTest {
@Test
- public void whenUsingComparisonOperator_ThenComparingStrings(){
+ public void whenUsingComparisonOperator_ThenComparingStrings() {
String string1 = "using comparison operator";
String string2 = "using comparison operator";
@@ -21,7 +21,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsMethod_ThenComparingStrings(){
+ public void whenUsingEqualsMethod_ThenComparingStrings() {
String string1 = "using equals method";
String string2 = "using equals method";
@@ -37,7 +37,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsIgnoreCase_ThenComparingStrings(){
+ public void whenUsingEqualsIgnoreCase_ThenComparingStrings() {
String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";
@@ -46,7 +46,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareTo_ThenComparingStrings(){
+ public void whenUsingCompareTo_ThenComparingStrings() {
String author = "author";
String book = "book";
@@ -58,7 +58,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareToIgnoreCase_ThenComparingStrings(){
+ public void whenUsingCompareToIgnoreCase_ThenComparingStrings() {
String author = "Author";
String book = "book";
@@ -70,7 +70,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingObjectsEqualsMethod_ThenComparingStrings(){
+ public void whenUsingObjectsEqualsMethod_ThenComparingStrings() {
String string1 = "using objects equals";
String string2 = "using objects equals";
@@ -84,7 +84,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsOfApacheCommons_ThenComparingStrings(){
+ public void whenUsingEqualsOfApacheCommons_ThenComparingStrings() {
assertThat(StringUtils.equals(null, null)).isTrue();
assertThat(StringUtils.equals(null, "equals method")).isFalse();
@@ -93,7 +93,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsIgnoreCaseOfApacheCommons_ThenComparingStrings(){
+ public void whenUsingEqualsIgnoreCaseOfApacheCommons_ThenComparingStrings() {
assertThat(StringUtils.equalsIgnoreCase(null, null)).isTrue();
assertThat(StringUtils.equalsIgnoreCase(null, "equals method")).isFalse();
@@ -102,7 +102,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsAnyOf_ThenComparingStrings(){
+ public void whenUsingEqualsAnyOf_ThenComparingStrings() {
assertThat(StringUtils.equalsAny(null, null, null)).isTrue();
assertThat(StringUtils.equalsAny("equals any", "equals any", "any")).isTrue();
@@ -112,18 +112,17 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingEqualsAnyIgnoreCase_ThenComparingStrings(){
+ public void whenUsingEqualsAnyIgnoreCase_ThenComparingStrings() {
assertThat(StringUtils.equalsAnyIgnoreCase(null, null, null)).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase("equals any", "equals any", "any")).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase("equals any", null, "equals any")).isTrue();
assertThat(StringUtils.equalsAnyIgnoreCase(null, "equals", "any")).isFalse();
- assertThat(StringUtils.equalsAnyIgnoreCase(
- "equals any ignore case", "EQUALS ANY IGNORE CASE", "any")).isTrue();
+ assertThat(StringUtils.equalsAnyIgnoreCase("equals any ignore case", "EQUALS ANY IGNORE CASE", "any")).isTrue();
}
@Test
- public void whenUsingCompare_thenComparingStringsWithNulls(){
+ public void whenUsingCompare_thenComparingStringsWithNulls() {
assertThat(StringUtils.compare(null, null)).isEqualTo(0);
assertThat(StringUtils.compare(null, "abc")).isEqualTo(-1);
@@ -134,7 +133,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareIgnoreCase_ThenComparingStringsWithNulls(){
+ public void whenUsingCompareIgnoreCase_ThenComparingStringsWithNulls() {
assertThat(StringUtils.compareIgnoreCase(null, null)).isEqualTo(0);
assertThat(StringUtils.compareIgnoreCase(null, "abc")).isEqualTo(-1);
@@ -145,7 +144,7 @@ public class StringComparisonUnitTest {
}
@Test
- public void whenUsingCompareWithNullIsLessOption_ThenComparingStrings(){
+ public void whenUsingCompareWithNullIsLessOption_ThenComparingStrings() {
assertThat(StringUtils.compare(null, "abc", true)).isEqualTo(-1);
assertThat(StringUtils.compare(null, "abc", false)).isEqualTo(1);
diff --git a/java-strings/src/test/java/com/baeldung/string/StringHelperUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/StringHelperUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
index 917ed1c937..eb86e84905 100644
--- a/java-strings/src/test/java/com/baeldung/string/StringHelperUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/StringHelperUnitTest.java
@@ -1,11 +1,11 @@
package com.baeldung.string;
-import org.apache.commons.lang3.StringUtils;
-import org.junit.Test;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
public class StringHelperUnitTest {
public static final String TEST_STRING = "abcdef";
diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/SubstringUnitTest.java
similarity index 100%
rename from java-strings/src/test/java/com/baeldung/string/SubstringUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/SubstringUnitTest.java
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
similarity index 89%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
index 808d3c45b0..6228fdb5af 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/CoreJavaIsNumericUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/CoreJavaIsNumericUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -13,16 +13,16 @@ public class CoreJavaIsNumericUnitTest {
}
return true;
}
-
+
@Test
public void whenUsingCoreJava_thenTrue() {
// Valid Numbers
assertThat(isNumeric("22")).isTrue();
assertThat(isNumeric("5.05")).isTrue();
- assertThat(isNumeric("-200")).isTrue();
+ assertThat(isNumeric("-200")).isTrue();
assertThat(isNumeric("10.0d")).isTrue();
assertThat(isNumeric(" 22 ")).isTrue();
-
+
// Invalid Numbers
assertThat(isNumeric(null)).isFalse();
assertThat(isNumeric("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
index 467d58837a..346248cb40 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsCreatableUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsCreatableUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -17,7 +17,7 @@ public class NumberUtilsIsCreatableUnitTest {
assertThat(NumberUtils.isCreatable("0xFF")).isTrue();
assertThat(NumberUtils.isCreatable("07")).isTrue();
assertThat(NumberUtils.isCreatable("2.99e+8")).isTrue();
-
+
// Invalid Numbers
assertThat(NumberUtils.isCreatable(null)).isFalse();
assertThat(NumberUtils.isCreatable("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
index 141a761158..fa2f2aec6d 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/NumberUtilsIsParsableUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/NumberUtilsIsParsableUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -13,7 +13,7 @@ public class NumberUtilsIsParsableUnitTest {
assertThat(NumberUtils.isParsable("-23")).isTrue();
assertThat(NumberUtils.isParsable("2.2")).isTrue();
assertThat(NumberUtils.isParsable("09")).isTrue();
-
+
// Invalid Numbers
assertThat(NumberUtils.isParsable(null)).isFalse();
assertThat(NumberUtils.isParsable("")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
similarity index 91%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
index c3aa43ac94..0f7f0eb081 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/RegularExpressionsUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/RegularExpressionsUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
import static org.assertj.core.api.Assertions.assertThat;
@@ -8,14 +8,14 @@ public class RegularExpressionsUnitTest {
public static boolean isNumeric(String strNum) {
return strNum.matches("-?\\d+(\\.\\d+)?");
}
-
+
@Test
public void whenUsingRegularExpressions_thenTrue() {
// Valid Numbers
assertThat(isNumeric("22")).isTrue();
assertThat(isNumeric("5.05")).isTrue();
assertThat(isNumeric("-200")).isTrue();
-
+
// Invalid Numbers
assertThat(isNumeric("abc")).isFalse();
}
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
similarity index 94%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
index 135780d9ad..05651cc567 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericSpaceUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericSpaceUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
+
+import static org.assertj.core.api.Assertions.assertThat;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
public class StringUtilsIsNumericSpaceUnitTest {
@Test
@@ -13,7 +14,7 @@ public class StringUtilsIsNumericSpaceUnitTest {
assertThat(StringUtils.isNumericSpace("")).isTrue();
assertThat(StringUtils.isNumericSpace(" ")).isTrue();
assertThat(StringUtils.isNumericSpace("12 3")).isTrue();
-
+
// Invalid Numbers
assertThat(StringUtils.isNumericSpace(null)).isFalse();
assertThat(StringUtils.isNumericSpace("ab2c")).isFalse();
diff --git a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
index b667dda906..cae08874da 100644
--- a/java-strings/src/test/java/com/baeldung/stringisnumeric/StringUtilsIsNumericUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/isnumeric/StringUtilsIsNumericUnitTest.java
@@ -1,8 +1,9 @@
-package com.baeldung.stringisnumeric;
+package com.baeldung.string.isnumeric;
+
+import static org.assertj.core.api.Assertions.assertThat;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
-import static org.assertj.core.api.Assertions.assertThat;
public class StringUtilsIsNumericUnitTest {
@Test
@@ -11,7 +12,7 @@ public class StringUtilsIsNumericUnitTest {
assertThat(StringUtils.isNumeric("123")).isTrue();
assertThat(StringUtils.isNumeric("١٢٣")).isTrue();
assertThat(StringUtils.isNumeric("१२३")).isTrue();
-
+
// Invalid Numbers
assertThat(StringUtils.isNumeric(null)).isFalse();
assertThat(StringUtils.isNumeric("")).isFalse();
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
new file mode 100644
index 0000000000..ced8b15f2e
--- /dev/null
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
@@ -0,0 +1,25 @@
+package com.baeldung.string.tostring;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+public class CustomerArrayToStringUnitTest {
+ private static final String CUSTOMER_ARRAY_TO_STRING = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
+ @Test
+ public void givenArray_whenToString_thenCustomerDetails() {
+ CustomerArrayToString customer = new CustomerArrayToString();
+ customer.setFirstName("Rajesh");
+ customer.setLastName("Bhojwani");
+ Order[] orders = new Order[1];
+ orders[0] = new Order();
+ orders[0].setOrderId("A1111");
+ orders[0].setDesc("Game");
+ orders[0].setStatus("In-Shiping");
+ customer.setOrders(orders);
+
+ assertEquals(CUSTOMER_ARRAY_TO_STRING, customer.toString());
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
similarity index 73%
rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
index 5ffb0d0e58..564fde8766 100644
--- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerComplexObjectToStringUnitTest.java
@@ -5,20 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class CustomerComplexObjectToStringUnitTest {
- private static final String CUSTOMER_COMPLEX_TO_STRING
- = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
+ private static final String CUSTOMER_COMPLEX_TO_STRING = "Customer [order=Order [orderId=A1111, desc=Game, value=0], getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
@Test
public void givenComplex_whenToString_thenCustomerDetails() {
CustomerComplexObjectToString customer = new CustomerComplexObjectToString();
customer.setFirstName("Rajesh");
customer.setLastName("Bhojwani");
- Order order = new Order();
+ Order order = new Order();
order.setOrderId("A1111");
order.setDesc("Game");
order.setStatus("In-Shiping");
customer.setOrder(order);
-
+
assertEquals(CUSTOMER_COMPLEX_TO_STRING, customer.toString());
}
diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
similarity index 78%
rename from java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
index d43733bc60..f585a8a26c 100644
--- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerPrimitiveToStringUnitTest.java
@@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test;
public class CustomerPrimitiveToStringUnitTest {
- private static final String CUSTOMER_PRIMITIVE_TO_STRING
- = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]";
+ private static final String CUSTOMER_PRIMITIVE_TO_STRING = "Customer [balance=110, getFirstName()=Rajesh, getLastName()=Bhojwani]";
@Test
public void givenPrimitive_whenToString_thenCustomerDetails() {
@@ -15,8 +14,7 @@ public class CustomerPrimitiveToStringUnitTest {
customer.setFirstName("Rajesh");
customer.setLastName("Bhojwani");
customer.setBalance(110);
-
+
assertEquals(CUSTOMER_PRIMITIVE_TO_STRING, customer.toString());
}
}
-
diff --git a/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
new file mode 100644
index 0000000000..9b3f8a1a6f
--- /dev/null
+++ b/java-strings-ops/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
@@ -0,0 +1,32 @@
+package com.baeldung.string.tostring;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+public class CustomerWrapperCollectionToStringUnitTest {
+ private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]";
+
+ @Test
+ public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() {
+ CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
+ customer.setFirstName("Rajesh");
+ customer.setLastName("Bhojwani");
+ customer.setScore(8);
+
+ List orders = new ArrayList();
+ orders.add("Book");
+ orders.add("Pen");
+ customer.setOrders(orders);
+
+ StringBuffer fullname = new StringBuffer();
+ fullname.append(customer.getLastName() + ", " + customer.getFirstName());
+ customer.setFullname(fullname);
+
+ assertEquals(CUSTOMER_WRAPPER_COLLECTION_TO_STRING, customer.toString());
+ }
+
+}
diff --git a/java-strings/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java b/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
similarity index 95%
rename from java-strings/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
rename to java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
index 4bbf63f87e..ca56d5aab5 100644
--- a/java-strings/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
+++ b/java-strings-ops/src/test/java/com/baeldung/stringpool/StringPoolUnitTest.java
@@ -1,7 +1,8 @@
package com.baeldung.stringpool;
+import static org.assertj.core.api.Assertions.assertThat;
+
import org.junit.Test;
-import static org.assertj.core.api.Assertions.*;
public class StringPoolUnitTest {
diff --git a/spring-all/src/test/resources/.gitignore b/java-strings-ops/src/test/resources/.gitignore
similarity index 100%
rename from spring-all/src/test/resources/.gitignore
rename to java-strings-ops/src/test/resources/.gitignore
diff --git a/java-strings/README.md b/java-strings/README.md
index b342f53918..17b74231a4 100644
--- a/java-strings/README.md
+++ b/java-strings/README.md
@@ -1,56 +1,16 @@
-=========
-
## Java Strings Cookbooks and Examples
+This module contains articles about strings in Java.
+
### Relevant Articles:
-- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings)
-- [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream)
-- [Java 8 StringJoiner](http://www.baeldung.com/java-string-joiner)
-- [Image to Base64 String Conversion](http://www.baeldung.com/java-base64-image-string)
-- [Java – Generate Random String](http://www.baeldung.com/java-random-string)
-- [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string)
-- [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer)
-- [Java String Conversions](https://www.baeldung.com/java-string-conversions)
-- [Converting Strings to Enums in Java](http://www.baeldung.com/java-string-to-enum)
-- [Quick Guide to the Java StringTokenizer](http://www.baeldung.com/java-stringtokenizer)
-- [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars)
-- [Split a String in Java](http://www.baeldung.com/java-split-string)
-- [How to Remove the Last Character of a String?](http://www.baeldung.com/java-remove-last-character-of-string)
-- [CharSequence vs. String in Java](http://www.baeldung.com/java-char-sequence-string)
-- [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer)
-- [Guide to Java String Pool](http://www.baeldung.com/java-string-pool)
-- [Check if a String is a Palindrome](http://www.baeldung.com/java-palindrome)
-- [Comparing Strings in Java](http://www.baeldung.com/java-compare-strings)
-- [Check If a String Is Numeric in Java](http://www.baeldung.com/java-check-string-number)
-- [Use char[] Array Over a String for Manipulating Passwords in Java?](http://www.baeldung.com/java-storing-passwords)
-- [Convert a String to Title Case](http://www.baeldung.com/java-string-title-case)
-- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string)
+- [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings)
+- [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords)
+- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string)
- [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex)
-- [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string)
-- [Get Substring from String in Java](https://www.baeldung.com/java-substring)
-- [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string)
-- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
-- [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis)
- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty)
- [String Performance Hints](https://www.baeldung.com/java-string-performance)
- [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences)
-- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array)
-- [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode)
-- [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password)
-- [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char)
-- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array)
-- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array)
-- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string)
- [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline)
-- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part)
+- [Remove or Replace Part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part)
- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index)
-- [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list)
-- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter)
-- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string)
-- [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters)
-- [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation)
-- [Java toString() Method](https://www.baeldung.com/java-tostring)
-- [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions)
-- [Check if a String is a Pangram in Java](https://www.baeldung.com/java-string-pangram)
-- [Check If a String Contains Multiple Keywords](https://www.baeldung.com/string-contains-multiple-words)
-- [Common String Operations in Java](https://www.baeldung.com/java-string-operations)
+- More articles: [[next -->]](/java-strings-2)
diff --git a/java-strings/pom.xml b/java-strings/pom.xml
index 7f66b95355..42a57bfb42 100755
--- a/java-strings/pom.xml
+++ b/java-strings/pom.xml
@@ -62,12 +62,6 @@
guava
${guava.version}
-
-
- com.vdurmont
- emoji-java
- ${emoji-java.version}
-
org.junit.jupiter
@@ -83,24 +77,6 @@
test
-
-
- org.passay
- passay
- ${passay.version}
-
-
- org.apache.commons
- commons-text
- ${commons-text.version}
-
-
-
- org.ahocorasick
- ahocorasick
- ${ahocorasick.version}
-
-
@@ -134,11 +110,8 @@
3.6.1
61.1
27.0.1-jre
- 4.0.0
5.3.1
- 1.3.1
1.4
- 0.4.0
diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
similarity index 98%
rename from java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
rename to java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
index b522f7337b..48b71eed12 100644
--- a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java
+++ b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java
@@ -1,4 +1,4 @@
-package com.baeldung.string;
+package com.baeldung.string.newline;
public class AddingNewLineToString {
diff --git a/java-strings/src/test/java/com/baeldung/java/conversion/README.md b/java-strings/src/test/java/com/baeldung/java/conversion/README.md
deleted file mode 100644
index 7c81180249..0000000000
--- a/java-strings/src/test/java/com/baeldung/java/conversion/README.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Relevant Articles:
-- [Java String Conversions](http://www.baeldung.com/java-string-conversions)
diff --git a/java-strings/src/test/java/com/baeldung/string/SplitUnitTest.java b/java-strings/src/test/java/com/baeldung/string/SplitUnitTest.java
deleted file mode 100644
index 6157640a4a..0000000000
--- a/java-strings/src/test/java/com/baeldung/string/SplitUnitTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.baeldung.string;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.junit.jupiter.api.Test;
-
-import com.google.common.base.Splitter;
-
-public class SplitUnitTest {
-
- @Test
- public void givenString_whenSplit_thenReturnsArray_through_JavaLangString() {
- assertThat("peter,james,thomas".split(","))
- .containsExactly("peter", "james", "thomas");
-
- assertThat("car jeep scooter".split(" "))
- .containsExactly("car", "jeep", "scooter");
-
- assertThat("1-120-232323".split("-"))
- .containsExactly("1", "120", "232323");
-
- assertThat("192.168.1.178".split("\\."))
- .containsExactly("192", "168", "1", "178");
-
- assertThat("b a, e, l.d u, n g".split("\\s+|,\\s*|\\.\\s*"))
- .containsExactly("b", "a", "e", "l", "d", "u", "n", "g");
- }
-
- @Test
- public void givenString_whenSplit_thenReturnsArray_through_StringUtils() {
- StringUtils.split("car jeep scooter");
-
- assertThat(StringUtils.split("car jeep scooter"))
- .containsExactly("car", "jeep", "scooter");
-
- assertThat(StringUtils.split("car jeep scooter"))
- .containsExactly("car", "jeep", "scooter");
-
- assertThat(StringUtils.split("car:jeep:scooter", ":"))
- .containsExactly("car", "jeep", "scooter");
-
- assertThat(StringUtils.split("car.jeep.scooter", "."))
- .containsExactly("car", "jeep", "scooter");
- }
-
- @Test
- public void givenString_whenSplit_thenReturnsList_Splitter() {
- //given
- List resultList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList("car,jeep,, scooter");
-
- assertThat(resultList)
- .containsExactly("car", "jeep", "scooter");
- }
-
- @Test
- public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_Regex() {
- assertThat(" car , jeep, scooter ".trim()
- .split("\\s*,\\s*")).containsExactly("car", "jeep", "scooter");
-
- }
-
- @Test
- public void givenStringContainsSpaces_whenSplitAndTrim_thenReturnsArray_using_java_8() {
- assertThat(Arrays.stream(" car , jeep, scooter ".split(","))
- .map(String::trim)
- .toArray(String[]::new)).containsExactly("car", "jeep", "scooter");
- }
-}
diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
deleted file mode 100644
index 9a88416179..0000000000
--- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerArrayToStringUnitTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.baeldung.string.tostring;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import org.junit.jupiter.api.Test;
-
-public class CustomerArrayToStringUnitTest {
- private static final String CUSTOMER_ARRAY_TO_STRING
- = "Customer [orders=[Order [orderId=A1111, desc=Game, value=0]], getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
- @Test
- public void givenArray_whenToString_thenCustomerDetails() {
- CustomerArrayToString customer = new CustomerArrayToString();
- customer.setFirstName("Rajesh");
- customer.setLastName("Bhojwani");
- Order[] orders = new Order[1];
- orders[0] = new Order();
- orders[0].setOrderId("A1111");
- orders[0].setDesc("Game");
- orders[0].setStatus("In-Shiping");
- customer.setOrders(orders);
-
- assertEquals(CUSTOMER_ARRAY_TO_STRING, customer.toString());
- }
-
-}
diff --git a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
deleted file mode 100644
index e04512ff75..0000000000
--- a/java-strings/src/test/java/com/baeldung/string/tostring/CustomerWrapperCollectionToStringUnitTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.baeldung.string.tostring;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
-
-public class CustomerWrapperCollectionToStringUnitTest {
- private static final String CUSTOMER_WRAPPER_COLLECTION_TO_STRING
- = "Customer [score=8, orders=[Book, Pen], fullname=Bhojwani, Rajesh, getFirstName()=Rajesh, getLastName()=Bhojwani]";
-
- @Test
- public void givenWrapperCollectionStrBuffer_whenToString_thenCustomerDetails() {
- CustomerWrapperCollectionToString customer = new CustomerWrapperCollectionToString();
- customer.setFirstName("Rajesh");
- customer.setLastName("Bhojwani");
- customer.setScore(8);
-
- List orders = new ArrayList();
- orders.add("Book");
- orders.add("Pen");
- customer.setOrders(orders);
-
- StringBuffer fullname = new StringBuffer();
- fullname.append(customer.getLastName()+", "+ customer.getFirstName());
- customer.setFullname(fullname);
-
- assertEquals(CUSTOMER_WRAPPER_COLLECTION_TO_STRING, customer.toString());
- }
-
-}
diff --git a/java-vavr-stream/README.md b/java-vavr-stream/README.md
index 64299cde11..4e8b5ccd66 100644
--- a/java-vavr-stream/README.md
+++ b/java-vavr-stream/README.md
@@ -1,5 +1,8 @@
+## Vavr Streams
+
+This module contains articles about streams in Vavr.
### Relevant Articles:
-- [Java Streams vs Vavr Streams](http://www.baeldung.com/vavr-java-streams)
+- [Java Streams vs Vavr Streams](https://www.baeldung.com/vavr-java-streams)
diff --git a/java-websocket/README.md b/java-websocket/README.md
index f9f0784043..f48b8c6804 100644
--- a/java-websocket/README.md
+++ b/java-websocket/README.md
@@ -1,3 +1,7 @@
+## Java WebSocket
+
+This module contains articles about WebSocket in Java.
+
### Relevant articles
-- [A Guide to the Java API for WebSocket](http://www.baeldung.com/java-websockets)
+- [A Guide to the Java API for WebSocket](https://www.baeldung.com/java-websockets)
diff --git a/javafx/README.md b/javafx/README.md
index 66c81f17ad..80c4f49026 100644
--- a/javafx/README.md
+++ b/javafx/README.md
@@ -1,3 +1,7 @@
-### Relevant Articles:
--[Introduction to JavaFX](http://www.baeldung.com/javafx)
+## JavaFX
+
+This module contains articles about JavaFX.
+
+### Relevant Articles:
+-[Introduction to JavaFX](https://www.baeldung.com/javafx)
diff --git a/javax-servlets/README.md b/javax-servlets/README.md
index 3c3b17996b..085cc04f87 100644
--- a/javax-servlets/README.md
+++ b/javax-servlets/README.md
@@ -1,9 +1,14 @@
+## Servlets
+
+This module contains articles about Servlets.
+
### Relevant Articles:
-- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets)
-- [An MVC Example with Servlets and JSP](http://www.baeldung.com/mvc-servlet-jsp)
-- [Handling Cookies and a Session in a Java Servlet](http://www.baeldung.com/java-servlet-cookies-session)
-- [Uploading Files with Servlets and JSP](http://www.baeldung.com/upload-file-servlet)
-- [Example of Downloading File in a Servlet](http://www.baeldung.com/servlet-download-file)
-- [Returning a JSON Response from a Servlet](http://www.baeldung.com/servlet-json-response)
-- [Java EE Servlet Exception Handling](http://www.baeldung.com/servlet-exceptions)
-- [Context and Servlet Initialization Parameters](http://www.baeldung.com/context-servlet-initialization-param)
+- [Introduction to Java Servlets](https://www.baeldung.com/intro-to-servlets)
+- [An MVC Example with Servlets and JSP](https://www.baeldung.com/mvc-servlet-jsp)
+- [Handling Cookies and a Session in a Java Servlet](https://www.baeldung.com/java-servlet-cookies-session)
+- [Uploading Files with Servlets and JSP](https://www.baeldung.com/upload-file-servlet)
+- [Example of Downloading File in a Servlet](https://www.baeldung.com/servlet-download-file)
+- [Returning a JSON Response from a Servlet](https://www.baeldung.com/servlet-json-response)
+- [Java EE Servlet Exception Handling](https://www.baeldung.com/servlet-exceptions)
+- [Context and Servlet Initialization Parameters](https://www.baeldung.com/context-servlet-initialization-param)
+- [The Difference between getRequestURI and getPathInfo in HttpServletRequest](https://www.baeldung.com/http-servlet-request-requesturi-pathinfo)
diff --git a/javax-servlets/src/main/java/com/baeldung/servlets/MyHttpServlet.java b/javax-servlets/src/main/java/com/baeldung/servlets/MyHttpServlet.java
new file mode 100644
index 0000000000..b4d80db0ab
--- /dev/null
+++ b/javax-servlets/src/main/java/com/baeldung/servlets/MyHttpServlet.java
@@ -0,0 +1,57 @@
+package com.baeldung.servlets;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@WebServlet(name = "MyHttpServlet", urlPatterns = "/servlet-mapping")
+public class MyHttpServlet extends HttpServlet {
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ PrintWriter writer = response.getWriter();
+ writer.println(request.getParameter("function"));
+ if ("getContextPath".equals(request.getParameter("function"))) {
+ writer.println(request.getContextPath());
+ } else if ("getLocalAddr".equals(request.getParameter("function"))) {
+ writer.println(request.getLocalAddr());
+ } else if ("getLocalName".equals(request.getParameter("function"))) {
+ writer.println(request.getLocalName());
+ } else if ("getLocalAPort".equals(request.getParameter("function"))) {
+ writer.println(request.getLocalPort());
+ } else if ("getMethod".equals(request.getParameter("function"))) {
+ writer.println(request.getMethod());
+ } else if ("getParameterNames".equals(request.getParameter("function"))) {
+ writer.println(request.getParameterNames());
+ } else if ("getPathInfo".equals(request.getParameter("function"))) {
+ writer.println(request.getPathInfo());
+ } else if ("getProtocol".equals(request.getParameter("function"))) {
+ writer.println(request.getProtocol());
+ } else if ("getQueryString".equals(request.getParameter("function"))) {
+ writer.println(request.getQueryString());
+ } else if ("getRequestedSessionId".equals(request.getParameter("function"))) {
+ writer.println(request.getRequestedSessionId());
+ } else if ("getRequestURI".equals(request.getParameter("function"))) {
+ writer.println(request.getRequestURI());
+ } else if ("getRequestURL".equals(request.getParameter("function"))) {
+ writer.println(request.getRequestURL());
+ } else if ("getScheme".equals(request.getParameter("function"))) {
+ writer.println(request.getScheme());
+ } else if ("getServerName".equals(request.getParameter("function"))) {
+ writer.println(request.getServerName());
+ } else if ("getServerPort".equals(request.getParameter("function"))) {
+ writer.println(request.getServerPort());
+ } else if ("getServletPath".equals(request.getParameter("function"))) {
+ writer.println(request.getServletPath());
+ } else {
+ writer.println("INVALID FUNCTION");
+ }
+ writer.flush();
+ }
+
+}
+
+
diff --git a/javaxval/README.md b/javaxval/README.md
index 3a975022ad..c2c392b276 100644
--- a/javaxval/README.md
+++ b/javaxval/README.md
@@ -1,12 +1,12 @@
-=========
-
## Java Bean Validation Examples
-###The Course
-The "REST With Spring" Classes: http://bit.ly/restwithspring
+This module contains articles about Bean Validation.
### Relevant Articles:
-- [Java Bean Validation Basics](http://www.baeldung.com/javax-validation)
-- [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements)
-- [Method Constraints with Bean Validation 2.0](http://www.baeldung.com/javax-validation-method-constraints)
+- [Java Bean Validation Basics](https://www.baeldung.com/javax-validation)
+- [Validating Container Elements with Bean Validation 2.0](https://www.baeldung.com/bean-validation-container-elements)
+- [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints)
- [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank)
+- [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation)
+- [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups)
+- [Javax Validations for Enums](https://www.baeldung.com/javax-validations-enums)
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java
deleted file mode 100644
index c9f2ab6f98..0000000000
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.baeldung.javabeanconstraints.appplication;
-
-import javax.validation.Validation;
-import javax.validation.Validator;
-import org.baeldung.javabeanconstraints.entities.UserNotBlank;
-
-public class Application {
-
- public static void main(String[] args) throws Exception {
- Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
- UserNotBlank user = new UserNotBlank(" ");
- validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage()));
- }
-}
diff --git a/javaxval/src/main/java/org/baeldung/User.java b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
similarity index 95%
rename from javaxval/src/main/java/org/baeldung/User.java
rename to javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
index e2f2732399..8303edd033 100644
--- a/javaxval/src/main/java/org/baeldung/User.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.beanvalidation;
import java.time.LocalDate;
import java.util.List;
@@ -8,10 +8,10 @@ import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
-import javax.validation.constraints.NotBlank;
public class User {
@@ -30,9 +30,9 @@ public class User {
@Email(message = "Email should be valid")
private String email;
-
- List<@NotBlank String> preferences;
-
+
+ private List<@NotBlank String> preferences;
+
private LocalDate dateOfBirth;
public int getAge() {
@@ -90,5 +90,4 @@ public class User {
public void setPreferences(List preferences) {
this.preferences = preferences;
}
-
}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java
new file mode 100644
index 0000000000..087701f166
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java
@@ -0,0 +1,19 @@
+package org.baeldung.javaxval.bigdecimal;
+
+import java.math.BigDecimal;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.Digits;
+
+public class Invoice {
+
+ @DecimalMin(value = "0.0", inclusive = false)
+ @Digits(integer = 3, fraction = 2)
+ private BigDecimal price;
+ private String description;
+
+ public Invoice(BigDecimal price, String description) {
+ this.price = price;
+ this.description = description;
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
similarity index 85%
rename from javaxval/src/main/java/org/baeldung/Customer.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
index a90fb419de..6ca5ba3ee1 100644
--- a/javaxval/src/main/java/org/baeldung/Customer.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import java.util.List;
import java.util.Optional;
@@ -10,17 +10,17 @@ import javax.validation.constraints.PositiveOrZero;
public class Customer {
- @NotBlank(message="Name cannot be empty")
+ @NotBlank(message = "Name cannot be empty")
private String name;
- private List<@NotBlank(message="Address must not be blank") String> addresses;
-
+ private List<@NotBlank(message = "Address must not be blank") String> addresses;
+
private Integer age;
-
+
@PositiveOrZero
private OptionalInt numberOfOrders;
-
- //@NotBlank
+
+ @NotBlank
private Profile profile;
public String getName() {
diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
similarity index 69%
rename from javaxval/src/main/java/org/baeldung/CustomerMap.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
index 37446cf86e..82cf0f2b0c 100644
--- a/javaxval/src/main/java/org/baeldung/CustomerMap.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import java.util.Map;
@@ -6,8 +6,8 @@ import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
public class CustomerMap {
-
- private Map<@Email(message="Must be a valid email") String, @NotNull Customer> customers;
+
+ private Map<@Email(message = "Must be a valid email") String, @NotNull Customer> customers;
public Map getCustomers() {
return customers;
diff --git a/javaxval/src/main/java/org/baeldung/Profile.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
similarity index 81%
rename from javaxval/src/main/java/org/baeldung/Profile.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
index ec73a5c62f..41260540fc 100644
--- a/javaxval/src/main/java/org/baeldung/Profile.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
public class Profile {
private String companyName;
diff --git a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
similarity index 79%
rename from javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java
rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
index f192034261..ebc618e80e 100644
--- a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java
@@ -1,10 +1,10 @@
-package org.baeldung.valueextractors;
+package org.baeldung.javaxval.container.validation.valueextractors;
import javax.validation.valueextraction.ExtractedValue;
import javax.validation.valueextraction.UnwrapByDefault;
import javax.validation.valueextraction.ValueExtractor;
-import org.baeldung.Profile;
+import org.baeldung.javaxval.container.validation.Profile;
@UnwrapByDefault
public class ProfileValueExtractor implements ValueExtractor<@ExtractedValue(type = String.class) Profile> {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java
new file mode 100644
index 0000000000..c730cb937f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java
@@ -0,0 +1,24 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.Arrays;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+public class CustomerTypeSubSetValidator implements ConstraintValidator {
+ private CustomerType[] subset;
+
+ @Override
+ public void initialize(CustomerTypeSubset constraint) {
+ this.subset = constraint.anyOf();
+ }
+
+ @Override
+ public boolean isValid(CustomerType value, ConstraintValidatorContext context) {
+ return value == null || Arrays.asList(subset)
+ .contains(value);
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java
new file mode 100644
index 0000000000..a279813461
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java
@@ -0,0 +1,33 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.EnumNamePattern;
+
+public class EnumNamePatternValidator implements ConstraintValidator> {
+ private Pattern pattern;
+
+ @Override
+ public void initialize(EnumNamePattern constraintAnnotation) {
+ try {
+ pattern = Pattern.compile(constraintAnnotation.regexp());
+ } catch (PatternSyntaxException e) {
+ throw new IllegalArgumentException("Given regex is invalid", e);
+ }
+ }
+
+ @Override
+ public boolean isValid(Enum> value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ Matcher m = pattern.matcher(value.name());
+ return m.matches();
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java
new file mode 100644
index 0000000000..339b4fb03b
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java
@@ -0,0 +1,25 @@
+package org.baeldung.javaxval.enums;
+
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+public abstract class EnumSubSetValidator implements ConstraintValidator {
+ private U[] subset;
+
+ protected void initialize(U[] subset) {
+ this.subset = subset;
+ }
+
+ @Override
+ public boolean isValid(U value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ return Arrays.asList(subset)
+ .contains(value);
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java
new file mode 100644
index 0000000000..1cd31c4187
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java
@@ -0,0 +1,11 @@
+package org.baeldung.javaxval.enums;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+public class InheritedCustomerTypeSubSetValidator extends EnumSubSetValidator {
+ @Override
+ public void initialize(CustomerTypeSubset constraint) {
+ super.initialize(constraint.anyOf());
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java
new file mode 100644
index 0000000000..7184dae49b
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java
@@ -0,0 +1,31 @@
+package org.baeldung.javaxval.enums;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+import org.baeldung.javaxval.enums.constraints.ValueOfEnum;
+
+public class ValueOfEnumValidator implements ConstraintValidator {
+ private List acceptedValues;
+
+ @Override
+ public void initialize(ValueOfEnum annotation) {
+ acceptedValues = Stream.of(annotation.enumClass()
+ .getEnumConstants())
+ .map(Enum::name)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
+ if (value == null) {
+ return true;
+ }
+
+ return acceptedValues.contains(value.toString());
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java
new file mode 100644
index 0000000000..44009e6723
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.CustomerTypeSubSetValidator;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = CustomerTypeSubSetValidator.class)
+public @interface CustomerTypeSubset {
+ /**
+ * @return subset of CustomerType enum
+ */
+ CustomerType[] anyOf();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must be any of {anyOf}";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java
new file mode 100644
index 0000000000..403cdcd0b4
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.EnumNamePatternValidator;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = EnumNamePatternValidator.class)
+public @interface EnumNamePattern {
+
+ /**
+ * @return the regular expression to match
+ */
+ String regexp();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must match \"{regexp}\"";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java
new file mode 100644
index 0000000000..0f9677d982
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java
@@ -0,0 +1,44 @@
+package org.baeldung.javaxval.enums.constraints;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.PARAMETER;
+import static java.lang.annotation.ElementType.TYPE_USE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+import org.baeldung.javaxval.enums.ValueOfEnumValidator;
+
+@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
+@Retention(RUNTIME)
+@Documented
+@Constraint(validatedBy = ValueOfEnumValidator.class)
+public @interface ValueOfEnum {
+ /**
+ * @return class containing enum values to which this String should match
+ */
+ Class extends Enum>> enumClass();
+
+ /**
+ * @return the error message template
+ */
+ String message() default "must be any of enum {enumClass}";
+
+ /**
+ * @return the groups the constraint belongs to
+ */
+ Class>[] groups() default {};
+
+ /**
+ * @return the payload associated to the constraint
+ */
+ Class extends Payload>[] payload() default {};
+}
\ No newline at end of file
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java
new file mode 100644
index 0000000000..db3486ab5f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java
@@ -0,0 +1,77 @@
+package org.baeldung.javaxval.enums.demo;
+
+import javax.validation.constraints.NotNull;
+
+import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset;
+import org.baeldung.javaxval.enums.constraints.EnumNamePattern;
+import org.baeldung.javaxval.enums.constraints.ValueOfEnum;
+
+public class Customer {
+ @ValueOfEnum(enumClass = CustomerType.class)
+ private String customerTypeString;
+
+ @NotNull
+ @CustomerTypeSubset(anyOf = { CustomerType.NEW, CustomerType.OLD })
+ private CustomerType customerTypeOfSubset;
+
+ @EnumNamePattern(regexp = "NEW|DEFAULT")
+ private CustomerType customerTypeMatchesPattern;
+
+ public Customer() {
+ }
+
+ public Customer(String customerTypeString, CustomerType customerTypeOfSubset, CustomerType customerTypeMatchesPattern) {
+ this.customerTypeString = customerTypeString;
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ }
+
+ public String getCustomerTypeString() {
+ return customerTypeString;
+ }
+
+ public void setCustomerTypeString(String customerTypeString) {
+ this.customerTypeString = customerTypeString;
+ }
+
+ public CustomerType getCustomerTypeOfSubset() {
+ return customerTypeOfSubset;
+ }
+
+ public void setCustomerTypeOfSubset(CustomerType customerTypeOfSubset) {
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ }
+
+ public CustomerType getCustomerTypeMatchesPattern() {
+ return customerTypeMatchesPattern;
+ }
+
+ public void setCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) {
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ }
+
+ public static class Builder {
+ private String customerTypeString;
+ private CustomerType customerTypeOfSubset = CustomerType.NEW;
+ private CustomerType customerTypeMatchesPattern;
+
+ public Builder withCustomerTypeString(String customerTypeString) {
+ this.customerTypeString = customerTypeString;
+ return this;
+ }
+
+ public Builder withCustomerTypeOfSubset(CustomerType customerTypeOfSubset) {
+ this.customerTypeOfSubset = customerTypeOfSubset;
+ return this;
+ }
+
+ public Builder withCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) {
+ this.customerTypeMatchesPattern = customerTypeMatchesPattern;
+ return this;
+ }
+
+ public Customer build() {
+ return new Customer(customerTypeString, customerTypeOfSubset, customerTypeMatchesPattern);
+ }
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java
new file mode 100644
index 0000000000..937f3a3817
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.enums.demo;
+
+public enum CustomerType {
+ NEW, OLD, DEFAULT
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java
new file mode 100644
index 0000000000..22095084c5
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java
@@ -0,0 +1,18 @@
+package org.baeldung.javaxval.javabeanconstraints.application;
+
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank;
+
+public class Application {
+
+ public static void main(String[] args) {
+ Validator validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ UserNotBlank user = new UserNotBlank(" ");
+ validator.validate(user)
+ .stream()
+ .forEach(violation -> System.out.println(violation.getMessage()));
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
similarity index 81%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
index 2ea6a3af56..d86b6a65d2 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotBlank;
-
-public class UserNotBlank {
-
- @NotBlank(message = "Name is mandatory")
- private final String name;
-
- public UserNotBlank(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotBlank;
+
+public class UserNotBlank {
+
+ @NotBlank(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotBlank(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
similarity index 80%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
index 39e34b63d3..2082265145 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotEmpty;
-
-public class UserNotEmpty {
-
- @NotEmpty(message = "Name is mandatory")
- private final String name;
-
- public UserNotEmpty(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotEmpty;
+
+public class UserNotEmpty {
+
+ @NotEmpty(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotEmpty(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
similarity index 80%
rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java
rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
index 598c9ba9f9..e2f9e7ec57 100644
--- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java
@@ -1,22 +1,22 @@
-package org.baeldung.javabeanconstraints.entities;
-
-import javax.validation.constraints.NotNull;
-
-public class UserNotNull {
-
- @NotNull(message = "Name is mandatory")
- private final String name;
-
- public UserNotNull(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- @Override
- public String toString() {
- return "User{" + "name=" + name + "}";
- }
-}
+package org.baeldung.javaxval.javabeanconstraints.entities;
+
+import javax.validation.constraints.NotNull;
+
+public class UserNotNull {
+
+ @NotNull(message = "Name is mandatory")
+ private final String name;
+
+ public UserNotNull(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + "}";
+ }
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
index 206a145337..817f2370ef 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java
@@ -1,5 +1,7 @@
package org.baeldung.javaxval.methodvalidation;
+import java.time.LocalDate;
+
import org.baeldung.javaxval.methodvalidation.model.Customer;
import org.baeldung.javaxval.methodvalidation.model.Reservation;
import org.springframework.beans.factory.config.BeanDefinition;
@@ -9,8 +11,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
-import java.time.LocalDate;
-
@Configuration
@ComponentScan({ "org.baeldung.javaxval.methodvalidation.model" })
public class MethodValidationConfig {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
index f1c97760d7..df09cfa906 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java
@@ -1,10 +1,11 @@
package org.baeldung.javaxval.methodvalidation.constraints;
+import java.time.LocalDate;
+
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;
-import java.time.LocalDate;
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ConsistentDateParameterValidator implements ConstraintValidator {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
index 6b321f545c..bdfabe05ba 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java
@@ -1,13 +1,15 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import javax.validation.Constraint;
-import javax.validation.Payload;
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import javax.validation.Constraint;
+import javax.validation.Payload;
@Constraint(validatedBy = ConsistentDateParameterValidator.class)
@Target({ METHOD, CONSTRUCTOR })
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
index f9cdea1483..842f9e0621 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java
@@ -1,15 +1,16 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import javax.validation.Constraint;
-import javax.validation.Payload;
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
@Constraint(validatedBy = ValidReservationValidator.class)
@Target({ METHOD, CONSTRUCTOR })
@Retention(RUNTIME)
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
index 7b730480ed..c139d1affc 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java
@@ -1,10 +1,11 @@
package org.baeldung.javaxval.methodvalidation.constraints;
-import org.baeldung.javaxval.methodvalidation.model.Reservation;
+import java.time.LocalDate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
-import java.time.LocalDate;
+
+import org.baeldung.javaxval.methodvalidation.model.Reservation;
public class ValidReservationValidator implements ConstraintValidator {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
index fe9ad7080e..99a32d6277 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java
@@ -1,10 +1,10 @@
package org.baeldung.javaxval.methodvalidation.model;
-import org.springframework.validation.annotation.Validated;
-
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
+import org.springframework.validation.annotation.Validated;
+
@Validated
public class Customer {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
index a8c01d2be1..5775bdd66b 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java
@@ -1,13 +1,14 @@
package org.baeldung.javaxval.methodvalidation.model;
+import java.time.LocalDate;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Positive;
+
import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters;
import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation;
import org.springframework.validation.annotation.Validated;
-import javax.validation.Valid;
-import javax.validation.constraints.Positive;
-import java.time.LocalDate;
-
@Validated
public class Reservation {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
index f6fec1a15d..e480e7912d 100644
--- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
+++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java
@@ -1,17 +1,20 @@
package org.baeldung.javaxval.methodvalidation.model;
+import java.time.LocalDate;
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Future;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters;
-import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
-import javax.validation.Valid;
-import javax.validation.constraints.*;
-import java.time.LocalDate;
-import java.util.List;
-
@Controller
@Validated
public class ReservationManagement {
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java
new file mode 100644
index 0000000000..9a398e9e7e
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.validationgroup;
+
+public interface AdvanceInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java
new file mode 100644
index 0000000000..6959f52bfa
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java
@@ -0,0 +1,5 @@
+package org.baeldung.javaxval.validationgroup;
+
+public interface BasicInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java
new file mode 100644
index 0000000000..e34f318b5f
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java
@@ -0,0 +1,8 @@
+package org.baeldung.javaxval.validationgroup;
+
+import javax.validation.GroupSequence;
+
+@GroupSequence({ BasicInfo.class, AdvanceInfo.class })
+public interface CompleteInfo {
+
+}
diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java
new file mode 100644
index 0000000000..190a0c1280
--- /dev/null
+++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java
@@ -0,0 +1,110 @@
+package org.baeldung.javaxval.validationgroup;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+
+public class RegistrationForm {
+ @NotBlank(groups = BasicInfo.class)
+ private String firstName;
+ @NotBlank(groups = BasicInfo.class)
+ private String lastName;
+ @Email(groups = BasicInfo.class)
+ private String email;
+ @NotBlank(groups = BasicInfo.class)
+ private String phone;
+
+ @NotBlank(groups = { BasicInfo.class, AdvanceInfo.class })
+ private String captcha;
+
+ @NotBlank(groups = AdvanceInfo.class)
+ private String street;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String houseNumber;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String zipCode;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String city;
+ @NotBlank(groups = AdvanceInfo.class)
+ private String country;
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getHouseNumber() {
+ return houseNumber;
+ }
+
+ public void setHouseNumber(String houseNumber) {
+ this.houseNumber = houseNumber;
+ }
+
+ public String getZipCode() {
+ return zipCode;
+ }
+
+ public void setZipCode(String zipCode) {
+ this.zipCode = zipCode;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getCaptcha() {
+ return captcha;
+ }
+
+ public void setCaptcha(String captcha) {
+ this.captcha = captcha;
+ }
+
+}
diff --git a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
index e77a30cfe4..16bacf1097 100644
--- a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
+++ b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor
@@ -1 +1 @@
-org.baeldung.valueextractors.ProfileValueExtractor
\ No newline at end of file
+org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java
new file mode 100644
index 0000000000..5623b50a72
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java
@@ -0,0 +1,23 @@
+package org.baeldung.javaxval;
+
+import java.util.Locale;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+public abstract class LocaleAwareUnitTest {
+ private static Locale previousDefault;
+
+ @BeforeClass
+ public static void setupLocale() {
+ previousDefault = Locale.getDefault();
+
+ Locale.setDefault(Locale.US);
+ }
+
+ @AfterClass
+ public static void resetLocale() {
+ Locale.setDefault(previousDefault);
+ }
+
+}
diff --git a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
similarity index 94%
rename from javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
index 78745a1af2..3d54955177 100644
--- a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java
@@ -1,20 +1,18 @@
-package org.baeldung;
+package org.baeldung.javaxval.beanvalidation;
+
+import static org.junit.Assert.assertEquals;
import java.time.LocalDate;
import java.util.Collections;
-import java.util.Iterator;
import java.util.Set;
-import java.util.Optional;
-
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
-import static org.junit.Assert.*;
-import org.junit.Test;
import org.junit.Before;
+import org.junit.Test;
public class ValidationIntegrationTest {
@@ -96,7 +94,7 @@ public class ValidationIntegrationTest {
Set> violations = validator.validate(user);
assertEquals(1, violations.size());
}
-
+
@Test
public void givenBlankPreference_thenValidationFails() {
User user = createUser();
@@ -109,18 +107,18 @@ public class ValidationIntegrationTest {
@Test
public void givenEmptyOptional_thenValidationSucceeds() {
User user = createUser();
-
- Set> violations = validator.validate(user);
- assertEquals(0, violations.size());
- }
-
- @Test
- public void givenPastDateOfBirth_thenValidationSuccess() {
- User user = createUser();
- user.setDateOfBirth(LocalDate.of(1980, 5, 20));
Set> violations = validator.validate(user);
assertEquals(0, violations.size());
-
+ }
+
+ @Test
+ public void givenPastDateOfBirth_thenValidationSuccess() {
+ User user = createUser();
+ user.setDateOfBirth(LocalDate.of(1980, 5, 20));
+
+ Set> violations = validator.validate(user);
+ assertEquals(0, violations.size());
+
}
}
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
new file mode 100644
index 0000000000..6a53d67f30
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java
@@ -0,0 +1,64 @@
+package org.baeldung.javaxval.bigdecimal;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.math.BigDecimal;
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.LocaleAwareUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class InvoiceUnitTest extends LocaleAwareUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenPriceIntegerDigitLessThanThreeWithDecimalValue_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ }
+
+ @Test
+ public void whenPriceIntegerDigitLessThanThreeWithIntegerValue_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+ @Test
+ public void whenPriceIntegerDigitGreaterThanThree_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)"));
+ }
+
+ @Test
+ public void whenPriceIsZero_thenShouldGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations.size()).isEqualTo(1);
+ violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0"));
+ }
+
+ @Test
+ public void whenPriceIsGreaterThanZero_thenShouldNotGiveConstraintViolations() {
+ Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased");
+ Set> violations = validator.validate(invoice);
+ assertThat(violations.size()).isEqualTo(0);
+ }
+
+}
diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
similarity index 91%
rename from javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
index dff02ff13d..25c8111732 100644
--- a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java
@@ -1,4 +1,4 @@
-package org.baeldung;
+package org.baeldung.javaxval.container.validation;
import static org.junit.Assert.assertEquals;
@@ -10,8 +10,8 @@ import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
-import org.baeldung.valueextractors.ProfileValueExtractor;
+import org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor;
import org.junit.Before;
import org.junit.Test;
@@ -20,8 +20,10 @@ public class ContainerValidationIntegrationTest {
@Before
public void setup() {
- ValidatorFactory factory = Validation.byDefaultProvider().configure()
- .addValueExtractor(new ProfileValueExtractor()).buildValidatorFactory();
+ ValidatorFactory factory = Validation.byDefaultProvider()
+ .configure()
+ .addValueExtractor(new ProfileValueExtractor())
+ .buildValidatorFactory();
validator = factory.getValidator();
}
@@ -74,7 +76,7 @@ public class ContainerValidationIntegrationTest {
assertEquals(0, violations.size());
}
- //@Test
+ @Test
public void whenProfileCompanyNameBlank_thenValidationFails() {
Customer customer = new Customer();
customer.setName("John");
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java
new file mode 100644
index 0000000000..5aae504b23
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java
@@ -0,0 +1,45 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerType;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CustomerTypeSubSetValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenEnumAnyOfSubset_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.NEW)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumNotAnyOfSubset_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.DEFAULT)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeOfSubset")
+ .and(CustomerUnitTest.havingMessage("must be any of [NEW, OLD]")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java
new file mode 100644
index 0000000000..48f7de2c34
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java
@@ -0,0 +1,54 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.baeldung.javaxval.enums.demo.CustomerType.DEFAULT;
+import static org.baeldung.javaxval.enums.demo.CustomerType.OLD;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class EnumNamePatternValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenEnumMatchesRegex_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(DEFAULT)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumNull_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(null)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenEnumDoesNotMatchRegex_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(OLD)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeMatchesPattern")
+ .and(CustomerUnitTest.havingMessage("must match \"NEW|DEFAULT\"")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java
new file mode 100644
index 0000000000..0784b58b77
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java
@@ -0,0 +1,52 @@
+package org.baeldung.javaxval.enums;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.enums.demo.Customer;
+import org.baeldung.javaxval.enums.demo.CustomerUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ValueOfEnumValidatorUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenStringAnyOfEnum_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString("DEFAULT")
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenStringNull_thenShouldNotReportConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString(null)
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.isEmpty()).isTrue();
+ }
+
+ @Test
+ public void whenStringNotAnyOfEnum_thenShouldGiveOccurrenceOfConstraintViolations() {
+ Customer customer = new Customer.Builder().withCustomerTypeString("test")
+ .build();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeString")
+ .and(CustomerUnitTest.havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType")));
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java
new file mode 100644
index 0000000000..6a064b640f
--- /dev/null
+++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java
@@ -0,0 +1,66 @@
+package org.baeldung.javaxval.enums.demo;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Set;
+import java.util.function.Predicate;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+
+import org.baeldung.javaxval.LocaleAwareUnitTest;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class CustomerUnitTest extends LocaleAwareUnitTest {
+
+ private static Validator validator;
+
+ @BeforeClass
+ public static void setupValidatorInstance() {
+ validator = Validation.buildDefaultValidatorFactory()
+ .getValidator();
+ }
+
+ @Test
+ public void whenAllAcceptable_thenShouldNotGiveConstraintViolations() {
+ Customer customer = new Customer();
+ customer.setCustomerTypeOfSubset(CustomerType.NEW);
+ Set> violations = validator.validate(customer);
+ assertThat(violations).isEmpty();
+ }
+
+ @Test
+ public void whenAllNull_thenOnlyNotNullShouldGiveConstraintViolations() {
+ Customer customer = new Customer();
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(1);
+
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must not be null")));
+ }
+
+ @Test
+ public void whenAllInvalid_thenViolationsShouldBeReported() {
+ Customer customer = new Customer();
+ customer.setCustomerTypeString("invalid");
+ customer.setCustomerTypeOfSubset(CustomerType.DEFAULT);
+ customer.setCustomerTypeMatchesPattern(CustomerType.OLD);
+
+ Set> violations = validator.validate(customer);
+ assertThat(violations.size()).isEqualTo(3);
+
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeString").and(havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType")));
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must be any of [NEW, OLD]")));
+ assertThat(violations).anyMatch(havingPropertyPath("customerTypeMatchesPattern").and(havingMessage("must match \"NEW|DEFAULT\"")));
+ }
+
+ public static Predicate> havingMessage(String message) {
+ return l -> message.equals(l.getMessage());
+ }
+
+ public static Predicate> havingPropertyPath(String propertyPath) {
+ return l -> propertyPath.equals(l.getPropertyPath()
+ .toString());
+ }
+}
\ No newline at end of file
diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
similarity index 82%
rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java
rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
index 954833fef1..e3a51d4e27 100644
--- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java
+++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java
@@ -1,63 +1,67 @@
-package org.baeldung.javabeanconstraints.test;
-
-import java.util.Set;
-import javax.validation.ConstraintViolation;
-import javax.validation.Validation;
-import javax.validation.Validator;
-import static org.assertj.core.api.Assertions.assertThat;
-import org.baeldung.javabeanconstraints.entities.UserNotBlank;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-public class UserNotBlankUnitTest {
-
- private static Validator validator;
-
- @BeforeClass
- public static void setupValidatorInstance() {
- validator = Validation.buildDefaultValidatorFactory().getValidator();
- }
-
- @Test
- public void whenNotBlankName_thenNoConstraintViolations() {
- UserNotBlank user = new UserNotBlank("John");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(0);
- }
-
- @Test
- public void whenBlankName_thenOneConstraintViolation() {
- UserNotBlank user = new UserNotBlank(" ");
-
- Set> violations = validator.validate(user);
-
- assertThat(violations.size()).isEqualTo(1);
- }
-
- @Test
- public void whenEmptyName_thenOneConstraintViolation() {
- UserNotBlank user = new UserNotBlank("");
-
- Set