diff --git a/README.md b/README.md
index f3fe5e3bf0..378d77196a 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,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 Securiyt.
+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`.
diff --git a/akka-http/README.md b/akka-http/README.md
new file mode 100644
index 0000000000..3831b5079f
--- /dev/null
+++ b/akka-http/README.md
@@ -0,0 +1,3 @@
+## Relevant articles:
+
+- [Introduction to Akka HTTP](https://www.baeldung.com/akka-http)
diff --git a/akka-http/pom.xml b/akka-http/pom.xml
new file mode 100644
index 0000000000..51e70fb583
--- /dev/null
+++ b/akka-http/pom.xml
@@ -0,0 +1,48 @@
+
+
+
+ 4.0.0
+ akka-http
+ akka-http
+
+
+ parent-modules
+ com.baeldung
+ 1.0.0-SNAPSHOT
+
+
+
+
+ com.typesafe.akka
+ akka-http_2.12
+ ${akka.http.version}
+
+
+ com.typesafe.akka
+ akka-stream_2.12
+ 2.5.11
+
+
+ com.typesafe.akka
+ akka-http-jackson_2.12
+ ${akka.http.version}
+
+
+ com.typesafe.akka
+ akka-http-testkit_2.12
+ ${akka.http.version}
+ test
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 10.0.11
+ 2.5.11
+
+
diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/User.java b/akka-http/src/main/java/com/baeldung/akkahttp/User.java
new file mode 100644
index 0000000000..43c21eca62
--- /dev/null
+++ b/akka-http/src/main/java/com/baeldung/akkahttp/User.java
@@ -0,0 +1,26 @@
+package com.baeldung.akkahttp;
+
+public class User {
+
+ private final Long id;
+
+ private final String name;
+
+ public User() {
+ this.name = "";
+ this.id = null;
+ }
+
+ public User(Long id, String name) {
+ this.name = name;
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Long getId() {
+ return id;
+ }
+}
\ No newline at end of file
diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java
new file mode 100644
index 0000000000..431014a88b
--- /dev/null
+++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java
@@ -0,0 +1,41 @@
+package com.baeldung.akkahttp;
+
+import akka.actor.AbstractActor;
+import akka.actor.Props;
+import akka.japi.pf.FI;
+import com.baeldung.akkahttp.UserMessages.ActionPerformed;
+import com.baeldung.akkahttp.UserMessages.CreateUserMessage;
+import com.baeldung.akkahttp.UserMessages.GetUserMessage;
+
+
+class UserActor extends AbstractActor {
+
+ private UserService userService = new UserService();
+
+ static Props props() {
+ return Props.create(UserActor.class);
+ }
+
+ @Override
+ public Receive createReceive() {
+ return receiveBuilder()
+ .match(CreateUserMessage.class, handleCreateUser())
+ .match(GetUserMessage.class, handleGetUser())
+ .build();
+ }
+
+ private FI.UnitApply handleCreateUser() {
+ return createUserMessageMessage -> {
+ userService.createUser(createUserMessageMessage.getUser());
+ sender().tell(new ActionPerformed(String.format("User %s created.", createUserMessageMessage.getUser()
+ .getName())), getSelf());
+ };
+ }
+
+ private FI.UnitApply handleGetUser() {
+ return getUserMessageMessage -> {
+ sender().tell(userService.getUser(getUserMessageMessage.getUserId()), getSelf());
+ };
+ }
+
+}
diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java
new file mode 100644
index 0000000000..995b92bcb0
--- /dev/null
+++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java
@@ -0,0 +1,49 @@
+package com.baeldung.akkahttp;
+
+import java.io.Serializable;
+
+public interface UserMessages {
+
+ class ActionPerformed implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final String description;
+
+ public ActionPerformed(String description) {
+ this.description = description;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+ }
+
+ class CreateUserMessage implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ private final User user;
+
+ public CreateUserMessage(User user) {
+ this.user = user;
+ }
+
+ public User getUser() {
+ return user;
+ }
+ }
+
+ class GetUserMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private final Long userId;
+
+ public GetUserMessage(Long userId) {
+ this.userId = userId;
+ }
+
+ public Long getUserId() {
+ return userId;
+ }
+ }
+
+}
diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java
new file mode 100644
index 0000000000..0c1dbd1f60
--- /dev/null
+++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java
@@ -0,0 +1,70 @@
+package com.baeldung.akkahttp;
+
+import java.util.Optional;
+import java.util.concurrent.CompletionStage;
+import java.util.concurrent.TimeUnit;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.http.javadsl.marshallers.jackson.Jackson;
+import akka.http.javadsl.model.StatusCodes;
+import akka.http.javadsl.server.HttpApp;
+import akka.http.javadsl.server.Route;
+import akka.pattern.PatternsCS;
+import akka.util.Timeout;
+import com.baeldung.akkahttp.UserMessages.ActionPerformed;
+import com.baeldung.akkahttp.UserMessages.CreateUserMessage;
+import com.baeldung.akkahttp.UserMessages.GetUserMessage;
+import scala.concurrent.duration.Duration;
+import static akka.http.javadsl.server.PathMatchers.*;
+
+class UserServer extends HttpApp {
+
+ private final ActorRef userActor;
+
+ Timeout timeout = new Timeout(Duration.create(5, TimeUnit.SECONDS));
+
+ UserServer(ActorRef userActor) {
+ this.userActor = userActor;
+ }
+
+ @Override
+ public Route routes() {
+ return path("users", this::postUser)
+ .orElse(path(segment("users").slash(longSegment()), id ->
+ route(getUser(id))));
+ }
+
+ private Route getUser(Long id) {
+ return get(() -> {
+ CompletionStage> user = PatternsCS.ask(userActor, new GetUserMessage(id), timeout)
+ .thenApply(obj -> (Optional) obj);
+
+ return onSuccess(() -> user, performed -> {
+ if (performed.isPresent())
+ return complete(StatusCodes.OK, performed.get(), Jackson.marshaller());
+ else
+ return complete(StatusCodes.NOT_FOUND);
+ });
+ });
+ }
+
+ private Route postUser() {
+ return route(post(() -> entity(Jackson.unmarshaller(User.class), user -> {
+ CompletionStage userCreated = PatternsCS.ask(userActor, new CreateUserMessage(user), timeout)
+ .thenApply(obj -> (ActionPerformed) obj);
+
+ return onSuccess(() -> userCreated, performed -> {
+ return complete(StatusCodes.CREATED, performed, Jackson.marshaller());
+ });
+ })));
+ }
+
+ public static void main(String[] args) throws Exception {
+ ActorSystem system = ActorSystem.create("userServer");
+ ActorRef userActor = system.actorOf(UserActor.props(), "userActor");
+ UserServer server = new UserServer(userActor);
+ server.startServer("localhost", 8080, system);
+ }
+
+}
diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java
new file mode 100644
index 0000000000..50dc1e1b28
--- /dev/null
+++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java
@@ -0,0 +1,35 @@
+package com.baeldung.akkahttp;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class UserService {
+
+ private final static List users = new ArrayList<>();
+
+ static {
+ users.add(new User(1l, "Alice"));
+ users.add(new User(2l, "Bob"));
+ users.add(new User(3l, "Chris"));
+ users.add(new User(4l, "Dick"));
+ users.add(new User(5l, "Eve"));
+ users.add(new User(6l, "Finn"));
+ }
+
+ public Optional getUser(Long id) {
+ return users.stream()
+ .filter(user -> user.getId()
+ .equals(id))
+ .findFirst();
+ }
+
+ public void createUser(User user) {
+ users.add(user);
+ }
+
+ public List getUsers(){
+ return users;
+ }
+
+}
diff --git a/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java b/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java
new file mode 100644
index 0000000000..1170a2d761
--- /dev/null
+++ b/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.akkahttp;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSystem;
+import akka.http.javadsl.model.ContentTypes;
+import akka.http.javadsl.model.HttpEntities;
+import akka.http.javadsl.model.HttpRequest;
+import akka.http.javadsl.testkit.JUnitRouteTest;
+import akka.http.javadsl.testkit.TestRoute;
+import org.junit.Test;
+
+public class UserServerUnitTest extends JUnitRouteTest {
+
+ ActorSystem system = ActorSystem.create("helloAkkaHttpServer");
+
+ ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor");
+
+ TestRoute appRoute = testRoute(new UserServer(userActorRef).routes());
+
+ @Test
+ public void whenRequest_thenActorResponds() {
+
+ appRoute.run(HttpRequest.GET("/users/1"))
+ .assertEntity(alice())
+ .assertStatusCode(200);
+
+ appRoute.run(HttpRequest.GET("/users/42"))
+ .assertStatusCode(404);
+
+ appRoute.run(HttpRequest.DELETE("/users/1"))
+ .assertStatusCode(200);
+
+ appRoute.run(HttpRequest.DELETE("/users/42"))
+ .assertStatusCode(200);
+
+ appRoute.run(HttpRequest.POST("/users")
+ .withEntity(HttpEntities.create(ContentTypes.APPLICATION_JSON, zaphod())))
+ .assertStatusCode(201);
+
+ }
+
+ private String alice() {
+ return "{\"id\":1,\"name\":\"Alice\"}";
+ }
+
+ private String zaphod() {
+ return "{\"id\":42,\"name\":\"Zaphod\"}";
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md
index a04874c4d2..6f18396005 100644
--- a/algorithms-miscellaneous-1/README.md
+++ b/algorithms-miscellaneous-1/README.md
@@ -10,4 +10,8 @@
- [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)
\ No newline at end of file
+- [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)
+- [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique)
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
new file mode 100644
index 0000000000..7fedd78ffb
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java
@@ -0,0 +1,123 @@
+package com.baeldung.algorithms.permutation;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+public class Permutation {
+
+ public static void printAllRecursive(T[] elements, char delimiter) {
+ printAllRecursive(elements.length, elements, delimiter);
+ }
+
+ public static void printAllRecursive(int n, T[] elements, char delimiter) {
+
+ if(n == 1) {
+ printArray(elements, delimiter);
+ } else {
+ for(int i = 0; i < n-1; i++) {
+ printAllRecursive(n - 1, elements, delimiter);
+ if(n % 2 == 0) {
+ swap(elements, i, n-1);
+ } else {
+ swap(elements, 0, n-1);
+ }
+ }
+ printAllRecursive(n - 1, elements, delimiter);
+ }
+ }
+
+ public static void printAllIterative(int n, T[] elements, char delimiter) {
+
+ int[] indexes = new int[n];
+ for (int i = 0; i < n; i++) {
+ indexes[i] = 0;
+ }
+
+ printArray(elements, delimiter);
+
+ int i = 0;
+ while (i < n) {
+ if (indexes[i] < i) {
+ swap(elements, i % 2 == 0 ? 0: indexes[i], i);
+ printArray(elements, delimiter);
+ indexes[i]++;
+ i = 0;
+ }
+ else {
+ indexes[i] = 0;
+ i++;
+ }
+ }
+ }
+
+ public static > void printAllOrdered(T[] elements, char delimiter) {
+
+ Arrays.sort(elements);
+ boolean hasNext = true;
+
+ while(hasNext) {
+ printArray(elements, delimiter);
+ int k = 0, l = 0;
+ hasNext = false;
+ for (int i = elements.length - 1; i > 0; i--) {
+ if (elements[i].compareTo(elements[i - 1]) > 0) {
+ k = i - 1;
+ hasNext = true;
+ break;
+ }
+ }
+
+ for (int i = elements.length - 1; i > k; i--) {
+ if (elements[i].compareTo(elements[k]) > 0) {
+ l = i;
+ break;
+ }
+ }
+
+ swap(elements, k, l);
+ Collections.reverse(Arrays.asList(elements).subList(k + 1, elements.length));
+ }
+ }
+
+ public static void printRandom(T[] elements, char delimiter) {
+
+ Collections.shuffle(Arrays.asList(elements));
+ printArray(elements, delimiter);
+ }
+
+ private static void swap(T[] elements, int a, int b) {
+
+ T tmp = elements[a];
+ elements[a] = elements[b];
+ elements[b] = tmp;
+ }
+
+ private static void printArray(T[] elements, char delimiter) {
+
+ String delimiterSpace = delimiter + " ";
+ for(int i = 0; i < elements.length; i++) {
+ System.out.print(elements[i] + delimiterSpace);
+ }
+ System.out.print('\n');
+ }
+
+ public static void main(String[] argv) {
+
+ Integer[] elements = {1,2,3,4};
+
+ System.out.println("Rec:");
+ printAllRecursive(elements, ';');
+
+ System.out.println("Iter:");
+ printAllIterative(elements.length, elements, ';');
+
+ System.out.println("Orderes:");
+ printAllOrdered(elements, ';');
+
+ System.out.println("Random:");
+ printRandom(elements, ';');
+
+ System.out.println("Random:");
+ printRandom(elements, ';');
+ }
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java
new file mode 100644
index 0000000000..a7031f4fba
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddle.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+public class LinkedListFindMiddle {
+
+ public T findMiddle(MyNode head) {
+ MyNode slowPointer = head;
+ MyNode fastPointer = head;
+
+ while (fastPointer.next != null && fastPointer.next.next != null) {
+ fastPointer = fastPointer.next.next;
+ slowPointer = slowPointer.next;
+ }
+ return slowPointer.data;
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java
new file mode 100644
index 0000000000..7d93f03ef9
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/MyNode.java
@@ -0,0 +1,20 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+public class MyNode {
+ MyNode next;
+ E data;
+
+ public MyNode(E value) {
+ data = value;
+ next = null;
+ }
+
+ public MyNode(E value, MyNode n) {
+ data = value;
+ next = n;
+ }
+
+ public void setNext(MyNode n) {
+ next = n;
+ }
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java
new file mode 100644
index 0000000000..b4e3698c01
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/RotateArray.java
@@ -0,0 +1,22 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+public class RotateArray {
+
+ public void rotate(int[] input, int step) {
+ step %= input.length;
+ reverse(input, 0, input.length - 1);
+ reverse(input, 0, step - 1);
+ reverse(input, step, input.length - 1);
+ }
+
+ private void reverse(int[] input, int start, int end) {
+ while (start < end) {
+ int temp = input[start];
+ input[start] = input[end];
+ input[end] = temp;
+ start++;
+ end--;
+ }
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java
new file mode 100644
index 0000000000..14eceaa1bd
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/twopointertechnique/TwoSum.java
@@ -0,0 +1,38 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+public class TwoSum {
+
+ public boolean twoSum(int[] input, int targetValue) {
+
+ int pointerOne = 0;
+ int pointerTwo = input.length - 1;
+
+ while (pointerOne < pointerTwo) {
+ int sum = input[pointerOne] + input[pointerTwo];
+
+ if (sum == targetValue) {
+ return true;
+ } else if (sum < targetValue) {
+ pointerOne++;
+ } else {
+ pointerTwo--;
+ }
+ }
+
+ return false;
+ }
+
+ public boolean twoSumSlow(int[] input, int targetValue) {
+
+ for (int i = 0; i < input.length; i++) {
+ for (int j = 1; j < input.length; j++) {
+ if (input[i] + input[j] == targetValue) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java
new file mode 100644
index 0000000000..422a53fa3e
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/LinkedListFindMiddleUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class LinkedListFindMiddleUnitTest {
+
+ LinkedListFindMiddle linkedListFindMiddle = new LinkedListFindMiddle();
+
+ @Test
+ public void givenLinkedListOfMyNodes_whenLinkedListFindMiddle_thenCorrect() {
+
+ MyNode head = createNodesList(8);
+
+ assertThat(linkedListFindMiddle.findMiddle(head)).isEqualTo("4");
+
+ head = createNodesList(9);
+
+ assertThat(linkedListFindMiddle.findMiddle(head)).isEqualTo("5");
+ }
+
+ private static MyNode createNodesList(int n) {
+
+ MyNode head = new MyNode("1");
+ MyNode current = head;
+
+ for (int i = 2; i <= n; i++) {
+ MyNode newNode = new MyNode(String.valueOf(i));
+ current.setNext(newNode);
+ current = newNode;
+ }
+
+ return head;
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java
new file mode 100644
index 0000000000..da227ae751
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/RotateArrayUnitTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+
+public class RotateArrayUnitTest {
+
+ private RotateArray rotateArray = new RotateArray();
+
+ private int[] inputArray;
+
+ private int step;
+
+ @Test
+ public void givenAnArrayOfIntegers_whenRotateKsteps_thenCorrect() {
+
+ inputArray = new int[] { 1, 2, 3, 4, 5, 6, 7 };
+ step = 4;
+
+ rotateArray.rotate(inputArray, step);
+
+ assertThat(inputArray).containsExactly(new int[] { 4, 5, 6, 7, 1, 2, 3 });
+ }
+
+}
diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java
new file mode 100644
index 0000000000..aa76f8e1cf
--- /dev/null
+++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/twopointertechnique/TwoSumUnitTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.algorithms.twopointertechnique;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+public class TwoSumUnitTest {
+
+ private TwoSum twoSum = new TwoSum();
+
+ private int[] sortedArray;
+
+ private int targetValue;
+
+ @Test
+ public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairExists() {
+
+ sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
+
+ targetValue = 12;
+
+ assertTrue(twoSum.twoSumSlow(sortedArray, targetValue));
+ }
+
+ @Test
+ public void givenASortedArrayOfIntegers_whenTwoSumSlow_thenPairDoesNotExists() {
+
+ sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
+
+ targetValue = 20;
+
+ assertFalse(twoSum.twoSumSlow(sortedArray, targetValue));
+ }
+
+ @Test
+ public void givenASortedArrayOfIntegers_whenTwoSum_thenPairExists() {
+
+ sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
+
+ targetValue = 12;
+
+ assertTrue(twoSum.twoSum(sortedArray, targetValue));
+ }
+
+ @Test
+ public void givenASortedArrayOfIntegers_whenTwoSum_thenPairDoesNotExists() {
+
+ sortedArray = new int[] { 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9 };
+
+ targetValue = 20;
+
+ assertFalse(twoSum.twoSum(sortedArray, targetValue));
+ }
+
+}
diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml
index bcca38b199..e6be32277d 100644
--- a/apache-curator/pom.xml
+++ b/apache-curator/pom.xml
@@ -59,7 +59,7 @@
4.0.1
3.4.11
- 2.9.4
+ 2.9.7
3.6.1
1.7.0
diff --git a/apache-spark/pom.xml b/apache-spark/pom.xml
index 290b63a14d..b05b97198d 100644
--- a/apache-spark/pom.xml
+++ b/apache-spark/pom.xml
@@ -15,16 +15,76 @@
-
org.apache.spark
- spark-core_2.10
+ 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-streaming_2.11
+ ${org.apache.spark.spark-streaming.version}
+ provided
+
+
+ org.apache.spark
+ spark-streaming-kafka-0-10_2.11
+ ${org.apache.spark.spark-streaming-kafka.version}
+
+
+ com.datastax.spark
+ spark-cassandra-connector_2.11
+ ${com.datastax.spark.spark-cassandra-connector.version}
+
+
+ com.datastax.spark
+ spark-cassandra-connector-java_2.11
+ ${com.datastax.spark.spark-cassandra-connector-java.version}
+
-
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.2
+
+
+ 1.8
+
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+
+
+
+ jar-with-dependencies
+
+
+
+
+
- 2.2.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/data/pipeline/Word.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java
new file mode 100644
index 0000000000..b0caa468b1
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/Word.java
@@ -0,0 +1,25 @@
+package com.baeldung.data.pipeline;
+
+import java.io.Serializable;
+
+public class Word implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private String word;
+ private int count;
+ Word(String word, int count) {
+ this.word = word;
+ this.count = count;
+ }
+ public String getWord() {
+ return word;
+ }
+ public void setWord(String word) {
+ this.word = word;
+ }
+ public int getCount() {
+ return count;
+ }
+ public void setCount(int count) {
+ this.count = count;
+ }
+}
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java
new file mode 100644
index 0000000000..db2a73b411
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingApp.java
@@ -0,0 +1,80 @@
+package com.baeldung.data.pipeline;
+
+import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions;
+import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.spark.SparkConf;
+import org.apache.spark.api.java.JavaRDD;
+import org.apache.spark.streaming.Durations;
+import org.apache.spark.streaming.api.java.JavaDStream;
+import org.apache.spark.streaming.api.java.JavaInputDStream;
+import org.apache.spark.streaming.api.java.JavaPairDStream;
+import org.apache.spark.streaming.api.java.JavaStreamingContext;
+import org.apache.spark.streaming.kafka010.ConsumerStrategies;
+import org.apache.spark.streaming.kafka010.KafkaUtils;
+import org.apache.spark.streaming.kafka010.LocationStrategies;
+
+import scala.Tuple2;
+
+public class WordCountingApp {
+
+ public static void main(String[] args) throws InterruptedException {
+ Logger.getLogger("org")
+ .setLevel(Level.OFF);
+ Logger.getLogger("akka")
+ .setLevel(Level.OFF);
+
+ Map kafkaParams = new HashMap<>();
+ kafkaParams.put("bootstrap.servers", "localhost:9092");
+ kafkaParams.put("key.deserializer", StringDeserializer.class);
+ kafkaParams.put("value.deserializer", StringDeserializer.class);
+ kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream");
+ kafkaParams.put("auto.offset.reset", "latest");
+ kafkaParams.put("enable.auto.commit", false);
+
+ Collection topics = Arrays.asList("messages");
+
+ SparkConf sparkConf = new SparkConf();
+ sparkConf.setMaster("local[2]");
+ sparkConf.setAppName("WordCountingApp");
+ sparkConf.set("spark.cassandra.connection.host", "127.0.0.1");
+
+ JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(1));
+
+ JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams));
+
+ JavaPairDStream results = messages.mapToPair(record -> new Tuple2<>(record.key(), record.value()));
+
+ JavaDStream lines = results.map(tuple2 -> tuple2._2());
+
+ JavaDStream words = lines.flatMap(x -> Arrays.asList(x.split("\\s+"))
+ .iterator());
+
+ JavaPairDStream wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1))
+ .reduceByKey((i1, i2) -> i1 + i2);
+
+ wordCounts.foreachRDD(javaRdd -> {
+ Map wordCountMap = javaRdd.collectAsMap();
+ for (String key : wordCountMap.keySet()) {
+ List wordList = Arrays.asList(new Word(key, wordCountMap.get(key)));
+ JavaRDD rdd = streamingContext.sparkContext()
+ .parallelize(wordList);
+ javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class))
+ .saveToCassandra();
+ }
+ });
+
+ streamingContext.start();
+ streamingContext.awaitTermination();
+ }
+}
\ No newline at end of file
diff --git a/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java
new file mode 100644
index 0000000000..efbe5f3851
--- /dev/null
+++ b/apache-spark/src/main/java/com/baeldung/data/pipeline/WordCountingAppWithCheckpoint.java
@@ -0,0 +1,97 @@
+package com.baeldung.data.pipeline;
+
+import static com.datastax.spark.connector.japi.CassandraJavaUtil.javaFunctions;
+import static com.datastax.spark.connector.japi.CassandraJavaUtil.mapToRow;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+import org.apache.kafka.common.serialization.StringDeserializer;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.spark.SparkConf;
+import org.apache.spark.api.java.JavaRDD;
+import org.apache.spark.api.java.JavaSparkContext;
+import org.apache.spark.api.java.function.Function2;
+import org.apache.spark.streaming.Durations;
+import org.apache.spark.streaming.StateSpec;
+import org.apache.spark.streaming.api.java.JavaDStream;
+import org.apache.spark.streaming.api.java.JavaInputDStream;
+import org.apache.spark.streaming.api.java.JavaMapWithStateDStream;
+import org.apache.spark.streaming.api.java.JavaPairDStream;
+import org.apache.spark.streaming.api.java.JavaStreamingContext;
+import org.apache.spark.streaming.kafka010.ConsumerStrategies;
+import org.apache.spark.streaming.kafka010.KafkaUtils;
+import org.apache.spark.streaming.kafka010.LocationStrategies;
+
+import scala.Tuple2;
+
+public class WordCountingAppWithCheckpoint {
+
+ public static JavaSparkContext sparkContext;
+
+ public static void main(String[] args) throws InterruptedException {
+
+ Logger.getLogger("org")
+ .setLevel(Level.OFF);
+ Logger.getLogger("akka")
+ .setLevel(Level.OFF);
+
+ Map kafkaParams = new HashMap<>();
+ kafkaParams.put("bootstrap.servers", "localhost:9092");
+ kafkaParams.put("key.deserializer", StringDeserializer.class);
+ kafkaParams.put("value.deserializer", StringDeserializer.class);
+ kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream");
+ kafkaParams.put("auto.offset.reset", "latest");
+ kafkaParams.put("enable.auto.commit", false);
+
+ Collection topics = Arrays.asList("messages");
+
+ SparkConf sparkConf = new SparkConf();
+ sparkConf.setMaster("local[2]");
+ sparkConf.setAppName("WordCountingAppWithCheckpoint");
+ sparkConf.set("spark.cassandra.connection.host", "127.0.0.1");
+
+ JavaStreamingContext streamingContext = new JavaStreamingContext(sparkConf, Durations.seconds(1));
+
+ sparkContext = streamingContext.sparkContext();
+
+ streamingContext.checkpoint("./.checkpoint");
+
+ JavaInputDStream> messages = KafkaUtils.createDirectStream(streamingContext, LocationStrategies.PreferConsistent(), ConsumerStrategies. Subscribe(topics, kafkaParams));
+
+ JavaPairDStream results = messages.mapToPair(record -> new Tuple2<>(record.key(), record.value()));
+
+ JavaDStream lines = results.map(tuple2 -> tuple2._2());
+
+ JavaDStream words = lines.flatMap(x -> Arrays.asList(x.split("\\s+"))
+ .iterator());
+
+ JavaPairDStream wordCounts = words.mapToPair(s -> new Tuple2<>(s, 1))
+ .reduceByKey((Function2) (i1, i2) -> i1 + i2);
+
+ JavaMapWithStateDStream> cumulativeWordCounts = wordCounts.mapWithState(StateSpec.function((word, one, state) -> {
+ int sum = one.orElse(0) + (state.exists() ? state.get() : 0);
+ Tuple2 output = new Tuple2<>(word, sum);
+ state.update(sum);
+ return output;
+ }));
+
+ cumulativeWordCounts.foreachRDD(javaRdd -> {
+ List> wordCountList = javaRdd.collect();
+ for (Tuple2 tuple : wordCountList) {
+ List wordList = Arrays.asList(new Word(tuple._1, tuple._2));
+ JavaRDD rdd = sparkContext.parallelize(wordList);
+ javaFunctions(rdd).writerBuilder("vocabulary", "words", mapToRow(Word.class))
+ .saveToCassandra();
+ }
+ });
+
+ streamingContext.start();
+ streamingContext.awaitTermination();
+ }
+}
\ No newline at end of file
diff --git a/axon/pom.xml b/axon/pom.xml
index c643ea9e57..598dc820e5 100644
--- a/axon/pom.xml
+++ b/axon/pom.xml
@@ -4,29 +4,61 @@
4.0.0
axon
axon
-
+ Basic Axon Framework with Spring Boot configuration tutorial
+
- parent-modules
com.baeldung
- 1.0.0-SNAPSHOT
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+ org.axonframework
+ axon-spring-boot-starter
+ ${axon.version}
+
+
+ org.axonframework
+ axon-server-connector
+
+
+
+
org.axonframework
axon-test
${axon.version}
test
+
- org.axonframework
- axon-core
- ${axon.version}
+ org.springframework.boot
+ spring-boot-autoconfigure
+ 2.1.1.RELEASE
+ compile
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+
+ com.h2database
+ h2
+ runtime
- 3.0.2
+ 4.0.3
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java b/axon/src/main/java/com/baeldung/axon/MessagesRunner.java
deleted file mode 100644
index 77b50d09bd..0000000000
--- a/axon/src/main/java/com/baeldung/axon/MessagesRunner.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.baeldung.axon;
-
-import com.baeldung.axon.aggregates.MessagesAggregate;
-import com.baeldung.axon.commands.CreateMessageCommand;
-import com.baeldung.axon.commands.MarkReadMessageCommand;
-import com.baeldung.axon.eventhandlers.MessagesEventHandler;
-import org.axonframework.commandhandling.AggregateAnnotationCommandHandler;
-import org.axonframework.commandhandling.CommandBus;
-import org.axonframework.commandhandling.SimpleCommandBus;
-import org.axonframework.commandhandling.gateway.CommandGateway;
-import org.axonframework.commandhandling.gateway.DefaultCommandGateway;
-import org.axonframework.eventhandling.AnnotationEventListenerAdapter;
-import org.axonframework.eventsourcing.EventSourcingRepository;
-import org.axonframework.eventsourcing.eventstore.EmbeddedEventStore;
-import org.axonframework.eventsourcing.eventstore.EventStore;
-import org.axonframework.eventsourcing.eventstore.inmemory.InMemoryEventStorageEngine;
-
-import java.util.UUID;
-
-public class MessagesRunner {
-
- public static void main(String[] args) {
- CommandBus commandBus = new SimpleCommandBus();
-
- CommandGateway commandGateway = new DefaultCommandGateway(commandBus);
-
- EventStore eventStore = new EmbeddedEventStore(new InMemoryEventStorageEngine());
-
- EventSourcingRepository repository =
- new EventSourcingRepository<>(MessagesAggregate.class, eventStore);
-
-
- AggregateAnnotationCommandHandler messagesAggregateAggregateAnnotationCommandHandler =
- new AggregateAnnotationCommandHandler(MessagesAggregate.class, repository);
- messagesAggregateAggregateAnnotationCommandHandler.subscribe(commandBus);
-
- final AnnotationEventListenerAdapter annotationEventListenerAdapter =
- new AnnotationEventListenerAdapter(new MessagesEventHandler());
- eventStore.subscribe(eventMessages -> eventMessages.forEach(e -> {
- try {
- annotationEventListenerAdapter.handle(e);
- } catch (Exception e1) {
- throw new RuntimeException(e1);
-
- }
- }
-
- ));
-
- final String itemId = UUID.randomUUID().toString();
- commandGateway.send(new CreateMessageCommand(itemId, "Hello, how is your day? :-)"));
- commandGateway.send(new MarkReadMessageCommand(itemId));
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/OrderApplication.java b/axon/src/main/java/com/baeldung/axon/OrderApplication.java
new file mode 100644
index 0000000000..8f507e141c
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/OrderApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.axon;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class OrderApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(OrderApplication.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java b/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java
deleted file mode 100644
index e762604b74..0000000000
--- a/axon/src/main/java/com/baeldung/axon/aggregates/MessagesAggregate.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.baeldung.axon.aggregates;
-
-import com.baeldung.axon.commands.CreateMessageCommand;
-import com.baeldung.axon.commands.MarkReadMessageCommand;
-import com.baeldung.axon.events.MessageCreatedEvent;
-import com.baeldung.axon.events.MessageReadEvent;
-import org.axonframework.commandhandling.CommandHandler;
-import org.axonframework.commandhandling.model.AggregateIdentifier;
-import org.axonframework.eventhandling.EventHandler;
-
-import static org.axonframework.commandhandling.model.AggregateLifecycle.apply;
-
-
-public class MessagesAggregate {
-
- @AggregateIdentifier
- private String id;
-
- public MessagesAggregate() {
- }
-
- @CommandHandler
- public MessagesAggregate(CreateMessageCommand command) {
- apply(new MessageCreatedEvent(command.getId(), command.getText()));
- }
-
- @EventHandler
- public void on(MessageCreatedEvent event) {
- this.id = event.getId();
- }
-
- @CommandHandler
- public void markRead(MarkReadMessageCommand command) {
- apply(new MessageReadEvent(id));
- }
-}
\ 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
new file mode 100644
index 0000000000..b37b2fdd66
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/commandmodel/OrderAggregate.java
@@ -0,0 +1,58 @@
+package com.baeldung.axon.commandmodel;
+
+import static org.axonframework.modelling.command.AggregateLifecycle.apply;
+
+import org.axonframework.commandhandling.CommandHandler;
+import org.axonframework.eventsourcing.EventSourcingHandler;
+import org.axonframework.modelling.command.AggregateIdentifier;
+import org.axonframework.spring.stereotype.Aggregate;
+
+import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand;
+import com.baeldung.axon.coreapi.commands.PlaceOrderCommand;
+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;
+
+@Aggregate
+public class OrderAggregate {
+
+ @AggregateIdentifier
+ private String orderId;
+ private boolean orderConfirmed;
+
+ @CommandHandler
+ public OrderAggregate(PlaceOrderCommand command) {
+ apply(new OrderPlacedEvent(command.getOrderId(), command.getProduct()));
+ }
+
+ @CommandHandler
+ public void handle(ConfirmOrderCommand command) {
+ apply(new OrderConfirmedEvent(orderId));
+ }
+
+ @CommandHandler
+ public void handle(ShipOrderCommand command) {
+ if (!orderConfirmed) {
+ throw new IllegalStateException("Cannot ship an order which has not been confirmed yet.");
+ }
+
+ apply(new OrderShippedEvent(orderId));
+ }
+
+ @EventSourcingHandler
+ public void on(OrderPlacedEvent event) {
+ this.orderId = event.getOrderId();
+ orderConfirmed = false;
+ }
+
+ @EventSourcingHandler
+ public void on(OrderConfirmedEvent event) {
+ orderConfirmed = true;
+ }
+
+ protected OrderAggregate() {
+ // Required by Axon to build a default Aggregate prior to Event Sourcing
+ }
+
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java
deleted file mode 100644
index d0651bf12e..0000000000
--- a/axon/src/main/java/com/baeldung/axon/commands/CreateMessageCommand.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.axon.commands;
-
-
-import org.axonframework.commandhandling.TargetAggregateIdentifier;
-
-public class CreateMessageCommand {
-
- @TargetAggregateIdentifier
- private final String id;
- private final String text;
-
- public CreateMessageCommand(String id, String text) {
- this.id = id;
- this.text = text;
- }
-
- public String getId() {
- return id;
- }
-
- public String getText() {
- return text;
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java b/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java
deleted file mode 100644
index e66582d9ec..0000000000
--- a/axon/src/main/java/com/baeldung/axon/commands/MarkReadMessageCommand.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.axon.commands;
-
-
-import org.axonframework.commandhandling.TargetAggregateIdentifier;
-
-public class MarkReadMessageCommand {
-
- @TargetAggregateIdentifier
- private final String id;
-
- public MarkReadMessageCommand(String id) {
- this.id = id;
- }
-
- public String getId() {
- return id;
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java
new file mode 100644
index 0000000000..244b69f3b7
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ConfirmOrderCommand.java
@@ -0,0 +1,43 @@
+package com.baeldung.axon.coreapi.commands;
+
+import org.axonframework.modelling.command.TargetAggregateIdentifier;
+
+import java.util.Objects;
+
+public class ConfirmOrderCommand {
+
+ @TargetAggregateIdentifier
+ private final String orderId;
+
+ public ConfirmOrderCommand(String orderId) {
+ this.orderId = orderId;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final ConfirmOrderCommand other = (ConfirmOrderCommand) obj;
+ return Objects.equals(this.orderId, other.orderId);
+ }
+
+ @Override
+ public String toString() {
+ return "ConfirmOrderCommand{" +
+ "orderId='" + orderId + '\'' +
+ '}';
+ }
+}
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java
new file mode 100644
index 0000000000..c70d503050
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/PlaceOrderCommand.java
@@ -0,0 +1,51 @@
+package com.baeldung.axon.coreapi.commands;
+
+import java.util.Objects;
+
+import org.axonframework.modelling.command.TargetAggregateIdentifier;
+
+public class PlaceOrderCommand {
+
+ @TargetAggregateIdentifier
+ private final String orderId;
+ private final String product;
+
+ public PlaceOrderCommand(String orderId, String product) {
+ this.orderId = orderId;
+ this.product = product;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public String getProduct() {
+ return product;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, product);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final PlaceOrderCommand other = (PlaceOrderCommand) obj;
+ return Objects.equals(this.orderId, other.orderId)
+ && Objects.equals(this.product, other.product);
+ }
+
+ @Override
+ public String toString() {
+ return "PlaceOrderCommand{" +
+ "orderId='" + orderId + '\'' +
+ ", product='" + product + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java
new file mode 100644
index 0000000000..7312bc1fdb
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/commands/ShipOrderCommand.java
@@ -0,0 +1,43 @@
+package com.baeldung.axon.coreapi.commands;
+
+import java.util.Objects;
+
+import org.axonframework.modelling.command.TargetAggregateIdentifier;
+
+public class ShipOrderCommand {
+
+ @TargetAggregateIdentifier
+ private final String orderId;
+
+ public ShipOrderCommand(String orderId) {
+ this.orderId = orderId;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final ShipOrderCommand other = (ShipOrderCommand) obj;
+ return Objects.equals(this.orderId, other.orderId);
+ }
+
+ @Override
+ public String toString() {
+ return "ShipOrderCommand{" +
+ "orderId='" + orderId + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java
new file mode 100644
index 0000000000..d2b7d58435
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderConfirmedEvent.java
@@ -0,0 +1,40 @@
+package com.baeldung.axon.coreapi.events;
+
+import java.util.Objects;
+
+public class OrderConfirmedEvent {
+
+ private final String orderId;
+
+ public OrderConfirmedEvent(String orderId) {
+ this.orderId = orderId;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final OrderConfirmedEvent other = (OrderConfirmedEvent) obj;
+ return Objects.equals(this.orderId, other.orderId);
+ }
+
+ @Override
+ public String toString() {
+ return "OrderConfirmedEvent{" +
+ "orderId='" + orderId + '\'' +
+ '}';
+ }
+}
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java
new file mode 100644
index 0000000000..06de4c5f9f
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderPlacedEvent.java
@@ -0,0 +1,48 @@
+package com.baeldung.axon.coreapi.events;
+
+import java.util.Objects;
+
+public class OrderPlacedEvent {
+
+ private final String orderId;
+ private final String product;
+
+ public OrderPlacedEvent(String orderId, String product) {
+ this.orderId = orderId;
+ this.product = product;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public String getProduct() {
+ return product;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, product);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final OrderPlacedEvent other = (OrderPlacedEvent) obj;
+ return Objects.equals(this.orderId, other.orderId)
+ && Objects.equals(this.product, other.product);
+ }
+
+ @Override
+ public String toString() {
+ return "OrderPlacedEvent{" +
+ "orderId='" + orderId + '\'' +
+ ", product='" + product + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java
new file mode 100644
index 0000000000..76aa684629
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/events/OrderShippedEvent.java
@@ -0,0 +1,40 @@
+package com.baeldung.axon.coreapi.events;
+
+import java.util.Objects;
+
+public class OrderShippedEvent {
+
+ private final String orderId;
+
+ public OrderShippedEvent(String orderId) {
+ this.orderId = orderId;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final OrderShippedEvent other = (OrderShippedEvent) obj;
+ return Objects.equals(this.orderId, other.orderId);
+ }
+
+ @Override
+ public String toString() {
+ return "OrderShippedEvent{" +
+ "orderId='" + orderId + '\'' +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java
new file mode 100644
index 0000000000..9d6ca2cfb2
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/FindAllOrderedProductsQuery.java
@@ -0,0 +1,5 @@
+package com.baeldung.axon.coreapi.queries;
+
+public class FindAllOrderedProductsQuery {
+
+}
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java
new file mode 100644
index 0000000000..d215c5fc32
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderStatus.java
@@ -0,0 +1,7 @@
+package com.baeldung.axon.coreapi.queries;
+
+public enum OrderStatus {
+
+ PLACED, CONFIRMED, SHIPPED
+
+}
diff --git a/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java
new file mode 100644
index 0000000000..d847bb2a98
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/coreapi/queries/OrderedProduct.java
@@ -0,0 +1,64 @@
+package com.baeldung.axon.coreapi.queries;
+
+import java.util.Objects;
+
+public class OrderedProduct {
+
+ private final String orderId;
+ private final String product;
+ private OrderStatus orderStatus;
+
+ public OrderedProduct(String orderId, String product) {
+ this.orderId = orderId;
+ this.product = product;
+ orderStatus = OrderStatus.PLACED;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public String getProduct() {
+ return product;
+ }
+
+ public OrderStatus getOrderStatus() {
+ return orderStatus;
+ }
+
+ public void setOrderConfirmed() {
+ this.orderStatus = OrderStatus.CONFIRMED;
+ }
+
+ public void setOrderShipped() {
+ this.orderStatus = OrderStatus.SHIPPED;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(orderId, product, orderStatus);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null || getClass() != obj.getClass()) {
+ return false;
+ }
+ final OrderedProduct other = (OrderedProduct) obj;
+ return Objects.equals(this.orderId, other.orderId)
+ && Objects.equals(this.product, other.product)
+ && Objects.equals(this.orderStatus, other.orderStatus);
+ }
+
+ @Override
+ public String toString() {
+ return "OrderedProduct{" +
+ "orderId='" + orderId + '\'' +
+ ", product='" + product + '\'' +
+ ", orderStatus=" + orderStatus +
+ '}';
+ }
+}
diff --git a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java b/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java
deleted file mode 100644
index 3e51e19c4e..0000000000
--- a/axon/src/main/java/com/baeldung/axon/eventhandlers/MessagesEventHandler.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.axon.eventhandlers;
-
-import com.baeldung.axon.events.MessageReadEvent;
-import com.baeldung.axon.events.MessageCreatedEvent;
-import org.axonframework.eventhandling.EventHandler;
-
-
-public class MessagesEventHandler {
-
- @EventHandler
- public void handle(MessageCreatedEvent event) {
- System.out.println("Message received: " + event.getText() + " (" + event.getId() + ")");
- }
-
- @EventHandler
- public void handle(MessageReadEvent event) {
- System.out.println("Message read: " + event.getId());
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java
deleted file mode 100644
index 3c9aac5ed8..0000000000
--- a/axon/src/main/java/com/baeldung/axon/events/MessageCreatedEvent.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.axon.events;
-
-public class MessageCreatedEvent {
-
- private final String id;
- private final String text;
-
- public MessageCreatedEvent(String id, String text) {
- this.id = id;
- this.text = text;
- }
-
- public String getId() {
- return id;
- }
-
- public String getText() {
- return text;
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java b/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java
deleted file mode 100644
index 57bfc8e19e..0000000000
--- a/axon/src/main/java/com/baeldung/axon/events/MessageReadEvent.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.baeldung.axon.events;
-
-public class MessageReadEvent {
-
- private final String id;
-
- public MessageReadEvent(String id) {
- this.id = id;
- }
-
- public String getId() {
- return id;
- }
-}
\ No newline at end of file
diff --git a/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java
new file mode 100644
index 0000000000..a9f34cc691
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/gui/OrderRestEndpoint.java
@@ -0,0 +1,52 @@
+package com.baeldung.axon.gui;
+
+import java.util.List;
+import java.util.UUID;
+
+import org.axonframework.commandhandling.gateway.CommandGateway;
+import org.axonframework.messaging.responsetypes.ResponseTypes;
+import org.axonframework.queryhandling.QueryGateway;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand;
+import com.baeldung.axon.coreapi.commands.PlaceOrderCommand;
+import com.baeldung.axon.coreapi.commands.ShipOrderCommand;
+import com.baeldung.axon.coreapi.queries.FindAllOrderedProductsQuery;
+import com.baeldung.axon.coreapi.queries.OrderedProduct;
+
+@RestController
+public class OrderRestEndpoint {
+
+ private final CommandGateway commandGateway;
+ private final QueryGateway queryGateway;
+
+ public OrderRestEndpoint(CommandGateway commandGateway, QueryGateway queryGateway) {
+ this.commandGateway = commandGateway;
+ this.queryGateway = queryGateway;
+ }
+
+ @PostMapping("/ship-order")
+ public void shipOrder() {
+ String orderId = UUID.randomUUID().toString();
+ commandGateway.send(new PlaceOrderCommand(orderId, "Deluxe Chair"));
+ commandGateway.send(new ConfirmOrderCommand(orderId));
+ commandGateway.send(new ShipOrderCommand(orderId));
+ }
+
+ @PostMapping("/ship-unconfirmed-order")
+ public void shipUnconfirmedOrder() {
+ String orderId = UUID.randomUUID().toString();
+ commandGateway.send(new PlaceOrderCommand(orderId, "Deluxe Chair"));
+ // This throws an exception, as an Order cannot be shipped if it has not been confirmed yet.
+ commandGateway.send(new ShipOrderCommand(orderId));
+ }
+
+ @GetMapping("/all-orders")
+ public List findAllOrderedProducts() {
+ return queryGateway.query(new FindAllOrderedProductsQuery(), ResponseTypes.multipleInstancesOf(OrderedProduct.class))
+ .join();
+ }
+
+}
diff --git a/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java
new file mode 100644
index 0000000000..d4cf3d999b
--- /dev/null
+++ b/axon/src/main/java/com/baeldung/axon/querymodel/OrderedProductsEventHandler.java
@@ -0,0 +1,50 @@
+package com.baeldung.axon.querymodel;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.axonframework.eventhandling.EventHandler;
+import org.axonframework.queryhandling.QueryHandler;
+import org.springframework.stereotype.Service;
+
+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.queries.FindAllOrderedProductsQuery;
+import com.baeldung.axon.coreapi.queries.OrderedProduct;
+
+@Service
+public class OrderedProductsEventHandler {
+
+ private final Map orderedProducts = new HashMap<>();
+
+ @EventHandler
+ public void on(OrderPlacedEvent event) {
+ String orderId = event.getOrderId();
+ orderedProducts.put(orderId, new OrderedProduct(orderId, event.getProduct()));
+ }
+
+ @EventHandler
+ public void on(OrderConfirmedEvent event) {
+ orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> {
+ orderedProduct.setOrderConfirmed();
+ return orderedProduct;
+ });
+ }
+
+ @EventHandler
+ public void on(OrderShippedEvent event) {
+ orderedProducts.computeIfPresent(event.getOrderId(), (orderId, orderedProduct) -> {
+ orderedProduct.setOrderShipped();
+ return orderedProduct;
+ });
+ }
+
+ @QueryHandler
+ public List handle(FindAllOrderedProductsQuery query) {
+ return new ArrayList<>(orderedProducts.values());
+ }
+
+}
\ No newline at end of file
diff --git a/axon/src/main/resources/order-api.http b/axon/src/main/resources/order-api.http
new file mode 100644
index 0000000000..a3c69c72bc
--- /dev/null
+++ b/axon/src/main/resources/order-api.http
@@ -0,0 +1,11 @@
+POST http://localhost:8080/ship-order
+
+###
+
+POST http://localhost:8080/ship-unconfirmed-order
+
+###
+
+GET http://localhost:8080/all-orders
+
+###
diff --git a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java b/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java
deleted file mode 100644
index ad099d2c2b..0000000000
--- a/axon/src/test/java/com/baeldung/axon/MessagesAggregateIntegrationTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.axon;
-
-import com.baeldung.axon.aggregates.MessagesAggregate;
-import com.baeldung.axon.commands.CreateMessageCommand;
-import com.baeldung.axon.commands.MarkReadMessageCommand;
-import com.baeldung.axon.events.MessageCreatedEvent;
-import com.baeldung.axon.events.MessageReadEvent;
-import org.axonframework.test.aggregate.AggregateTestFixture;
-import org.axonframework.test.aggregate.FixtureConfiguration;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.UUID;
-
-public class MessagesAggregateIntegrationTest {
-
- private FixtureConfiguration fixture;
-
- @Before
- public void setUp() throws Exception {
- fixture = new AggregateTestFixture(MessagesAggregate.class);
-
- }
-
- @Test
- public void giveAggregateRoot_whenCreateMessageCommand_thenShouldProduceMessageCreatedEvent() throws Exception {
- String eventText = "Hello, how is your day?";
- String id = UUID.randomUUID().toString();
- fixture.given()
- .when(new CreateMessageCommand(id, eventText))
- .expectEvents(new MessageCreatedEvent(id, eventText));
- }
-
- @Test
- public void givenMessageCreatedEvent_whenReadMessageCommand_thenShouldProduceMessageReadEvent() throws Exception {
- String id = UUID.randomUUID().toString();
-
- fixture.given(new MessageCreatedEvent(id, "Hello :-)"))
- .when(new MarkReadMessageCommand(id))
- .expectEvents(new MessageReadEvent(id));
- }
-}
\ 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
new file mode 100644
index 0000000000..9beedbaa19
--- /dev/null
+++ b/axon/src/test/java/com/baeldung/axon/commandmodel/OrderAggregateUnitTest.java
@@ -0,0 +1,61 @@
+package com.baeldung.axon.commandmodel;
+
+import java.util.UUID;
+
+import org.axonframework.test.aggregate.AggregateTestFixture;
+import org.axonframework.test.aggregate.FixtureConfiguration;
+import org.junit.*;
+
+import com.baeldung.axon.coreapi.commands.ConfirmOrderCommand;
+import com.baeldung.axon.coreapi.commands.PlaceOrderCommand;
+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;
+
+public class OrderAggregateUnitTest {
+
+ private FixtureConfiguration fixture;
+
+ @Before
+ public void setUp() {
+ fixture = new AggregateTestFixture<>(OrderAggregate.class);
+ }
+
+ @Test
+ public void giveNoPriorActivity_whenPlaceOrderCommand_thenShouldPublishOrderPlacedEvent() {
+ String orderId = UUID.randomUUID().toString();
+ String product = "Deluxe Chair";
+ fixture.givenNoPriorActivity()
+ .when(new PlaceOrderCommand(orderId, product))
+ .expectEvents(new OrderPlacedEvent(orderId, product));
+ }
+
+ @Test
+ public void givenOrderPlacedEvent_whenConfirmOrderCommand_thenShouldPublishOrderConfirmedEvent() {
+ String orderId = UUID.randomUUID().toString();
+ String product = "Deluxe Chair";
+ fixture.given(new OrderPlacedEvent(orderId, product))
+ .when(new ConfirmOrderCommand(orderId))
+ .expectEvents(new OrderConfirmedEvent(orderId));
+ }
+
+ @Test
+ public void givenOrderPlacedEvent_whenShipOrderCommand_thenShouldThrowIllegalStateException() {
+ String orderId = UUID.randomUUID().toString();
+ String product = "Deluxe Chair";
+ fixture.given(new OrderPlacedEvent(orderId, product))
+ .when(new ShipOrderCommand(orderId))
+ .expectException(IllegalStateException.class);
+ }
+
+ @Test
+ public void givenOrderPlacedEventAndOrderConfirmedEvent_whenShipOrderCommand_thenShouldPublishOrderShippedEvent() {
+ String orderId = UUID.randomUUID().toString();
+ String product = "Deluxe Chair";
+ fixture.given(new OrderPlacedEvent(orderId, product), new OrderConfirmedEvent(orderId))
+ .when(new ShipOrderCommand(orderId))
+ .expectEvents(new OrderShippedEvent(orderId));
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-11/README.md b/core-java-11/README.md
index 181ada3f45..c8039f4bc5 100644
--- a/core-java-11/README.md
+++ b/core-java-11/README.md
@@ -2,4 +2,4 @@
- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code)
- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params)
-
+- [Java 11 String API Additions](https://www.baeldung.com/java-11-string-api)
diff --git a/core-java-11/src/main/java/com/baeldung/Outer.java b/core-java-11/src/main/java/com/baeldung/Outer.java
new file mode 100644
index 0000000000..1d3cd72b44
--- /dev/null
+++ b/core-java-11/src/main/java/com/baeldung/Outer.java
@@ -0,0 +1,24 @@
+package com.baeldung;
+
+import java.lang.reflect.Method;
+
+public class Outer {
+
+ public void outerPublic() {
+ }
+
+ private void outerPrivate() {
+ }
+
+ class Inner {
+
+ public void innerPublic() {
+ outerPrivate();
+ }
+
+ public void innerPublicReflection(Outer ob) throws Exception {
+ Method method = ob.getClass().getDeclaredMethod("outerPrivate");
+ method.invoke(ob);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java
new file mode 100644
index 0000000000..9e6bd72680
--- /dev/null
+++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung;
+
+import static org.junit.Assert.assertTrue;
+import static org.hamcrest.CoreMatchers.is;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.junit.Test;
+
+public class OuterUnitTest {
+
+ private static final String NEST_HOST_NAME = "com.baeldung.Outer";
+
+ @Test
+ public void whenGetNestHostFromOuter_thenGetNestHost() {
+ is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME);
+ }
+
+ @Test
+ public void whenGetNestHostFromInner_thenGetNestHost() {
+ is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME);
+ }
+
+ @Test
+ public void whenCheckNestmatesForNestedClasses_thenGetTrue() {
+ is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true);
+ }
+
+ @Test
+ public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() {
+ is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false);
+ }
+
+ @Test
+ public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() {
+ Set nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers())
+ .map(Class::getName)
+ .collect(Collectors.toSet());
+
+ is(nestMembers.size()).equals(2);
+
+ assertTrue(nestMembers.contains("com.baeldung.Outer"));
+ assertTrue(nestMembers.contains("com.baeldung.Outer$Inner"));
+ }
+}
\ No newline at end of file
diff --git a/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java
new file mode 100644
index 0000000000..281155138d
--- /dev/null
+++ b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.optional;
+
+import org.junit.Test;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link Optional} in Java 11.
+ */
+public class OptionalUnitTest {
+
+ @Test
+ public void givenAnEmptyOptional_isEmpty_thenBehavesAsExpected() {
+ Optional opt = Optional.of("Baeldung");
+ assertFalse(opt.isEmpty());
+
+ opt = Optional.ofNullable(null);
+ assertTrue(opt.isEmpty());
+ }
+}
diff --git a/core-java-8/README.md b/core-java-8/README.md
index 6786b29120..892dc71f76 100644
--- a/core-java-8/README.md
+++ b/core-java-8/README.md
@@ -15,7 +15,6 @@
- [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)
-- [Java Base64 Encoding and Decoding](http://www.baeldung.com/java-base64-encode-and-decode)
- [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)
@@ -34,3 +33,8 @@
- [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)
diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml
index 18bdaa15f4..112e8b764d 100644
--- a/core-java-8/pom.xml
+++ b/core-java-8/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
com.baeldung
core-java-8
@@ -104,6 +104,24 @@
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
+
@@ -119,7 +137,7 @@
org.apache.maven.plugins
maven-compiler-plugin
- 3.1
+ ${maven-compiler-plugin.version}
1.8
@@ -142,6 +160,16 @@
+
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar
+
+ true
+
+
@@ -159,9 +187,14 @@
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
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
deleted file mode 100644
index bf0e613567..0000000000
--- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.baeldung.interfaces.polymorphysim;
-
-public class Circle implements Shape {
-
- private double radius;
-
- public Circle(double radius){
- this.radius = radius;
- }
-
- @Override
- public String name() {
- return "Circle";
- }
-
- @Override
- public double area() {
- return Math.PI * (radius * radius);
- }
-
-}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java
deleted file mode 100644
index 2cf4fafee1..0000000000
--- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.interfaces.polymorphysim;
-
-import java.util.ArrayList;
-
-public class DisplayShape {
-
- private ArrayList shapes;
-
- public DisplayShape() {
- shapes = new ArrayList<>();
- }
-
- public void add(Shape shape) {
- shapes.add(shape);
- }
-
- public void display() {
- for (Shape shape : shapes) {
- System.out.println(shape.name() + " area: " + shape.area());
- }
- }
-}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java
deleted file mode 100644
index cc43c1300b..0000000000
--- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.baeldung.interfaces.polymorphysim;
-
-public class MainPolymorphic {
- public static void main(String[] args){
-
- Shape circleShape = new Circle(2);
- Shape squareShape = new Square(2);
-
- DisplayShape displayShape = new DisplayShape();
- displayShape.add(circleShape);
- displayShape.add(squareShape);
-
- displayShape.display();
- }
-}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
deleted file mode 100644
index 9c440150b5..0000000000
--- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.interfaces.polymorphysim;
-
-public class Square implements Shape {
-
- private double width;
-
- public Square(double width) {
- this.width = width;
- }
-
- @Override
- public String name() {
- return "Square";
- }
-
- @Override
- public double area() {
- return width * width;
- }
-}
diff --git a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java
deleted file mode 100644
index 7ded5e6621..0000000000
--- a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.baeldung.interfaces;
-
-import com.baeldung.interfaces.polymorphysim.Circle;
-import com.baeldung.interfaces.polymorphysim.Shape;
-import com.baeldung.interfaces.polymorphysim.Square;
-import org.assertj.core.api.Assertions;
-import org.junit.Test;
-
-public class PolymorphysimUnitTest {
-
- @Test
- public void whenInterfacePointsToCircle_CircleAreaMethodisBeingCalled(){
- double expectedArea = 12.566370614359172;
- Shape circle = new Circle(2);
- double actualArea = circle.area();
- Assertions.assertThat(actualArea).isEqualTo(expectedArea);
- }
-
- @Test
- public void whenInterfacePointsToSquare_SquareAreaMethodisBeingCalled(){
- double expectedArea = 4;
- Shape square = new Square(2);
- double actualArea = square.area();
- Assertions.assertThat(actualArea).isEqualTo(expectedArea);
- }
-}
diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
new file mode 100644
index 0000000000..04c1a0b74e
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.time;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+import static org.powermock.api.mockito.PowerMockito.mockStatic;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({ LocalDateTime.class })
+public class LocalDateTimeUnitTest {
+
+ @Test
+ public void givenLocalDateTimeMock_whenNow_thenGetFixedLocalDateTime() {
+ Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC"));
+ LocalDateTime dateTime = LocalDateTime.now(clock);
+ mockStatic(LocalDateTime.class);
+ when(LocalDateTime.now()).thenReturn(dateTime);
+ String dateTimeExpected = "2014-12-22T10:15:30";
+
+ LocalDateTime now = LocalDateTime.now();
+
+ assertThat(now).isEqualTo(dateTimeExpected);
+ }
+
+ @Test
+ public void givenFixedClock_whenNow_thenGetFixedLocalDateTime() {
+ Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC"));
+ String dateTimeExpected = "2014-12-22T10:15:30";
+
+ LocalDateTime dateTime = LocalDateTime.now(clock);
+
+ assertThat(dateTime).isEqualTo(dateTimeExpected);
+ }
+}
diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java
new file mode 100644
index 0000000000..13861dfd0b
--- /dev/null
+++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.time;
+
+import mockit.Expectations;
+import mockit.Mock;
+import mockit.MockUp;
+import org.junit.jupiter.api.Test;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LocalDateTimeWithJMockUnitTest {
+
+ @Test
+ public void givenLocalDateTimeWithJMock_whenNow_thenGetFixedLocalDateTime() {
+ Clock clock = Clock.fixed(Instant.parse("2014-12-21T10:15:30.00Z"), ZoneId.of("UTC"));
+ new MockUp() {
+ @Mock
+ public LocalDateTime now() {
+ return LocalDateTime.now(clock);
+ }
+ };
+ String dateTimeExpected = "2014-12-21T10:15:30";
+
+ LocalDateTime now = LocalDateTime.now();
+
+ assertThat(now).isEqualTo(dateTimeExpected);
+ }
+
+ @Test
+ public void givenLocalDateTimeWithExpectations_whenNow_thenGetFixedLocalDateTime() {
+ Clock clock = Clock.fixed(Instant.parse("2014-12-23T10:15:30.00Z"), ZoneId.of("UTC"));
+ LocalDateTime dateTimeExpected = LocalDateTime.now(clock);
+ new Expectations(LocalDateTime.class) {
+ {
+ LocalDateTime.now();
+ result = dateTimeExpected;
+ }
+ };
+
+ LocalDateTime now = LocalDateTime.now();
+
+ assertThat(now).isEqualTo(dateTimeExpected);
+ }
+}
diff --git a/core-java-9/README.md b/core-java-9/README.md
index 38816471aa..c96267dc95 100644
--- a/core-java-9/README.md
+++ b/core-java-9/README.md
@@ -9,7 +9,6 @@
- [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods)
- [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors)
- [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java-9-completablefuture)
-- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login)
- [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api)
- [Introduction to Java 9 StackWalking API](http://www.baeldung.com/java-9-stackwalking-api)
- [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity)
diff --git a/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java b/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java
new file mode 100644
index 0000000000..7dbcd2a3a3
--- /dev/null
+++ b/core-java-9/src/main/java/com/baeldung/java9/set/UnmodifiableSet.java
@@ -0,0 +1,44 @@
+package com.baeldung.java9.set;
+
+import com.google.common.collect.ImmutableSet;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+public class UnmodifiableSet {
+
+ public static void main(String[] args) {
+
+ Set set = new HashSet<>();
+ set.add("Canada");
+ set.add("USA");
+
+ coreJDK(set);
+ guavaOf();
+ copyOf(set);
+ java9Of();
+ }
+
+ private static void java9Of() {
+ Set immutable = Set.of("Canada", "USA");
+ System.out.println(immutable);
+ }
+
+ private static void guavaOf() {
+ Set immutable = ImmutableSet.of("Canada", "USA");
+ System.out.println(immutable);
+ }
+
+ private static void copyOf(Set set) {
+ Set immutable = ImmutableSet.copyOf(set);
+ set.add("Costa Rica");
+ System.out.println(immutable);
+ }
+
+ private static void coreJDK(Set set) {
+ Set unmodifiableSet = Collections.unmodifiableSet(set);
+ set.add("Costa Rica");
+ System.out.println(unmodifiableSet);
+ }
+}
diff --git a/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java b/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java
index 9e7e8e6e4b..28e71affcc 100644
--- a/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java
+++ b/core-java-9/src/test/java/com/baeldung/java9/SetExamplesUnitTest.java
@@ -1,5 +1,7 @@
package com.baeldung.java9;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
@@ -23,4 +25,14 @@ public class SetExamplesUnitTest {
Set intSet = Set.of(intArray);
assertEquals(intSet.size(), intArray.length);
}
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void testUnmodifiableSet() {
+ Set set = new HashSet<>();
+ set.add("Canada");
+ set.add("USA");
+
+ Set unmodifiableSet = Collections.unmodifiableSet(set);
+ unmodifiableSet.add("Costa Rica");
+ }
}
diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md
index 56110585ac..400dd7793c 100644
--- a/core-java-arrays/README.md
+++ b/core-java-arrays/README.md
@@ -13,3 +13,4 @@
- [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)
+- [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays)
diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md
new file mode 100644
index 0000000000..a35e714006
--- /dev/null
+++ b/core-java-collections-list/README.md
@@ -0,0 +1,28 @@
+=========
+
+## Core Java Collections List Cookbooks and Examples
+
+### Relevant Articles:
+- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
+- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
+- [Random List Element](http://www.baeldung.com/java-random-list-element)
+- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
+- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
+- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list)
+- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards)
+- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
+- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list)
+- [How to 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)
+- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
+- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
+- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
+- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
+- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
+- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
+- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
+- [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)
diff --git a/core-java-collections-list/pom.xml b/core-java-collections-list/pom.xml
new file mode 100644
index 0000000000..ee99e470d0
--- /dev/null
+++ b/core-java-collections-list/pom.xml
@@ -0,0 +1,48 @@
+
+ 4.0.0
+ core-java-collections-list
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-collections-list
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+ 4.1
+ 3.8.1
+ 1.7.0
+ 3.11.1
+ 1.16.12
+
+
diff --git a/core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java b/core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java
rename to core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java
diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java
rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java
diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java
rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java
rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java
rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/list/Flower.java
rename to core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java
rename to core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java
rename to core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java
rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java
rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java
diff --git a/core-java-8/src/main/java/com/baeldung/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/list/Flower.java
similarity index 100%
rename from core-java-8/src/main/java/com/baeldung/list/Flower.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/Flower.java
diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java
diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java
diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java
diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java
similarity index 100%
rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java
diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
similarity index 51%
rename from core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
rename to core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
index 72045d6761..e11f8e8ba0 100644
--- a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
+++ b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java
@@ -6,30 +6,29 @@ public class ArrayListOfArrayList {
public static void main(String args[]) {
- int vertex = 5;
- ArrayList> graph = new ArrayList<>(vertex);
+ int vertexCount = 3;
+ ArrayList> graph = new ArrayList<>(vertexCount);
//Initializing each element of ArrayList with ArrayList
- for(int i=0; i< vertex; i++) {
+ for(int i = 0; i< vertexCount; i++) {
graph.add(new ArrayList());
}
//We can add any number of columns to each row
graph.get(0).add(1);
- graph.get(0).add(5);
- graph.get(1).add(0);
graph.get(1).add(2);
+ graph.get(2).add(0);
+ graph.get(1).add(0);
graph.get(2).add(1);
- graph.get(2).add(3);
- graph.get(3).add(2);
- graph.get(3).add(4);
- graph.get(4).add(3);
- graph.get(4).add(5);
+ graph.get(0).add(2);
- //Printing all the edges
- for(int i=0; i > > space = new ArrayList<>(x_axis_length);
//Initializing each element of ArrayList with ArrayList< ArrayList >
- for(int i=0; i< x_axis_length; i++) {
+ for(int i = 0; i < x_axis_length; i++) {
space.add(new ArrayList< ArrayList >(y_axis_length));
- for(int j =0; j< y_axis_length; j++) {
+ for(int j = 0; j < y_axis_length; j++) {
space.get(i).add(new ArrayList(z_axis_length));
}
}
//Set Red color for points (0,0,0) and (0,0,1)
- space.get(0).get(0).add("Red");
- space.get(0).get(0).add("Red");
+ space.get(0).get(0).add(0,"Red");
+ space.get(0).get(0).add(1,"Red");
//Set Blue color for points (0,1,0) and (0,1,1)
- space.get(0).get(1).add("Blue");
- space.get(0).get(1).add("Blue");
+ space.get(0).get(1).add(0,"Blue");
+ space.get(0).get(1).add(1,"Blue");
//Set Green color for points (1,0,0) and (1,0,1)
- space.get(1).get(0).add("Green");
- space.get(1).get(0).add("Green");
+ space.get(1).get(0).add(0,"Green");
+ space.get(1).get(0).add(1,"Green");
//Set Yellow color for points (1,1,0) and (1,1,1)
- space.get(1).get(1).add("Yellow");
- space.get(1).get(1).add("Yellow");
+ space.get(1).get(1).add(0,"Yellow");
+ space.get(1).get(1).add(1,"Yellow");
//Printing colors for all the points
- for(int i=0; i
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java
rename to core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java
diff --git a/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java
diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
similarity index 100%
rename from core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java
diff --git a/core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java
similarity index 100%
rename from core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java
diff --git a/core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
rename to core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java
index 6ae7c40f4d..4f5ba0f82f 100644
--- a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java
+++ b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung;
+package org.baeldung;
import com.google.common.collect.Lists;
import org.junit.Test;
diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java
diff --git a/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java
new file mode 100644
index 0000000000..f9c9d3fda8
--- /dev/null
+++ b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java
@@ -0,0 +1,47 @@
+package org.baeldung.java.lists;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.HashSet;
+
+import java.util.stream.Collectors;
+
+public class ListJUnitTest {
+
+ private final List list1 = Arrays.asList("1", "2", "3", "4");
+ private final List list2 = Arrays.asList("1", "2", "3", "4");
+ private final List list3 = Arrays.asList("1", "2", "4", "3");
+
+ @Test
+ public void whenTestingForEquality_ShouldBeEqual() throws Exception {
+ Assert.assertEquals(list1, list2);
+ Assert.assertNotSame(list1, list2);
+ Assert.assertNotEquals(list1, list3);
+ }
+
+ @Test
+ public void whenIntersection_ShouldReturnCommonElements() throws Exception {
+ List list = Arrays.asList("red", "blue", "blue", "green", "red");
+ List otherList = Arrays.asList("red", "green", "green", "yellow");
+
+ Set commonElements = new HashSet(Arrays.asList("red", "green"));
+
+ Set result = list.stream()
+ .distinct()
+ .filter(otherList::contains)
+ .collect(Collectors.toSet());
+
+ Assert.assertEquals(commonElements, result);
+
+ Set inverseResult = otherList.stream()
+ .distinct()
+ .filter(list::contains)
+ .collect(Collectors.toSet());
+
+ Assert.assertEquals(commonElements, inverseResult);
+ }
+}
diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java
rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java
diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/README.md b/core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md
similarity index 100%
rename from core-java-collections/src/test/java/org/baeldung/java/lists/README.md
rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md
diff --git a/core-java-collections/README.md b/core-java-collections/README.md
index 4c0b24cd5d..be83621429 100644
--- a/core-java-collections/README.md
+++ b/core-java-collections/README.md
@@ -3,36 +3,21 @@
## Core Java Collections Cookbooks and Examples
### Relevant Articles:
-- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list)
-- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist)
-- [Random List Element](http://www.baeldung.com/java-random-list-element)
- [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections)
-- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list)
-- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list)
-- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections)
- [HashSet and TreeSet Comparison](http://www.baeldung.com/java-hashset-vs-treeset)
- [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)
- [A Guide to HashSet in Java](http://www.baeldung.com/java-hashset)
- [A Guide to TreeSet in Java](http://www.baeldung.com/java-tree-set)
-- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list)
- [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size)
-- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards)
- [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering)
-- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list)
-- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list)
- [Initializing HashSet at the Time of Construction](http://www.baeldung.com/java-initialize-hashset)
- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element)
- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator)
- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection)
-- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java)
- [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table)
-- [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)
- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections)
-- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list)
- [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe)
-- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list)
- [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)
@@ -40,15 +25,9 @@
- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections)
- [Guide to EnumSet](https://www.baeldung.com/java-enumset)
- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements)
-- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist)
-- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items)
- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections)
- [Sorting in Java](http://www.baeldung.com/java-sorting)
-- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist)
-- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception)
- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split)
-- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality)
-- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line)
-- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist)
- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map)
-- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list)
+- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator)
+- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences)
diff --git a/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java b/core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java
rename to core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java
diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
new file mode 100644
index 0000000000..7debc07911
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java
@@ -0,0 +1,27 @@
+package com.baeldung.java.list;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.Vector;
+
+public class VectorExample {
+
+ public static void main(String[] args) {
+
+ Vector vector = new Vector<>();
+ vector.add("baeldung");
+ vector.add("Vector");
+ vector.add("example");
+
+ Enumeration e = vector.elements();
+ while(e.hasMoreElements()){
+ System.out.println(e.nextElement());
+ }
+
+ Iterator iterator = vector.iterator();
+ while (iterator.hasNext()) {
+ System.out.println(iterator.next());
+ }
+ }
+
+}
diff --git a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
index dddd85007d..331ae8d908 100644
--- a/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
+++ b/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java
@@ -9,7 +9,7 @@ import java.util.*;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
-@OutputTimeUnit(TimeUnit.MICROSECONDS)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10)
public class ArrayListBenchmark {
@@ -17,6 +17,7 @@ public class ArrayListBenchmark {
public static class MyState {
List employeeList = new ArrayList<>();
+ Vector employeeVector = new Vector<>();
//LinkedList employeeList = new LinkedList<>();
long iterations = 100000;
@@ -29,9 +30,11 @@ public class ArrayListBenchmark {
public void setUp() {
for (long i = 0; i < iterations; i++) {
employeeList.add(new Employee(i, "John"));
+ employeeVector.add(new Employee(i, "John"));
}
employeeList.add(employee);
+ employeeVector.add(employee);
employeeIndex = employeeList.indexOf(employee);
}
}
@@ -46,6 +49,11 @@ public class ArrayListBenchmark {
return state.employeeList.contains(state.employee);
}
+ @Benchmark
+ public boolean testContainsVector(ArrayListBenchmark.MyState state) {
+ return state.employeeVector.contains(state.employee);
+ }
+
@Benchmark
public int testIndexOf(ArrayListBenchmark.MyState state) {
return state.employeeList.indexOf(state.employee);
@@ -56,19 +64,24 @@ public class ArrayListBenchmark {
return state.employeeList.get(state.employeeIndex);
}
+ @Benchmark
+ public Employee testVectorGet(ArrayListBenchmark.MyState state) {
+ return state.employeeVector.get(state.employeeIndex);
+ }
+
@Benchmark
public boolean testRemove(ArrayListBenchmark.MyState state) {
return state.employeeList.remove(state.employee);
}
-// @Benchmark
-// public void testAdd(ArrayListBenchmark.MyState state) {
-// state.employeeList.add(new Employee(state.iterations + 1, "John"));
-// }
+ @Benchmark
+ public void testAdd(ArrayListBenchmark.MyState state) {
+ state.employeeList.add(new Employee(state.iterations + 1, "John"));
+ }
public static void main(String[] args) throws Exception {
Options options = new OptionsBuilder()
- .include(ArrayListBenchmark.class.getSimpleName()).threads(1)
+ .include(ArrayListBenchmark.class.getSimpleName()).threads(3)
.forks(1).shouldFailOnError(true)
.shouldDoGC(true)
.jvmArgs("-server").build();
diff --git a/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java
new file mode 100644
index 0000000000..6b088a5079
--- /dev/null
+++ b/core-java-collections/src/main/java/com/baeldung/queueInterface/CustomBaeldungQueue.java
@@ -0,0 +1,48 @@
+package com.baeldung.queueinterface;
+
+import java.util.AbstractQueue;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+public class CustomBaeldungQueue extends AbstractQueue {
+
+ private LinkedList elements;
+
+ public CustomBaeldungQueue() {
+ this.elements = new LinkedList();
+ }
+
+ @Override
+ public Iterator iterator() {
+ return elements.iterator();
+ }
+
+ @Override
+ public int size() {
+ return elements.size();
+ }
+
+ @Override
+ public boolean offer(T t) {
+ if(t == null) return false;
+ elements.add(t);
+ return true;
+ }
+
+ @Override
+ public T poll() {
+
+ Iterator iter = elements.iterator();
+ T t = iter.next();
+ if(t != null){
+ iter.remove();
+ return t;
+ }
+ return null;
+ }
+
+ @Override
+ public T peek() {
+ return elements.getFirst();
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
new file mode 100644
index 0000000000..5218332d60
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java
@@ -0,0 +1,98 @@
+package com.baeldung.hashmapvshashtable;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+public class HashmapVsHashtableDifferenceUnitTest {
+
+ // null values
+ @Test(expected = NullPointerException.class)
+ public void givenHashtable_whenAddNullKey_thenNullPointerExceptionThrown() {
+ Hashtable table = new Hashtable();
+ table.put(null, "value");
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void givenHashtable_whenAddNullValue_thenNullPointerExceptionThrown() {
+ Hashtable table = new Hashtable();
+ table.put("key", null);
+ }
+
+ @Test
+ public void givenHashmap_whenAddNullKeyAndValue_thenObjectAdded() {
+ HashMap map = new HashMap();
+ map.put(null, "value");
+ map.put("key1", null);
+ map.put("key2", null);
+
+ assertEquals(3, map.size());
+ }
+
+ // fail-fast iterator
+ @Test(expected = ConcurrentModificationException.class)
+ public void givenHashmap_whenModifyUnderlyingCollection_thenConcurrentModificationExceptionThrown() {
+ HashMap map = new HashMap();
+ map.put("key1", "value1");
+ map.put("key2", "value2");
+ map.put("key3", "value3");
+
+ Iterator iterator = map.keySet().iterator();
+ while(iterator.hasNext()){
+ iterator.next();
+ map.put("key4", "value4");
+ }
+ }
+
+ @Test
+ public void givenHashtable_whenModifyUnderlyingCollection_thenItHasNoEffectOnIteratedCollection() {
+ Hashtable table = new Hashtable();
+ table.put("key1", "value1");
+ table.put("key2", "value2");
+
+ List keysSelected = Lists.newArrayList();
+ Enumeration keys = table.keys();
+ while (keys.hasMoreElements()) {
+ String key = keys.nextElement();
+ keysSelected.add(key);
+
+ if (key.equals("key1")) {
+ table.put("key3", "value3");
+ }
+ }
+
+ assertEquals(2, keysSelected.size());
+ }
+
+ // synchronized map
+ @Test
+ public void givenHashmap_thenCreateSynchronizedMap() {
+ HashMap map = new HashMap();
+ map.put("key1", "value1");
+ map.put("key2", "value2");
+ map.put("key3", "value3");
+
+ Set> set = map.entrySet();
+ synchronized (map) {
+ Iterator> it = set.iterator();
+ while(it.hasNext()) {
+ Map.Entry elem = (Map.Entry)it.next();
+ }
+ }
+
+ Map syncMap = Collections.synchronizedMap(map);
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
new file mode 100644
index 0000000000..c5b564b55b
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/queueInterface/PriorityQueueUnitTest.java
@@ -0,0 +1,53 @@
+package com.baeldung.queueinterface;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.PriorityQueue;
+
+import static org.junit.Assert.assertEquals;
+
+public class PriorityQueueUnitTest {
+
+
+
+ @Test
+ public void givenIntegerQueue_whenIntegersOutOfOrder_checkRetrievalOrderIsNatural() {
+
+ PriorityQueue integerQueue = new PriorityQueue<>();
+
+ integerQueue.add(9);
+ integerQueue.add(2);
+ integerQueue.add(4);
+
+ int first = integerQueue.poll();
+ int second = integerQueue.poll();
+ int third = integerQueue.poll();
+
+ assertEquals(2, first);
+ assertEquals(4, second);
+ assertEquals(9, third);
+
+
+ }
+
+ @Test
+ public void givenStringQueue_whenStringsAddedOutOfNaturalOrder_checkRetrievalOrderNatural() {
+
+ PriorityQueue stringQueue = new PriorityQueue<>();
+
+ stringQueue.add("banana");
+ stringQueue.add("apple");
+ stringQueue.add("cherry");
+
+ String first = stringQueue.poll();
+ String second = stringQueue.poll();
+ String third = stringQueue.poll();
+
+ assertEquals("apple", first);
+ assertEquals("banana", second);
+ assertEquals("cherry", third);
+
+
+ }
+}
diff --git a/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java b/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java
new file mode 100644
index 0000000000..6dec768542
--- /dev/null
+++ b/core-java-collections/src/test/java/com/baeldung/queueinterface/CustomBaeldungQueueUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.queueinterface;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class CustomBaeldungQueueUnitTest {
+
+ private CustomBaeldungQueue customQueue;
+
+ @Before
+ public void setUp() throws Exception {
+ customQueue = new CustomBaeldungQueue<>();
+ }
+
+ @Test
+ public void givenQueueWithTwoElements_whenElementsRetrieved_checkRetrievalCorrect() {
+
+ customQueue.add(7);
+ customQueue.add(5);
+
+ int first = customQueue.poll();
+ int second = customQueue.poll();
+
+ assertEquals(7, first);
+ assertEquals(5, second);
+
+ }
+}
diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java b/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java
deleted file mode 100644
index 09ecebe47b..0000000000
--- a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.baeldung.java.collections;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Assert;
-import org.junit.Test;
-
-class CollectionsEmpty {
-
- @Test
- public void givenArrayList_whenAddingElement_addsNewElement() {
- ArrayList mutableList = new ArrayList<>();
- mutableList.add("test");
-
- Assert.assertEquals(mutableList.size(), 1);
- Assert.assertEquals(mutableList.get(0), "test");
- }
-
- @Test(expected = UnsupportedOperationException.class)
- public void givenCollectionsEmptyList_whenAddingElement_throwsUnsupportedOperationException() {
- List immutableList = Collections.emptyList();
- immutableList.add("test");
- }
-
-}
diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java
deleted file mode 100644
index 7dddf6c2ce..0000000000
--- a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.baeldung.java.lists;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-
-public class ListJUnitTest {
-
- private final List list1 = Arrays.asList("1", "2", "3", "4");
- private final List list2 = Arrays.asList("1", "2", "3", "4");
- private final List list3 = Arrays.asList("1", "2", "4", "3");
-
- @Test
- public void whenTestingForEquality_ShouldBeEqual() throws Exception {
- Assert.assertEquals(list1, list2);
- Assert.assertNotSame(list1, list2);
- Assert.assertNotEquals(list1, list3);
- }
-}
diff --git a/core-java-concurrency/.gitignore b/core-java-concurrency-advanced/.gitignore
similarity index 100%
rename from core-java-concurrency/.gitignore
rename to core-java-concurrency-advanced/.gitignore
diff --git a/core-java-concurrency/README.md b/core-java-concurrency-advanced/README.md
similarity index 56%
rename from core-java-concurrency/README.md
rename to core-java-concurrency-advanced/README.md
index 2db7b91cde..bcbec9d687 100644
--- a/core-java-concurrency/README.md
+++ b/core-java-concurrency-advanced/README.md
@@ -1,33 +1,24 @@
=========
-## Core Java Concurrency Examples
+## Core Java Concurrency Advanced Examples
### 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)
- [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava)
-- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future)
- [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)
-- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep)
- [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)
-- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized)
- [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 Volatile Keyword in Java](http://www.baeldung.com/java-volatile)
-- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent)
- [Semaphores in Java](http://www.baeldung.com/java-semaphore)
- [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread)
-- [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)
- [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule)
-- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle)
-- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable)
- [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield)
- [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)
+- [A 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)
\ No newline at end of file
diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency-advanced/pom.xml
similarity index 78%
rename from core-java-concurrency/pom.xml
rename to core-java-concurrency-advanced/pom.xml
index bd22253c2c..1209cba619 100644
--- a/core-java-concurrency/pom.xml
+++ b/core-java-concurrency-advanced/pom.xml
@@ -2,10 +2,10 @@
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-concurrency
+ core-java-concurrency-advanced
0.1.0-SNAPSHOT
jar
- core-java-concurrency
+ core-java-concurrency-advanced
com.baeldung
@@ -47,10 +47,20 @@
${avaitility.version}
test
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator-annprocess.version}
+
- core-java-concurrency
+ core-java-concurrency-advanced
src/main/resources
@@ -69,6 +79,8 @@
3.6.1
1.7.0
+ 1.19
+ 1.19
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
similarity index 94%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
index e3a1629ce1..ef6b7ee8c8 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
+++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java
@@ -1,13 +1,13 @@
-package com.baeldung.concurrent.atomic;
-
-public class SafeCounterWithLock {
- private volatile int counter;
-
- int getValue() {
- return counter;
- }
-
- synchronized void increment() {
- counter++;
- }
-}
+package com.baeldung.concurrent.atomic;
+
+public class SafeCounterWithLock {
+ private volatile int counter;
+
+ int getValue() {
+ return counter;
+ }
+
+ synchronized void increment() {
+ counter++;
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
similarity index 96%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
index 18ade35efb..8b2aebba7c 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
+++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java
@@ -1,21 +1,21 @@
-package com.baeldung.concurrent.atomic;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-public class SafeCounterWithoutLock {
- private final AtomicInteger counter = new AtomicInteger(0);
-
- int getValue() {
- return counter.get();
- }
-
- void increment() {
- while(true) {
- int existingValue = getValue();
- int newValue = existingValue + 1;
- if(counter.compareAndSet(existingValue, newValue)) {
- return;
- }
- }
- }
-}
+package com.baeldung.concurrent.atomic;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class SafeCounterWithoutLock {
+ private final AtomicInteger counter = new AtomicInteger(0);
+
+ int getValue() {
+ return counter.get();
+ }
+
+ void increment() {
+ while(true) {
+ int existingValue = getValue();
+ int newValue = existingValue + 1;
+ if(counter.compareAndSet(existingValue, newValue)) {
+ return;
+ }
+ }
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
similarity index 94%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
index 500ef5bd7e..290c26b73d 100644
--- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
+++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java
@@ -1,13 +1,13 @@
-package com.baeldung.concurrent.atomic;
-
-public class UnsafeCounter {
- private int counter;
-
- int getValue() {
- return counter;
- }
-
- void increment() {
- counter++;
- }
-}
+package com.baeldung.concurrent.atomic;
+
+public class UnsafeCounter {
+ private int counter;
+
+ int getValue() {
+ return counter;
+ }
+
+ void increment() {
+ counter++;
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java
diff --git a/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java
new file mode 100644
index 0000000000..a548b5d4a7
--- /dev/null
+++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java
@@ -0,0 +1,20 @@
+package com.baeldung.concurrent.parameter;
+
+import java.util.concurrent.Callable;
+import java.util.stream.IntStream;
+
+public class AverageCalculator implements Callable {
+
+ int[] numbers;
+
+ public AverageCalculator(int... parameter) {
+ this.numbers = parameter == null ? new int[0] : parameter;
+ }
+
+ @Override
+ public Double call() throws Exception {
+ return IntStream.of(this.numbers)
+ .average()
+ .orElse(0d);
+ }
+}
diff --git a/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java
new file mode 100644
index 0000000000..73c61f3fb1
--- /dev/null
+++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java
@@ -0,0 +1,32 @@
+package com.baeldung.concurrent.parameter;
+
+import java.util.concurrent.Callable;
+import java.util.stream.IntStream;
+
+public class ParameterizedThreadExample {
+
+ public static void parameterisedThreadAnonymousClass() {
+ final String parameter = "123";
+ Thread parameterizedThread = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ System.out.println(Thread.currentThread()
+ .getName() + " : " + parameter);
+ }
+ });
+
+ parameterizedThread.start();
+ }
+
+ public static Callable sumCalculator(int... numbers) {
+ return () -> numbers != null ? IntStream.of(numbers)
+ .sum() : 0;
+ }
+
+ public static Callable averageCalculator(int... numbers) {
+ return () -> numbers != null ? IntStream.of(numbers)
+ .average()
+ .orElse(0d) : 0d;
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java
diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java
diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java
diff --git a/core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java
diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java
diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java
rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java
diff --git a/core-java-concurrency/src/main/java/log4j.properties b/core-java-concurrency-advanced/src/main/java/log4j.properties
similarity index 100%
rename from core-java-concurrency/src/main/java/log4j.properties
rename to core-java-concurrency-advanced/src/main/java/log4j.properties
diff --git a/core-java-concurrency/src/main/resources/logback.xml b/core-java-concurrency-advanced/src/main/resources/logback.xml
similarity index 100%
rename from core-java-concurrency/src/main/resources/logback.xml
rename to core-java-concurrency-advanced/src/main/resources/logback.xml
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java
similarity index 97%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java
index 4eead471f8..c3c44b40cf 100644
--- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java
+++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java
@@ -1,38 +1,38 @@
-package com.baeldung.concurrent.atomic;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.IntStream;
-
-import org.junit.Test;
-
-public class ThreadSafeCounterIntegrationTest {
-
- @Test
- public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException {
- ExecutorService service = Executors.newFixedThreadPool(3);
- SafeCounterWithLock safeCounter = new SafeCounterWithLock();
-
- IntStream.range(0, 1000)
- .forEach(count -> service.submit(safeCounter::increment));
- service.awaitTermination(100, TimeUnit.MILLISECONDS);
-
- assertEquals(1000, safeCounter.getValue());
- }
-
- @Test
- public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException {
- ExecutorService service = Executors.newFixedThreadPool(3);
- SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock();
-
- IntStream.range(0, 1000)
- .forEach(count -> service.submit(safeCounter::increment));
- service.awaitTermination(100, TimeUnit.MILLISECONDS);
-
- assertEquals(1000, safeCounter.getValue());
- }
-
-}
+package com.baeldung.concurrent.atomic;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.junit.Test;
+
+public class ThreadSafeCounterIntegrationTest {
+
+ @Test
+ public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException {
+ ExecutorService service = Executors.newFixedThreadPool(3);
+ SafeCounterWithLock safeCounter = new SafeCounterWithLock();
+
+ IntStream.range(0, 1000)
+ .forEach(count -> service.submit(safeCounter::increment));
+ service.awaitTermination(100, TimeUnit.MILLISECONDS);
+
+ assertEquals(1000, safeCounter.getValue());
+ }
+
+ @Test
+ public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException {
+ ExecutorService service = Executors.newFixedThreadPool(3);
+ SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock();
+
+ IntStream.range(0, 1000)
+ .forEach(count -> service.submit(safeCounter::increment));
+ service.awaitTermination(100, TimeUnit.MILLISECONDS);
+
+ assertEquals(1000, safeCounter.getValue());
+ }
+
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
similarity index 97%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
index cc7cc18bb5..bf451e58de 100644
--- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
+++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java
@@ -1,33 +1,33 @@
-package com.baeldung.concurrent.atomic;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.IntStream;
-
-import org.junit.Test;
-
-/**
- * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling
- * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will
- * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads
- * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this
- * test from build by adding this in manual test
- */
-public class ThreadUnsafeCounterManualTest {
-
- @Test
- public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException {
- ExecutorService service = Executors.newFixedThreadPool(3);
- UnsafeCounter unsafeCounter = new UnsafeCounter();
-
- IntStream.range(0, 1000)
- .forEach(count -> service.submit(unsafeCounter::increment));
- service.awaitTermination(100, TimeUnit.MILLISECONDS);
-
- assertEquals(1000, unsafeCounter.getValue());
- }
-
-}
+package com.baeldung.concurrent.atomic;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+import org.junit.Test;
+
+/**
+ * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling
+ * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will
+ * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads
+ * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this
+ * test from build by adding this in manual test
+ */
+public class ThreadUnsafeCounterManualTest {
+
+ @Test
+ public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException {
+ ExecutorService service = Executors.newFixedThreadPool(3);
+ UnsafeCounter unsafeCounter = new UnsafeCounter();
+
+ IntStream.range(0, 1000)
+ .forEach(count -> service.submit(unsafeCounter::increment));
+ service.awaitTermination(100, TimeUnit.MILLISECONDS);
+
+ assertEquals(1000, unsafeCounter.getValue());
+ }
+
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java
diff --git a/core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java
diff --git a/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java
new file mode 100644
index 0000000000..21b374e609
--- /dev/null
+++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java
@@ -0,0 +1,43 @@
+package com.baeldung.parameters;
+
+import com.baeldung.concurrent.parameter.AverageCalculator;
+import org.junit.Test;
+
+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;
+
+public class ParameterizedThreadUnitTest {
+
+ @Test
+ public void whenSendingParameterToCallable_thenSuccessful() throws Exception {
+ ExecutorService executorService = Executors.newSingleThreadExecutor();
+ Future result = executorService.submit(new AverageCalculator(1, 2, 3));
+ try {
+ assertEquals(Double.valueOf(2.0), result.get());
+ } finally {
+ executorService.shutdown();
+ }
+ }
+
+ @Test
+ public void whenParametersToThreadWithLamda_thenParametersPassedCorrectly() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ int[] numbers = new int[] { 4, 5, 6 };
+ try {
+ Future sumResult = executorService.submit(() -> IntStream.of(numbers)
+ .sum());
+ Future averageResult = executorService.submit(() -> IntStream.of(numbers)
+ .average()
+ .orElse(0d));
+ assertEquals(Integer.valueOf(15), sumResult.get());
+ assertEquals(Double.valueOf(5.0), averageResult.get());
+ } finally {
+ executorService.shutdown();
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java
rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java
diff --git a/core-java-concurrency/src/test/resources/.gitignore b/core-java-concurrency-advanced/src/test/resources/.gitignore
similarity index 100%
rename from core-java-concurrency/src/test/resources/.gitignore
rename to core-java-concurrency-advanced/src/test/resources/.gitignore
diff --git a/core-java-concurrency-basic/.gitignore b/core-java-concurrency-basic/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-concurrency-basic/.gitignore
@@ -0,0 +1,26 @@
+*.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
\ No newline at end of file
diff --git a/core-java-concurrency-basic/README.md b/core-java-concurrency-basic/README.md
new file mode 100644
index 0000000000..1c43149d03
--- /dev/null
+++ b/core-java-concurrency-basic/README.md
@@ -0,0 +1,17 @@
+=========
+
+## Core Java Concurrency Basic Examples
+
+### 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 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)
\ No newline at end of file
diff --git a/core-java-concurrency-basic/pom.xml b/core-java-concurrency-basic/pom.xml
new file mode 100644
index 0000000000..3544403aca
--- /dev/null
+++ b/core-java-concurrency-basic/pom.xml
@@ -0,0 +1,55 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-concurrency-basic
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-concurrency-basic
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ com.jayway.awaitility
+ awaitility
+ ${avaitility.version}
+ test
+
+
+
+
+ core-java-concurrency-basic
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.5
+
+ 3.6.1
+ 1.7.0
+
+
+
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java
new file mode 100644
index 0000000000..0c5caba8a0
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/application/Application.java
@@ -0,0 +1,86 @@
+package com.baeldung.concurrent.threadsafety.application;
+
+import com.baeldung.concurrent.threadsafety.callables.AtomicCounterCallable;
+import com.baeldung.concurrent.threadsafety.mathutils.MathUtils;
+import com.baeldung.concurrent.threadsafety.callables.CounterCallable;
+import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable;
+import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable;
+import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable;
+import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable;
+import com.baeldung.concurrent.threadsafety.services.AtomicCounter;
+import com.baeldung.concurrent.threadsafety.services.Counter;
+import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter;
+import com.baeldung.concurrent.threadsafety.services.MessageService;
+import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter;
+import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class Application {
+
+ public static void main(String[] args) throws InterruptedException, ExecutionException {
+
+ new Thread(() -> {
+ System.out.println(MathUtils.factorial(10));
+ }).start();
+ new Thread(() -> {
+ System.out.println(MathUtils.factorial(5));
+ }).start();
+
+ ExecutorService executorService = Executors.newFixedThreadPool(10);
+ MessageService messageService = new MessageService("Welcome to Baeldung!");
+ Future future1 = (Future) executorService.submit(new MessageServiceCallable(messageService));
+ Future future2 = (Future) executorService.submit(new MessageServiceCallable(messageService));
+ System.out.println(future1.get());
+ System.out.println(future2.get());
+
+ Counter counter = new Counter();
+ Future future3 = (Future) executorService.submit(new CounterCallable(counter));
+ Future future4 = (Future) executorService.submit(new CounterCallable(counter));
+ System.out.println(future3.get());
+ System.out.println(future4.get());
+
+ ExtrinsicLockCounter extrinsicLockCounter = new ExtrinsicLockCounter();
+ Future future5 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter));
+ Future future6 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(extrinsicLockCounter));
+ System.out.println(future5.get());
+ System.out.println(future6.get());
+
+ ReentrantLockCounter reentrantLockCounter = new ReentrantLockCounter();
+ Future future7 = (Future) executorService.submit(new ReentrantLockCounterCallable(reentrantLockCounter));
+ Future future8 = (Future) executorService.submit(new ReentrantLockCounterCallable(reentrantLockCounter));
+ System.out.println(future7.get());
+ System.out.println(future8.get());
+
+ ReentrantReadWriteLockCounter reentrantReadWriteLockCounter = new ReentrantReadWriteLockCounter();
+ Future future9 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(reentrantReadWriteLockCounter));
+ Future future10 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(reentrantReadWriteLockCounter));
+ System.out.println(future9.get());
+ System.out.println(future10.get());
+
+ AtomicCounter atomicCounter = new AtomicCounter();
+ Future future11 = (Future) executorService.submit(new AtomicCounterCallable(atomicCounter));
+ Future future12 = (Future) executorService.submit(new AtomicCounterCallable(atomicCounter));
+ System.out.println(future11.get());
+ System.out.println(future12.get());
+
+ Collection syncCollection = Collections.synchronizedCollection(new ArrayList<>());
+ Thread thread11 = new Thread(() -> syncCollection.addAll(Arrays.asList(1, 2, 3, 4, 5, 6)));
+ Thread thread12 = new Thread(() -> syncCollection.addAll(Arrays.asList(1, 2, 3, 4, 5, 6)));
+ thread11.start();
+ thread12.start();
+
+ Map concurrentMap = new ConcurrentHashMap<>();
+ concurrentMap.put("1", "one");
+ concurrentMap.put("2", "two");
+ concurrentMap.put("3", "three");
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java
new file mode 100644
index 0000000000..d711299b5c
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/AtomicCounterCallable.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.AtomicCounter;
+import java.util.concurrent.Callable;
+
+public class AtomicCounterCallable implements Callable {
+
+ private final AtomicCounter counter;
+
+ public AtomicCounterCallable(AtomicCounter counter) {
+ this.counter = counter;
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ counter.incrementCounter();
+ return counter.getCounter();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java
new file mode 100644
index 0000000000..cdcd84a17b
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/CounterCallable.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.Counter;
+import java.util.concurrent.Callable;
+
+public class CounterCallable implements Callable {
+
+ private final Counter counter;
+
+ public CounterCallable(Counter counter) {
+ this.counter = counter;
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ counter.incrementCounter();
+ return counter.getCounter();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java
new file mode 100644
index 0000000000..29533e7630
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ExtrinsicLockCounterCallable.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter;
+import java.util.concurrent.Callable;
+
+public class ExtrinsicLockCounterCallable implements Callable {
+
+ private final ExtrinsicLockCounter counter;
+
+ public ExtrinsicLockCounterCallable(ExtrinsicLockCounter counter) {
+ this.counter = counter;
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ counter.incrementCounter();
+ return counter.getCounter();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java
new file mode 100644
index 0000000000..84e8c7bb51
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/MessageServiceCallable.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.MessageService;
+import java.util.concurrent.Callable;
+
+public class MessageServiceCallable implements Callable {
+
+ private final MessageService messageService;
+
+ public MessageServiceCallable(MessageService messageService) {
+ this.messageService = messageService;
+
+ }
+
+ @Override
+ public String call() {
+ return messageService.getMesssage();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java
new file mode 100644
index 0000000000..e806460d50
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentranReadWriteLockCounterCallable.java
@@ -0,0 +1,20 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter;
+import java.util.concurrent.Callable;
+
+public class ReentranReadWriteLockCounterCallable implements Callable {
+
+ private final ReentrantReadWriteLockCounter counter;
+
+ public ReentranReadWriteLockCounterCallable(ReentrantReadWriteLockCounter counter) {
+ this.counter = counter;
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ counter.incrementCounter();
+ return counter.getCounter();
+ }
+
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java
new file mode 100644
index 0000000000..3511a98c60
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/callables/ReentrantLockCounterCallable.java
@@ -0,0 +1,19 @@
+package com.baeldung.concurrent.threadsafety.callables;
+
+import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter;
+import java.util.concurrent.Callable;
+
+public class ReentrantLockCounterCallable implements Callable {
+
+ private final ReentrantLockCounter counter;
+
+ public ReentrantLockCounterCallable(ReentrantLockCounter counter) {
+ this.counter = counter;
+ }
+
+ @Override
+ public Integer call() throws Exception {
+ counter.incrementCounter();
+ return counter.getCounter();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java
new file mode 100644
index 0000000000..f560cd4281
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/mathutils/MathUtils.java
@@ -0,0 +1,14 @@
+package com.baeldung.concurrent.threadsafety.mathutils;
+
+import java.math.BigInteger;
+
+public class MathUtils {
+
+ public static BigInteger factorial(int number) {
+ BigInteger f = new BigInteger("1");
+ for (int i = 2; i <= number; i++) {
+ f = f.multiply(BigInteger.valueOf(i));
+ }
+ return f;
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java
new file mode 100644
index 0000000000..32a373495c
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/AtomicCounter.java
@@ -0,0 +1,18 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class AtomicCounter {
+
+ private final AtomicInteger counter = new AtomicInteger();
+
+ public AtomicCounter() {}
+
+ public void incrementCounter() {
+ counter.incrementAndGet();
+ }
+
+ public synchronized int getCounter() {
+ return counter.get();
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java
new file mode 100644
index 0000000000..f7dbc05639
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/Counter.java
@@ -0,0 +1,18 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+public class Counter {
+
+ private volatile int counter;
+
+ public Counter() {
+ this.counter = 0;
+ }
+
+ public synchronized void incrementCounter() {
+ counter += 1;
+ }
+
+ public int getCounter() {
+ return counter;
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java
new file mode 100644
index 0000000000..8ab431fbc3
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ExtrinsicLockCounter.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+public class ExtrinsicLockCounter {
+
+ private int counter;
+ private final Object lock = new Object();
+
+ public ExtrinsicLockCounter() {
+ this.counter = 0;
+ }
+
+ public void incrementCounter() {
+ synchronized (lock) {
+ counter += 1;
+ }
+ }
+
+ public int getCounter() {
+ synchronized (lock) {
+ return counter;
+ }
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java
new file mode 100644
index 0000000000..33981381ea
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/MessageService.java
@@ -0,0 +1,14 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+public class MessageService {
+
+ private final String message;
+
+ public MessageService(String message) {
+ this.message = message;
+ }
+
+ public String getMesssage() {
+ return message;
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java
new file mode 100644
index 0000000000..717f0717af
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantLockCounter.java
@@ -0,0 +1,26 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+import java.util.concurrent.locks.ReentrantLock;
+
+public class ReentrantLockCounter {
+
+ private int counter;
+ private final ReentrantLock reLock = new ReentrantLock(true);
+
+ public ReentrantLockCounter() {
+ this.counter = 0;
+ }
+
+ public void incrementCounter() {
+ reLock.lock();
+ try {
+ counter += 1;
+ } finally {
+ reLock.unlock();
+ }
+ }
+
+ public int getCounter() {
+ return counter;
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java
new file mode 100644
index 0000000000..f740c938b1
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/ReentrantReadWriteLockCounter.java
@@ -0,0 +1,34 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+public class ReentrantReadWriteLockCounter {
+
+ private int counter;
+ private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
+ private final Lock readLock = rwLock.readLock();
+ private final Lock writeLock = rwLock.writeLock();
+
+ public ReentrantReadWriteLockCounter() {
+ this.counter = 0;
+ }
+
+ public void incrementCounter() {
+ writeLock.lock();
+ try {
+ counter += 1;
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ public int getCounter() {
+ readLock.lock();
+ try {
+ return counter;
+ } finally {
+ readLock.unlock();
+ }
+ }
+}
diff --git a/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java
new file mode 100644
index 0000000000..5bbff9f39c
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadsafety/services/StateHolder.java
@@ -0,0 +1,14 @@
+package com.baeldung.concurrent.threadsafety.services;
+
+public class StateHolder {
+
+ private final String state;
+
+ public StateHolder(String state) {
+ this.state = state;
+ }
+
+ public String getState() {
+ return state;
+ }
+}
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java
diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
similarity index 100%
rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java
diff --git a/core-java-concurrency-basic/src/main/resources/logback.xml b/core-java-concurrency-basic/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-concurrency-basic/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java
new file mode 100644
index 0000000000..3abbb1bdad
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+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 java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class CounterTest {
+
+ @Test
+ public void whenCalledIncrementCounter_thenCorrect() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ Counter counter = new Counter();
+ Future future1 = (Future) executorService.submit(new CounterCallable(counter));
+ Future future2 = (Future) executorService.submit(new CounterCallable(counter));
+
+ assertThat(future1.get()).isEqualTo(1);
+ assertThat(future2.get()).isEqualTo(2);
+ }
+}
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java
new file mode 100644
index 0000000000..dba90f5b74
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+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 java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class ExtrinsicLockCounterTest {
+
+ @Test
+ public void whenCalledIncrementCounter_thenCorrect() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ ExtrinsicLockCounter counter = new ExtrinsicLockCounter();
+ Future future1 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter));
+ Future future2 = (Future) executorService.submit(new ExtrinsicLockCounterCallable(counter));
+
+ assertThat(future1.get()).isEqualTo(1);
+ assertThat(future2.get()).isEqualTo(2);
+ }
+}
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java
new file mode 100644
index 0000000000..8f3f574b03
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java
@@ -0,0 +1,13 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+import com.baeldung.concurrent.threadsafety.mathutils.MathUtils;
+import org.junit.Test;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class MathUtilsTest {
+
+ @Test
+ public void whenCalledFactorialMethod_thenCorrect() {
+ assertThat(MathUtils.factorial(2)).isEqualTo(2);
+ }
+}
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java
new file mode 100644
index 0000000000..8f1f1a8754
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+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 java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+public class MessageServiceTest {
+
+ @Test
+ public void whenCalledgetMessage_thenCorrect() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ MessageService messageService = new MessageService("Welcome to Baeldung!");
+ Future future1 = (Future) executorService.submit(new MessageServiceCallable(messageService));
+ Future future2 = (Future) executorService.submit(new MessageServiceCallable(messageService));
+
+ assertThat(future1.get()).isEqualTo("Welcome to Baeldung!");
+ assertThat(future2.get()).isEqualTo("Welcome to Baeldung!");
+ }
+}
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java
new file mode 100644
index 0000000000..05c721ab26
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable;
+import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter;
+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 {
+
+ @Test
+ public void whenCalledIncrementCounter_thenCorrect() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ ReentrantLockCounter counter = new ReentrantLockCounter();
+ Future future1 = (Future) executorService.submit(new ReentrantLockCounterCallable(counter));
+ Future future2 = (Future) executorService.submit(new ReentrantLockCounterCallable(counter));
+
+ assertThat(future1.get()).isEqualTo(1);
+ assertThat(future2.get()).isEqualTo(2);
+ }
+}
diff --git a/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java
new file mode 100644
index 0000000000..c56137ce04
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.concurrent.threadsafety.tests;
+
+import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable;
+import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter;
+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 {
+
+ @Test
+ public void whenCalledIncrementCounter_thenCorrect() throws Exception {
+ ExecutorService executorService = Executors.newFixedThreadPool(2);
+ 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);
+ }
+
+}
diff --git a/core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java
diff --git a/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java
similarity index 100%
rename from core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java
rename to core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java
diff --git a/core-java-concurrency-basic/src/test/resources/.gitignore b/core-java-concurrency-basic/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/core-java-concurrency-basic/src/test/resources/.gitignore
@@ -0,0 +1,13 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/core-java-io/README.md b/core-java-io/README.md
index 3d028783ed..2ad980ca6a 100644
--- a/core-java-io/README.md
+++ b/core-java-io/README.md
@@ -35,3 +35,5 @@
- [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream)
- [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
+- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension)
+- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type)
\ No newline at end of file
diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml
index efa32b8e3e..1f2d52de81 100644
--- a/core-java-io/pom.xml
+++ b/core-java-io/pom.xml
@@ -160,6 +160,17 @@
${opencsv.version}
test
+
+
+ org.apache.tika
+ tika-core
+ ${tika.version}
+
+
+ net.sf.jmimemagic
+ jmimemagic
+ ${jmime-magic.version}
+
@@ -236,7 +247,7 @@
- 2.8.5
+ 2.9.7
3.5
@@ -264,6 +275,9 @@
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-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java
new file mode 100644
index 0000000000..fd3678d2c5
--- /dev/null
+++ b/core-java-io/src/main/java/com/baeldung/csv/WriteCsvFileExample.java
@@ -0,0 +1,29 @@
+package com.baeldung.csv;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+
+public class WriteCsvFileExample {
+
+ public void writeLine(BufferedWriter writer, String[] data) throws IOException {
+ StringBuilder csvLine = new StringBuilder();
+
+ for (int i = 0; i < data.length; i++) {
+ if (i > 0) {
+ csvLine.append(",");
+ }
+ csvLine.append(escapeSpecialCharacters(data[i]));
+ }
+
+ writer.write(csvLine.toString());
+ }
+
+ public String escapeSpecialCharacters(String data) {
+ String escapedData = data.replaceAll("\\R", " ");
+ if (data.contains(",") || data.contains("\"") || data.contains("'")) {
+ data = data.replace("\"", "\"\"");
+ escapedData = "\"" + data + "\"";
+ }
+ return escapedData;
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/extension/Extension.java b/core-java-io/src/main/java/com/baeldung/extension/Extension.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/extension/Extension.java
rename to core-java-io/src/main/java/com/baeldung/extension/Extension.java
diff --git a/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
new file mode 100644
index 0000000000..4ac84f939d
--- /dev/null
+++ b/core-java-io/src/test/java/com/baeldung/csv/WriteCsvFileExampleUnitTest.java
@@ -0,0 +1,90 @@
+package com.baeldung.csv;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WriteCsvFileExampleUnitTest {
+ private static final Logger LOG = LoggerFactory.getLogger(WriteCsvFileExampleUnitTest.class);
+
+ private static final String CSV_FILE_NAME = "src/test/resources/exampleOutput.csv";
+ private WriteCsvFileExample csvExample;
+
+ @Before
+ public void setupClass() {
+ csvExample = new WriteCsvFileExample();
+ }
+
+ @Test
+ public void givenCommaContainingData_whenEscapeSpecialCharacters_stringReturnedInQuotes() {
+ String data = "three,two,one";
+ String escapedData = csvExample.escapeSpecialCharacters(data);
+
+ String expectedData = "\"three,two,one\"";
+ assertEquals(expectedData, escapedData);
+ }
+
+ @Test
+ public void givenQuoteContainingData_whenEscapeSpecialCharacters_stringReturnedFormatted() {
+ String data = "She said \"Hello\"";
+ String escapedData = csvExample.escapeSpecialCharacters(data);
+
+ String expectedData = "\"She said \"\"Hello\"\"\"";
+ assertEquals(expectedData, escapedData);
+ }
+
+ @Test
+ public void givenNewlineContainingData_whenEscapeSpecialCharacters_stringReturnedInQuotes() {
+ String dataNewline = "This contains\na newline";
+ String dataCarriageReturn = "This contains\r\na newline and carriage return";
+ String escapedDataNl = csvExample.escapeSpecialCharacters(dataNewline);
+ String escapedDataCr = csvExample.escapeSpecialCharacters(dataCarriageReturn);
+
+ String expectedData = "This contains a newline";
+ assertEquals(expectedData, escapedDataNl);
+ String expectedDataCr = "This contains a newline and carriage return";
+ assertEquals(expectedDataCr, escapedDataCr);
+ }
+
+ @Test
+ public void givenNonSpecialData_whenEscapeSpecialCharacters_stringReturnedUnchanged() {
+ String data = "This is nothing special";
+ String returnedData = csvExample.escapeSpecialCharacters(data);
+
+ assertEquals(data, returnedData);
+ }
+
+ @Test
+ public void givenBufferedWriter_whenWriteLine_thenOutputCreated() {
+ List dataLines = new ArrayList();
+ dataLines.add(new String[] { "John", "Doe", "38", "Comment Data\nAnother line of comment data" });
+ dataLines.add(new String[] { "Jane", "Doe, Jr.", "19", "She said \"I'm being quoted\"" });
+
+ File csvOutputFile = new File(CSV_FILE_NAME);
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvOutputFile))) {
+ for (Iterator dataIterator = dataLines.iterator(); dataIterator.hasNext();) {
+ csvExample.writeLine(writer, dataIterator.next());
+ if (dataIterator.hasNext()) {
+ writer.newLine();
+ }
+ }
+ writer.flush();
+ } catch (IOException e) {
+ LOG.error("IOException " + e.getMessage());
+ }
+
+ assertTrue(csvOutputFile.exists());
+ }
+}
diff --git a/core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java b/core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java
rename to core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java b/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
rename to core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java
diff --git a/core-java/src/test/resources/META-INF/mime.types b/core-java-io/src/test/resources/META-INF/mime.types
similarity index 100%
rename from core-java/src/test/resources/META-INF/mime.types
rename to core-java-io/src/test/resources/META-INF/mime.types
diff --git a/core-java-io/src/test/resources/exampleOutput.csv b/core-java-io/src/test/resources/exampleOutput.csv
new file mode 100644
index 0000000000..45c37f3a3b
--- /dev/null
+++ b/core-java-io/src/test/resources/exampleOutput.csv
@@ -0,0 +1,2 @@
+John,Doe,38,Comment Data Another line of comment data
+Jane,"Doe, Jr.",19,"She said ""I'm being quoted"""
\ No newline at end of file
diff --git a/core-java/src/test/resources/product.png b/core-java-io/src/test/resources/product.png
similarity index 100%
rename from core-java/src/test/resources/product.png
rename to core-java-io/src/test/resources/product.png
diff --git a/core-java-lang-oop/.gitignore b/core-java-lang-oop/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-lang-oop/.gitignore
@@ -0,0 +1,26 @@
+*.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
\ No newline at end of file
diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md
new file mode 100644
index 0000000000..bbc3d26c99
--- /dev/null
+++ b/core-java-lang-oop/README.md
@@ -0,0 +1,24 @@
+=========
+
+## Core Java Lang OOP Cookbooks and Examples
+
+### 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)
+- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
+- [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)
diff --git a/core-java-lang-oop/pom.xml b/core-java-lang-oop/pom.xml
new file mode 100644
index 0000000000..262408c024
--- /dev/null
+++ b/core-java-lang-oop/pom.xml
@@ -0,0 +1,91 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-oop
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-lang-oop
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../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
+
+
+ nl.jqno.equalsverifier
+ equalsverifier
+ ${equalsverifier.version}
+ test
+
+
+
+
+ core-java-lang-oop
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+
+ 2.8.5
+ 2.8.2
+
+
+ 3.5
+ 1.16.12
+
+ 3.10.0
+ 3.0.3
+
+
+
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Animal.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/Animal.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/Cat.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/Dog.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java
diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Mew.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/casting/Mew.java
rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java
rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java
diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java
rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java
diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java
rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java
diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/User.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/deepcopy/User.java
rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java
diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java
rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java
diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java
rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java
diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java
rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java
diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java
rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java
diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java
rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java
diff --git a/core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java
rename to core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java
diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java
rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java
diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java
rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/Car.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java
diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java
diff --git a/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/initializationguide/User.java
rename to core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java
diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java
rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java
diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java
diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java
diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java
diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java
diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java
diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java
diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java
rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java
diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java
rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java
diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java
rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java
diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java
rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java
diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java
rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java
diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java
rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java
diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java
rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java
diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java
diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java
rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java
diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java
rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java
diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java
rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java
diff --git a/core-java-lang-oop/src/main/resources/logback.xml b/core-java-lang-oop/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-lang-oop/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
rename to core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java
diff --git a/core-java-lang-oop/src/test/resources/.gitignore b/core-java-lang-oop/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/core-java-lang-oop/src/test/resources/.gitignore
@@ -0,0 +1,13 @@
+*.class
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+
+# Packaged files #
+*.jar
+*.war
+*.ear
\ No newline at end of file
diff --git a/core-java-lang-syntax/.gitignore b/core-java-lang-syntax/.gitignore
new file mode 100644
index 0000000000..374c8bf907
--- /dev/null
+++ b/core-java-lang-syntax/.gitignore
@@ -0,0 +1,25 @@
+*.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
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-lang-syntax/README.md b/core-java-lang-syntax/README.md
new file mode 100644
index 0000000000..a7c1b7cc4a
--- /dev/null
+++ b/core-java-lang-syntax/README.md
@@ -0,0 +1,19 @@
+=========
+
+## Core Java Lang Syntax Cookbooks and Examples
+
+### Relevant Articles:
+- [Introduction to 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 Java Initialization](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)
+- [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)
\ No newline at end of file
diff --git a/core-java-lang-syntax/pom.xml b/core-java-lang-syntax/pom.xml
new file mode 100644
index 0000000000..9481f29459
--- /dev/null
+++ b/core-java-lang-syntax/pom.xml
@@ -0,0 +1,53 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-lang-syntax
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-lang-syntax
+
+
+ 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
+
+
+
+
+ core-java-lang-syntax
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ 3.10.0
+
+
+
diff --git a/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/Pizza.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/enums/Pizza.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/README.md b/core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/enums/README.md
rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md
diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Building.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/generics/Building.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java
diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Generics.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/generics/Generics.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java
diff --git a/core-java-lang/src/main/java/com/baeldung/generics/House.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/generics/House.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java
diff --git a/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java
new file mode 100644
index 0000000000..e2e3f051dd
--- /dev/null
+++ b/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java
@@ -0,0 +1,53 @@
+package com.baeldung.initializationguide;
+
+import java.io.Serializable;
+
+public class User implements Serializable, Cloneable {
+ private static final long serialVersionUID = 1L;
+ static String forum;
+ private String name;
+ private int id;
+
+ {
+ id = 0;
+ System.out.println("Instance Initializer");
+ }
+
+ static {
+ forum = "Java";
+ System.out.println("Static Initializer");
+ }
+
+ public User(String name, int id) {
+ super();
+ this.name = name;
+ this.id = id;
+ }
+
+ public User() {
+ System.out.println("Constructor");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ return this;
+ }
+
+}
+
diff --git a/core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java
diff --git a/core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java
diff --git a/core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java
diff --git a/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java
similarity index 100%
rename from core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java
rename to core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java
diff --git a/core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java
diff --git a/core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
new file mode 100644
index 0000000000..f74384e6f7
--- /dev/null
+++ b/core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java
@@ -0,0 +1,37 @@
+package com.baeldung.initializationguide;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.lang.reflect.InvocationTargetException;
+
+public class UserUnitTest {
+
+ @Test
+ public void givenUserInstance_whenIntializedWithNew_thenInstanceIsNotNull() {
+ User user = new User("Alice", 1);
+ assertThat(user).isNotNull();
+ }
+
+ @Test
+ public void givenUserInstance_whenInitializedWithReflection_thenInstanceIsNotNull() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+ User user = User.class.getConstructor(String.class, int.class)
+ .newInstance("Alice", 2);
+ assertThat(user).isNotNull();
+ }
+
+ @Test
+ public void givenUserInstance_whenCopiedWithClone_thenExactMatchIsCreated() throws CloneNotSupportedException {
+ User user = new User("Alice", 3);
+ User clonedUser = (User) user.clone();
+ assertThat(clonedUser).isEqualTo(user);
+ }
+
+ @Test
+ public void givenUserInstance_whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault() {
+ User user = new User();
+ assertThat(user.getName()).isNull();
+ assertThat(user.getId() == 0);
+ }
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java
diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java
diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java
diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java
diff --git a/core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java
diff --git a/core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java
diff --git a/core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
similarity index 100%
rename from core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
rename to core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java
diff --git a/core-java-lang/README.md b/core-java-lang/README.md
index 69209bb193..7af962558d 100644
--- a/core-java-lang/README.md
+++ b/core-java-lang/README.md
@@ -4,44 +4,24 @@
### Relevant Articles:
- [Guide to Java Reflection](http://www.baeldung.com/java-reflection)
-- [Introduction to Java Generics](http://www.baeldung.com/java-generics)
- [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)
-- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions)
- [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 hashCode() in Java](http://www.baeldung.com/java-hashcode)
- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator)
-- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static)
- [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable)
- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break)
-- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization)
- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes)
-- [A Guide to Java Loops](http://www.baeldung.com/java-loops)
-- [Varargs in Java](http://www.baeldung.com/java-varargs)
- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces)
-- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism)
- [Recursion In Java](http://www.baeldung.com/java-recursion)
- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize)
-- [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)
- [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)
-- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure)
- [Using Java Assertions](http://www.baeldung.com/java-assert)
-- [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)
- [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)
@@ -50,12 +30,8 @@
- [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)
- [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic)
-- [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)
- [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)
-- [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)
- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name)
-- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts)
+- [Java Compound Operators](https://www.baeldung.com/java-compound-operators)
+- [Guide to Java Packages](https://www.baeldung.com/java-packages)
\ No newline at end of file
diff --git a/core-java/native/nativedatetimeutils.dll b/core-java-lang/native/nativedatetimeutils.dll
similarity index 100%
rename from core-java/native/nativedatetimeutils.dll
rename to core-java-lang/native/nativedatetimeutils.dll
diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml
index 2f307859f1..283acab775 100644
--- a/core-java-lang/pom.xml
+++ b/core-java-lang/pom.xml
@@ -56,22 +56,11 @@
${assertj-core.version}
test
-
- org.springframework
- spring-web
- ${springframework.spring-web.version}
-
javax.mail
mail
${javax.mail.version}
-
- nl.jqno.equalsverifier
- equalsverifier
- ${equalsverifier.version}
- test
-
@@ -82,334 +71,12 @@
true
-
-
-
- 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
-
-
- copy-dependencies
- prepare-package
-
- copy-dependencies
-
-
- ${project.build.directory}/libs
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- ${maven-jar-plugin.version}
-
-
-
- true
- libs/
- org.baeldung.executable.ExecutableMavenJar
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-assembly-plugin
-
-
- package
-
- single
-
-
- ${project.basedir}
-
-
- org.baeldung.executable.ExecutableMavenJar
-
-
-
- jar-with-dependencies
-
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- ${maven-shade-plugin.version}
-
-
-
- shade
-
-
- true
-
-
- org.baeldung.executable.ExecutableMavenJar
-
-
-
-
-
-
-
-
- com.jolira
- onejar-maven-plugin
- ${onejar-maven-plugin.version}
-
-
-
- org.baeldung.executable.ExecutableMavenJar
- true
- ${project.build.finalName}-onejar.${project.packaging}
-
-
- one-jar
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
- ${spring-boot-maven-plugin.version}
-
-
-
- repackage
-
-
- spring-boot
- org.baeldung.executable.ExecutableMavenJar
-
-
-
-
-
-
- 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}
-
-
- 1.8
-
-
-
-
-
- integration
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
-
- integration-test
-
- test
-
-
-
- **/*ManualTest.java
-
-
- **/*IntegrationTest.java
- **/*IntTest.java
-
-
-
-
-
-
- json
-
-
-
-
- org.codehaus.mojo
- exec-maven-plugin
- ${exec-maven-plugin.version}
-
-
- run-benchmarks
-
- none
-
- exec
-
-
- test
- java
-
- -classpath
-
- org.openjdk.jmh.Main
- .*
-
-
-
-
-
-
-
-
-
-
-
- buildAgentLoader
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
- package
-
- jar
-
-
- agentLoader
- target/classes
-
-
- true
-
- ${project.build.outputDirectory}/META-INF/MANIFEST.MF
-
-
-
- com/baeldung/instrumentation/application/AgentLoader.class
- com/baeldung/instrumentation/application/Launcher.class
-
-
-
-
-
-
-
-
-
- buildApplication
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
- package
-
- jar
-
-
- application
- target/classes
-
-
- true
-
- ${project.build.outputDirectory}/META-INF/MANIFEST.MF
-
-
-
- com/baeldung/instrumentation/application/MyAtm.class
- com/baeldung/instrumentation/application/MyAtmApplication.class
- com/baeldung/instrumentation/application/Launcher.class
-
-
-
-
-
-
-
-
-
- buildAgent
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
-
-
- package
-
- jar
-
-
- agent
- target/classes
-
-
- true
-
- ${project.build.outputDirectory}/META-INF/MANIFEST.MF
-
-
-
- com/baeldung/instrumentation/agent/AtmTransformer.class
- com/baeldung/instrumentation/agent/MyInstrumentationAgent.class
-
-
-
-
-
-
-
-
-
-
- 2.8.5
+ 2.9.7
2.8.2
@@ -420,17 +87,6 @@
3.10.0
-
-
- 2.21.0
- 4.3.4.RELEASE
- 3.0.0-M1
- 3.0.2
- 1.4.4
- 3.1.1
- 2.0.3.RELEASE
- 1.6.0
- 3.0.3
diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java
index 83f2a27ea7..bc4515bfc7 100644
--- a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java
+++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java
@@ -30,6 +30,16 @@ public class Loops {
} while (count < 50);
}
+ /**
+ * Splits a sentence in words, and prints each word in a new line.
+ * @param sentence Sentence to print as independent words.
+ */
+ public static void printWordByWord(String sentence) {
+ for (String word : sentence.split(" ")) {
+ System.out.println(word);
+ }
+ }
+
/**
* Prints text an N amount of times. Shows usage of the {@code break} branching statement.
* @param textToPrint Text to repeatedly print.
@@ -45,6 +55,55 @@ public class Loops {
}
}
+ /**
+ * Prints text an N amount of times, up to 50. Shows usage of the {@code break} branching statement.
+ * @param textToPrint Text to repeatedly print.
+ * @param times Amount to times to print received text. If times is higher than 50, textToPrint will only be printed 50 times.
+ */
+ public static void printTextNTimesUpTo50(String textToPrint, int times) {
+ int counter = 1;
+ while (counter < 50) {
+ System.out.println(textToPrint);
+ if (counter == times) {
+ break;
+ }
+ }
+ }
+
+ /**
+ * Finds the index of {@code name} in a list
+ * @param name The name to look for
+ * @param names The list of names
+ * @return The index where the name was found or -1 otherwise
+ */
+ public static int findFirstInstanceOfName(String name, String[] names) {
+ int index = 0;
+ for ( ; index < names.length; index++) {
+ if (names[index].equals(name)) {
+ break;
+ }
+ }
+ return index == names.length ? -1 : index;
+ }
+
+ /**
+ * Takes several names and makes a list, skipping the specified {@code name}.
+ *
+ * @param name The name to skip
+ * @param names The list of names
+ * @return The list of names as a single string, missing the specified {@code name}.
+ */
+ public static String makeListSkippingName(String name, String[] names) {
+ String list = "";
+ for (int i = 0; i < names.length; i++) {
+ if (names[i].equals(name)) {
+ continue;
+ }
+ list += names[i];
+ }
+ return list;
+ }
+
/**
* Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements.
* @param amountToPrint Amount of even numbers to print.
@@ -70,4 +129,29 @@ public class Loops {
}
}
+ /**
+ * Prints an specified amount of even numbers, up to 100. Shows usage of both {@code break} and {@code continue} branching statements.
+ * @param amountToPrint Amount of even numbers to print.
+ */
+ public static void printEvenNumbersToAMaxOf100(int amountToPrint) {
+ if (amountToPrint <= 0) { // Invalid input
+ return;
+ }
+ int iterator = 0;
+ int amountPrinted = 0;
+ while (amountPrinted < 100) {
+ if (iterator % 2 == 0) { // Is an even number
+ System.out.println(iterator);
+ amountPrinted++;
+ iterator++;
+ } else {
+ iterator++;
+ continue; // Won't print
+ }
+ if (amountPrinted == amountToPrint) {
+ break;
+ }
+ }
+ }
+
}
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/values/Element1.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element1.java
new file mode 100644
index 0000000000..6c80adacb1
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/enums/values/Element1.java
@@ -0,0 +1,17 @@
+package com.baeldung.enums.values;
+
+/**
+ * This is a simple enum of periodic table elements
+ */
+public enum Element1 {
+ H,
+ HE,
+ LI,
+ BE,
+ B,
+ C,
+ N,
+ O,
+ F,
+ NE
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/values/Element2.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element2.java
new file mode 100644
index 0000000000..28bf3a475a
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/enums/values/Element2.java
@@ -0,0 +1,52 @@
+package com.baeldung.enums.values;
+
+/**
+ * The simple enum has been enhanced to add the name of the element.
+ */
+public enum Element2 {
+ H("Hydrogen"),
+ HE("Helium"),
+ LI("Lithium"),
+ BE("Beryllium"),
+ B("Boron"),
+ C("Carbon"),
+ N("Nitrogen"),
+ O("Oxygen"),
+ F("Flourine"),
+ NE("Neon");
+
+ /** a final variable to store the label, which can't be changed */
+ public final String label;
+
+ /**
+ * A private constructor that sets the label.
+ * @param label
+ */
+ private Element2(String label) {
+ this.label = label;
+ }
+
+ /**
+ * Look up Element2 instances by the label field. This implementation iterates through
+ * the values() list to find the label.
+ * @param label The label to look up
+ * @return The Element2 instance with the label, or null if not found.
+ */
+ public static Element2 valueOfLabel(String label) {
+ for (Element2 e2 : values()) {
+ if (e2.label.equals(label)) {
+ return e2;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Override the toString() method to return the label instead of the declared name.
+ * @return
+ */
+ @Override
+ public String toString() {
+ return this.label;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/values/Element3.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element3.java
new file mode 100644
index 0000000000..cb98695de8
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/enums/values/Element3.java
@@ -0,0 +1,63 @@
+package com.baeldung.enums.values;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A Map has been added to cache labels for faster lookup.
+ */
+public enum Element3 {
+ H("Hydrogen"),
+ HE("Helium"),
+ LI("Lithium"),
+ BE("Beryllium"),
+ B("Boron"),
+ C("Carbon"),
+ N("Nitrogen"),
+ O("Oxygen"),
+ F("Flourine"),
+ NE("Neon");
+
+ /**
+ * A map to cache labels and their associated Element3 instances.
+ * Note that this only works if the labels are all unique!
+ */
+ private static final Map BY_LABEL = new HashMap<>();
+
+ /** populate the BY_LABEL cache */
+ static {
+ for (Element3 e3 : values()) {
+ BY_LABEL.put(e3.label, e3);
+ }
+ }
+
+ /** a final variable to store the label, which can't be changed */
+ public final String label;
+
+ /**
+ * A private constructor that sets the label.
+ * @param label
+ */
+ private Element3(String label) {
+ this.label = label;
+ }
+
+ /**
+ * Look up Element2 instances by the label field. This implementation finds the
+ * label in the BY_LABEL cache.
+ * @param label The label to look up
+ * @return The Element3 instance with the label, or null if not found.
+ */
+ public static Element3 valueOfLabel(String label) {
+ return BY_LABEL.get(label);
+ }
+
+ /**
+ * Override the toString() method to return the label instead of the declared name.
+ * @return
+ */
+ @Override
+ public String toString() {
+ return this.label;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/values/Element4.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Element4.java
new file mode 100644
index 0000000000..89c45f9d1b
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/enums/values/Element4.java
@@ -0,0 +1,95 @@
+package com.baeldung.enums.values;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Multiple fields have been added and the Labeled interface is implemented.
+ */
+public enum Element4 implements Labeled {
+ H("Hydrogen", 1, 1.008f),
+ HE("Helium", 2, 4.0026f),
+ LI("Lithium", 3, 6.94f),
+ BE("Beryllium", 4, 9.01722f),
+ B("Boron", 5, 10.81f),
+ C("Carbon", 6, 12.011f),
+ N("Nitrogen", 7, 14.007f),
+ O("Oxygen", 8, 15.999f),
+ F("Flourine", 9, 18.998f),
+ NE("Neon", 10, 20.180f);
+ /**
+ * Maps cache labels and their associated Element3 instances.
+ * Note that this only works if the values are all unique!
+ */
+ private static final Map BY_LABEL = new HashMap<>();
+ private static final Map BY_ATOMIC_NUMBER = new HashMap<>();
+ private static final Map BY_ATOMIC_WEIGHT = new HashMap<>();
+
+ /** populate the caches */
+ static {
+ for (Element4 e4 : values()) {
+ BY_LABEL.put(e4.label, e4);
+ BY_ATOMIC_NUMBER.put(e4.atomicNumber, e4);
+ BY_ATOMIC_WEIGHT.put(e4.atomicWeight, e4);
+ }
+ }
+
+ /** final variables to store the values, which can't be changed */
+ public final String label;
+ public final int atomicNumber;
+ public final float atomicWeight;
+
+ private Element4(String label, int atomicNumber, float atomicWeight) {
+ this.label = label;
+ this.atomicNumber = atomicNumber;
+ this.atomicWeight = atomicWeight;
+ }
+
+ /**
+ * Implement the Labeled interface.
+ * @return the label value
+ */
+ @Override
+ public String label() {
+ return label;
+ }
+
+ /**
+ * Look up Element2 instances by the label field. This implementation finds the
+ * label in the BY_LABEL cache.
+ * @param label The label to look up
+ * @return The Element4 instance with the label, or null if not found.
+ */
+ public static Element4 valueOfLabel(String label) {
+ return BY_LABEL.get(label);
+ }
+
+ /**
+ * Look up Element2 instances by the atomicNumber field. This implementation finds the
+ * atomicNUmber in the cache.
+ * @param number The atomicNumber to look up
+ * @return The Element4 instance with the label, or null if not found.
+ */
+ public static Element4 valueOfAtomicNumber(int number) {
+ return BY_ATOMIC_NUMBER.get(number);
+ }
+
+ /**
+ * Look up Element2 instances by the atomicWeight field. This implementation finds the
+ * atomic weight in the cache.
+ * @param weight the atomic weight to look up
+ * @return The Element4 instance with the label, or null if not found.
+ */
+ public static Element4 valueOfAtomicWeight(float weight) {
+ return BY_ATOMIC_WEIGHT.get(weight);
+ }
+
+ /**
+ * Override the toString() method to return the label instead of the declared name.
+ * @return
+ */
+ @Override
+ public String toString() {
+ return this.label;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/enums/values/Labeled.java b/core-java-lang/src/main/java/com/baeldung/enums/values/Labeled.java
new file mode 100644
index 0000000000..e41d6525f1
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/enums/values/Labeled.java
@@ -0,0 +1,5 @@
+package com.baeldung.enums.values;
+
+public interface Labeled {
+ String label();
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java
new file mode 100644
index 0000000000..0bb6560465
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/Box.java
@@ -0,0 +1,5 @@
+package com.baeldung.interfaces;
+
+public interface Box extends HasColor {
+ int getHeight();
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java
new file mode 100644
index 0000000000..8c6bd3f7f3
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/Employee.java
@@ -0,0 +1,14 @@
+package com.baeldung.interfaces;
+
+public class Employee {
+
+ private double salary;
+
+ public double getSalary() {
+ return salary;
+ }
+
+ public void setSalary(double salary) {
+ this.salary = salary;
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
new file mode 100644
index 0000000000..5c841b7c2b
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java
@@ -0,0 +1,17 @@
+package com.baeldung.interfaces;
+
+import java.util.Comparator;
+
+public class EmployeeSalaryComparator implements Comparator {
+
+ @Override
+ public int compare(Employee employeeA, Employee employeeB) {
+ if (employeeA.getSalary() < employeeB.getSalary()) {
+ return -1;
+ } else if (employeeA.getSalary() > employeeB.getSalary()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java
new file mode 100644
index 0000000000..d9688ea866
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/HasColor.java
@@ -0,0 +1,4 @@
+package com.baeldung.interfaces;
+
+public interface HasColor {
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
similarity index 83%
rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
index fb0d36e3e0..d9b30a1e7b 100644
--- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java
@@ -1,6 +1,7 @@
package com.baeldung.interfaces.multiinheritance;
-public class Vehicle implements Fly, Transform {
+public class Car implements Fly,Transform {
+
@Override
public void fly() {
System.out.println("I can Fly!!");
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
similarity index 69%
rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
index d84182aec6..611e51c67b 100644
--- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java
@@ -1,5 +1,6 @@
package com.baeldung.interfaces.multiinheritance;
-public abstract interface Fly{
+public interface Fly {
+
void fly();
}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
similarity index 52%
rename from core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
index a18bbafdc1..8bdba43a05 100644
--- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java
@@ -1,5 +1,10 @@
package com.baeldung.interfaces.multiinheritance;
public interface Transform {
+
void transform();
+
+ default void printSpecs(){
+ System.out.println("Transform Specification");
+ }
}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
new file mode 100644
index 0000000000..be25e112ee
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java
@@ -0,0 +1,4 @@
+package com.baeldung.interfaces.multiinheritance;
+
+public abstract class Vehicle implements Transform {
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
new file mode 100644
index 0000000000..b4d97bd53a
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java
@@ -0,0 +1,9 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public class Circle implements Shape {
+
+ @Override
+ public String name() {
+ return "Circle";
+ }
+}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
new file mode 100644
index 0000000000..5cce3c3af0
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/MainTestClass.java
@@ -0,0 +1,20 @@
+package com.baeldung.interfaces.polymorphysim;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainTestClass {
+
+ public static void main(String[] args) {
+ List shapes = new ArrayList<>();
+ Shape circleShape = new Circle();
+ Shape squareShape = new Square();
+
+ shapes.add(circleShape);
+ shapes.add(squareShape);
+
+ for (Shape shape : shapes) {
+ System.out.println(shape.name());
+ }
+ }
+}
diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
similarity index 51%
rename from core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
rename to core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
index fcb0c65e7b..885dc73de2 100644
--- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java
@@ -1,6 +1,6 @@
package com.baeldung.interfaces.polymorphysim;
public interface Shape {
- public abstract String name();
- public abstract double area();
+
+ String name();
}
diff --git a/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
new file mode 100644
index 0000000000..c17bdd902d
--- /dev/null
+++ b/core-java-lang/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java
@@ -0,0 +1,9 @@
+package com.baeldung.interfaces.polymorphysim;
+
+public class Square implements Shape {
+
+ @Override
+ public String name() {
+ return "Square";
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java
rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java
diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java
rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java
diff --git a/core-java-lang/src/test/java/com/baeldung/enums/values/Element1UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element1UnitTest.java
new file mode 100644
index 0000000000..ab3e684230
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/enums/values/Element1UnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.enums.values;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author chris
+ */
+public class Element1UnitTest {
+
+ public Element1UnitTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void whenAccessingToString_thenItShouldEqualName() {
+ for (Element1 e1 : Element1.values()) {
+ assertEquals(e1.name(), e1.toString());
+ }
+ }
+
+ @Test
+ public void whenCallingValueOf_thenReturnTheCorrectEnum() {
+ for (Element1 e1 : Element1.values()) {
+ assertSame(e1, Element1.valueOf(e1.name()));
+ }
+ }
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/enums/values/Element2UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element2UnitTest.java
new file mode 100644
index 0000000000..02995a2f41
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/enums/values/Element2UnitTest.java
@@ -0,0 +1,59 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.baeldung.enums.values;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ * @author chris
+ */
+public class Element2UnitTest {
+ private static final Logger LOGGER = LoggerFactory.getLogger(Element2UnitTest.class);
+
+ public Element2UnitTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void whenLocatebyLabel_thenReturnCorrectValue() {
+ for (Element2 e2 : Element2.values()) {
+ assertSame(e2, Element2.valueOfLabel(e2.label));
+ }
+ }
+
+ /**
+ * Test of toString method, of class Element2.
+ */
+ @Test
+ public void whenCallingToString_thenReturnLabel() {
+ for (Element2 e2 : Element2.values()) {
+ assertEquals(e2.label, e2.toString());
+ }
+ }
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/enums/values/Element3UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element3UnitTest.java
new file mode 100644
index 0000000000..40c76a97b1
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/enums/values/Element3UnitTest.java
@@ -0,0 +1,57 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.baeldung.enums.values;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author chris
+ */
+public class Element3UnitTest {
+
+ public Element3UnitTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void whenLocatebyLabel_thenReturnCorrectValue() {
+ for (Element3 e3 : Element3.values()) {
+ assertSame(e3, Element3.valueOfLabel(e3.label));
+ }
+ }
+
+ /**
+ * Test of toString method, of class Element3.
+ */
+ @Test
+ public void whenCallingToString_thenReturnLabel() {
+ for (Element3 e3 : Element3.values()) {
+ assertEquals(e3.label, e3.toString());
+ }
+ }
+
+}
diff --git a/core-java-lang/src/test/java/com/baeldung/enums/values/Element4UnitTest.java b/core-java-lang/src/test/java/com/baeldung/enums/values/Element4UnitTest.java
new file mode 100644
index 0000000000..d349dcef72
--- /dev/null
+++ b/core-java-lang/src/test/java/com/baeldung/enums/values/Element4UnitTest.java
@@ -0,0 +1,71 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.baeldung.enums.values;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author chris
+ */
+public class Element4UnitTest {
+
+ public Element4UnitTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void whenLocatebyLabel_thenReturnCorrectValue() {
+ for (Element4 e4 : Element4.values()) {
+ assertSame(e4, Element4.valueOfLabel(e4.label));
+ }
+ }
+
+ @Test
+ public void whenLocatebyAtmNum_thenReturnCorrectValue() {
+ for (Element4 e4 : Element4.values()) {
+ assertSame(e4, Element4.valueOfAtomicNumber(e4.atomicNumber));
+ }
+ }
+
+ @Test
+ public void whenLocatebyAtmWt_thenReturnCorrectValue() {
+ for (Element4 e4 : Element4.values()) {
+ assertSame(e4, Element4.valueOfAtomicWeight(e4.atomicWeight));
+ }
+ }
+
+ /**
+ * Test of toString method, of class Element4.
+ */
+ @Test
+ public void whenCallingToString_thenReturnLabel() {
+ for (Element4 e4 : Element4.values()) {
+ assertEquals(e4.label, e4.toString());
+ }
+ }
+
+}
diff --git a/core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java b/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java
rename to core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java
diff --git a/core-java-networking/README.md b/core-java-networking/README.md
index 626ea794e6..b2367782b6 100644
--- a/core-java-networking/README.md
+++ b/core-java-networking/README.md
@@ -5,3 +5,12 @@
### 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)
+- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding)
+- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request)
\ No newline at end of file
diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml
index 178295e1ec..d9c7c691e9 100644
--- a/core-java-networking/pom.xml
+++ b/core-java-networking/pom.xml
@@ -13,7 +13,37 @@
../parent-java
+
+
+ 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}
+
+
+
core-java-networking
+
+
+ 1.5.0-b01
+ 2.5
+ 3.5
+ 4.3.4.RELEASE
+
diff --git a/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java
new file mode 100644
index 0000000000..394255bd70
--- /dev/null
+++ b/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java
@@ -0,0 +1,65 @@
+package com.baeldung.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.HttpURLConnection;
+import java.util.Iterator;
+import java.util.List;
+
+public class FullResponseBuilder {
+ public static String getFullResponse(HttpURLConnection con) throws IOException {
+ StringBuilder fullResponseBuilder = new StringBuilder();
+
+ fullResponseBuilder.append(con.getResponseCode())
+ .append(" ")
+ .append(con.getResponseMessage())
+ .append("\n");
+
+ con.getHeaderFields()
+ .entrySet()
+ .stream()
+ .filter(entry -> entry.getKey() != null)
+ .forEach(entry -> {
+
+ fullResponseBuilder.append(entry.getKey())
+ .append(": ");
+
+ List headerValues = entry.getValue();
+ Iterator it = headerValues.iterator();
+ if (it.hasNext()) {
+ fullResponseBuilder.append(it.next());
+
+ while (it.hasNext()) {
+ fullResponseBuilder.append(", ")
+ .append(it.next());
+ }
+ }
+
+ fullResponseBuilder.append("\n");
+ });
+
+ Reader streamReader = null;
+
+ if (con.getResponseCode() > 299) {
+ streamReader = new InputStreamReader(con.getErrorStream());
+ } else {
+ streamReader = new InputStreamReader(con.getInputStream());
+ }
+
+ BufferedReader in = new BufferedReader(streamReader);
+ String inputLine;
+ StringBuilder content = new StringBuilder();
+ while ((inputLine = in.readLine()) != null) {
+ content.append(inputLine);
+ }
+
+ in.close();
+
+ fullResponseBuilder.append("Response: ")
+ .append(content);
+
+ return fullResponseBuilder.toString();
+ }
+}
diff --git a/core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java
rename to core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java
diff --git a/core-java/src/main/java/com/baeldung/mail/EmailService.java b/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/mail/EmailService.java
rename to core-java-networking/src/main/java/com/baeldung/mail/EmailService.java
diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java
rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java
diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java
diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java
rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java
diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java
similarity index 98%
rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java
rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java
index 121e0f5d72..91f6e21293 100644
--- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java
+++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.javanetworking.uriurl;
+package com.baeldung.networking.uriurl;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java
similarity index 98%
rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java
rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java
index 109a9951d2..d257e7a295 100644
--- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java
+++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java
@@ -1,4 +1,4 @@
-package com.baeldung.javanetworking.uriurl;
+package com.baeldung.networking.uriurl;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/core-java/src/main/java/com/baeldung/socket/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/socket/EchoClient.java
rename to core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java
diff --git a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java
rename to core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java
diff --git a/core-java/src/main/java/com/baeldung/socket/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/socket/EchoServer.java
rename to core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java
diff --git a/core-java/src/main/java/com/baeldung/socket/GreetClient.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/socket/GreetClient.java
rename to core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java
diff --git a/core-java/src/main/java/com/baeldung/socket/GreetServer.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java
similarity index 100%
rename from core-java/src/main/java/com/baeldung/socket/GreetServer.java
rename to core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java
diff --git a/core-java-networking/src/main/resources/logback.xml b/core-java-networking/src/main/resources/logback.xml
new file mode 100644
index 0000000000..56af2d397e
--- /dev/null
+++ b/core-java-networking/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java b/core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java
rename to core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java
diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
similarity index 64%
rename from core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
index acd6536ac4..bd6c0a4410 100644
--- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java
@@ -1,12 +1,13 @@
package com.baeldung.http;
-import org.apache.commons.lang.StringUtils;
+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.net.CookieManager;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
@@ -48,7 +49,8 @@ public class HttpRequestLiveTest {
in.close();
assertEquals("status code incorrect", status, 200);
- assertTrue("content incorrect", content.toString().contains("Example Domain"));
+ assertTrue("content incorrect", content.toString()
+ .contains("Example Domain"));
}
@Test
@@ -89,18 +91,24 @@ public class HttpRequestLiveTest {
Optional usernameCookie = null;
if (cookiesHeader != null) {
List cookies = HttpCookie.parse(cookiesHeader);
- cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie));
- usernameCookie = cookies.stream().findAny().filter(cookie -> cookie.getName().equals("username"));
+ cookies.forEach(cookie -> cookieManager.getCookieStore()
+ .add(null, cookie));
+ usernameCookie = cookies.stream()
+ .findAny()
+ .filter(cookie -> cookie.getName()
+ .equals("username"));
}
if (usernameCookie == null) {
- cookieManager.getCookieStore().add(null, new HttpCookie("username", "john"));
+ cookieManager.getCookieStore()
+ .add(null, new HttpCookie("username", "john"));
}
con.disconnect();
con = (HttpURLConnection) url.openConnection();
- con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore().getCookies(), ";"));
+ con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore()
+ .getCookies(), ";"));
int status = con.getResponseCode();
@@ -125,4 +133,56 @@ public class HttpRequestLiveTest {
assertEquals("status code incorrect", con.getResponseCode(), 200);
}
+ @Test
+ public void whenFailedRequest_thenOk() throws IOException {
+ URL url = new URL("http://example.com");
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
+ con.setRequestMethod("POST");
+
+ con.setConnectTimeout(5000);
+ con.setReadTimeout(5000);
+
+ int status = con.getResponseCode();
+
+ Reader streamReader = null;
+
+ if (status > 299) {
+ streamReader = new InputStreamReader(con.getErrorStream());
+ } else {
+ streamReader = new InputStreamReader(con.getInputStream());
+ }
+
+ BufferedReader in = new BufferedReader(streamReader);
+ String inputLine;
+ StringBuilder content = new StringBuilder();
+ while ((inputLine = in.readLine()) != null) {
+ content.append(inputLine);
+ }
+ in.close();
+
+ con.disconnect();
+
+ assertEquals("status code incorrect", status, 411);
+ assertTrue("error content", content.toString()
+ .contains("411 - Length Required"));
+ }
+
+ @Test
+ public void whenGetRequestFullResponse_thenOk() throws IOException {
+ URL url = new URL("http://example.com");
+ HttpURLConnection con = (HttpURLConnection) url.openConnection();
+ con.setRequestMethod("GET");
+
+ con.setConnectTimeout(5000);
+ con.setReadTimeout(5000);
+
+ String fullResponse = FullResponseBuilder.getFullResponse(con);
+
+ con.disconnect();
+
+ assertEquals("status code incorrect", con.getResponseCode(), 200);
+ assertTrue("header incorrect", fullResponse.contains("Content-Type: text/html; charset=UTF-8"));
+ assertTrue("response incorrect", fullResponse.contains(""));
+ }
+
}
diff --git a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java
index 8635a24f18..47a598f599 100644
--- a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.networking.interfaces;
+package com.baeldung.networking.interfaces;
import org.junit.Test;
diff --git a/core-java/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java
diff --git a/core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java
diff --git a/core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java
diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java
similarity index 95%
rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java
index 0c312ff613..3b73cc0943 100644
--- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.javanetworking.uriurl.test;
+package com.baeldung.networking.uriurl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -20,7 +20,7 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.baeldung.javanetworking.uriurl.URLDemo;
+import com.baeldung.networking.uriurl.URLDemo;
@FixMethodOrder
public class URIDemoLiveTest {
diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java
index 8837dc5556..ec1cb4c0c9 100644
--- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.javanetworking.uriurl;
+package com.baeldung.networking.uriurl;
import java.io.IOException;
import java.net.MalformedURLException;
diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java
similarity index 97%
rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java
index 15f53ed878..a9104311e6 100644
--- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.javanetworking.uriurl.test;
+package com.baeldung.networking.uriurl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -18,7 +18,7 @@ import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.baeldung.javanetworking.uriurl.URLDemo;
+import com.baeldung.networking.uriurl.URLDemo;
@FixMethodOrder
public class URLDemoLiveTest {
diff --git a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java
similarity index 98%
rename from core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java
rename to core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java
index 505d9595ab..112f2cf53f 100644
--- a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java
+++ b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java
@@ -1,4 +1,4 @@
-package com.baeldung.java.networking.url;
+package com.baeldung.networking.url;
import static org.junit.Assert.assertEquals;
diff --git a/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java
rename to core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java
rename to core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java
diff --git a/core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java
similarity index 100%
rename from core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java
rename to core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java
diff --git a/core-java-perf/README.md b/core-java-perf/README.md
new file mode 100644
index 0000000000..252ee4cc45
--- /dev/null
+++ b/core-java-perf/README.md
@@ -0,0 +1,8 @@
+## Core Java Performance
+
+### 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)
+- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks)
+- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded)
+- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions)
\ No newline at end of file
diff --git a/core-java-perf/pom.xml b/core-java-perf/pom.xml
new file mode 100644
index 0000000000..062f76db77
--- /dev/null
+++ b/core-java-perf/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ com.baeldung
+ core-java-perf
+ 0.1.0-SNAPSHOT
+ jar
+ core-java-perf
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+
+
+
+
+ 3.8.1
+
+
+
+
diff --git a/core-java-perf/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java b/core-java-perf/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java
new file mode 100644
index 0000000000..02c3e96124
--- /dev/null
+++ b/core-java-perf/src/main/java/com/baeldung/flightrecorder/FlightRecorder.java
@@ -0,0 +1,32 @@
+package com.baeldung.flightrecorder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Simple program that illustrates how to use Java Flight Recorder.
+ *
+ * This programs creates a list, inserts objects in it until
+ * an OutOfMemoryError is thrown.
+ *
+ */
+public class FlightRecorder {
+
+ public static void main(String[] args) {
+ List