From a11b2d812be30138e980285d2ebc76fdaa864e87 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 12:56:55 -0400
Subject: [PATCH 01/26] Add architecture module with Hexagonal example
---
architecture/README.md | 3 ++
architecture/pom.xml | 33 ++++++++++++
.../HexagonalArchitectureTaskApplication.java | 12 +++++
.../application/task/AddNewDailyTask.java | 29 ++++++++++
.../application/task/AddNewTask.java | 22 ++++++++
.../application/task/GetTasks.java | 22 ++++++++
.../commands/task/CreateTask.java | 7 +++
.../commands/task/GetAllTasks.java | 7 +++
.../architecture/domain/task/Task.java | 53 +++++++++++++++++++
.../domain/task/TaskRepository.java | 7 +++
.../architecture/domain/task/TaskService.java | 22 ++++++++
.../framework/cli/StartupRunner.java | 25 +++++++++
.../http/task/TaskApiController.java | 42 +++++++++++++++
.../framework/http/task/TaskRequest.java | 29 ++++++++++
14 files changed, 313 insertions(+)
create mode 100644 architecture/README.md
create mode 100644 architecture/pom.xml
create mode 100644 architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
create mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
diff --git a/architecture/README.md b/architecture/README.md
new file mode 100644
index 0000000000..be093f25ed
--- /dev/null
+++ b/architecture/README.md
@@ -0,0 +1,3 @@
+### Relevant articles
+
+- [A Quick and Practical Example of Hexagonal Architecture in Java](https://www.baeldung.com/a-quick-and-practical-example-of-hexagonal-architecture-in-java-3/)
diff --git a/architecture/pom.xml b/architecture/pom.xml
new file mode 100644
index 0000000000..4ad104293e
--- /dev/null
+++ b/architecture/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ com.baeldung.architecture
+ architecture
+ 0.0.1-SNAPSHOT
+ architecture
+ jar
+ A Quick and Practical Example of Hexagonal Architecture in Java
+
+
+ parent-boot-2
+ com.baeldung
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ com.h2database
+ h2
+ runtime
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
new file mode 100644
index 0000000000..83e4fc4c0b
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.architecture;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class HexagonalArchitectureTaskApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
+ }
+
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
new file mode 100644
index 0000000000..208d1bfcc9
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
@@ -0,0 +1,29 @@
+package com.baeldung.architecture.application.task;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
+import com.baeldung.architecture.commands.task.CreateTask;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class AddNewDailyTask implements CreateTask {
+
+ private AddNewTask addNewTask;
+
+ public AddNewDailyTask(AddNewTask addNewTask) {
+ this.addNewTask = addNewTask;
+ }
+
+ @Override
+ public void create(Task newTask) {
+ Instant initialDueDate = newTask.getDueDate();
+ String description = newTask.getDescription();
+ for (int i = 1; i <= 5; i++) {
+ Task task = new Task(initialDueDate.plus(i, ChronoUnit.DAYS), description);
+ addNewTask.create(task);
+ }
+ }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
new file mode 100644
index 0000000000..2e5aff4a53
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.application.task;
+
+import com.baeldung.architecture.domain.task.Task;
+import com.baeldung.architecture.domain.task.TaskService;
+import com.baeldung.architecture.commands.task.*;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class AddNewTask implements CreateTask {
+
+ private TaskService taskService;
+
+ public AddNewTask(TaskService taskService) {
+ this.taskService = taskService;
+ }
+
+ @Override
+ public void create(Task newTask) {
+ taskService.createTask(newTask);
+ }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
new file mode 100644
index 0000000000..54539290ba
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.application.task;
+
+import com.baeldung.architecture.domain.task.Task;
+import com.baeldung.architecture.domain.task.TaskService;
+import com.baeldung.architecture.commands.task.*;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class GetTasks implements GetAllTasks {
+
+ private TaskService taskService;
+
+ public GetTasks(TaskService taskService) {
+ this.taskService = taskService;
+ }
+
+ @Override
+ public Iterable getAll() {
+ return taskService.getAllTasks();
+ }
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
new file mode 100644
index 0000000000..26e6da10e2
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.commands.task;
+
+import com.baeldung.architecture.domain.task.Task;
+
+public interface CreateTask {
+ public void create(Task newTask);
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
new file mode 100644
index 0000000000..d3c40db92f
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.commands.task;
+
+import com.baeldung.architecture.domain.task.Task;
+
+public interface GetAllTasks {
+ public Iterable getAll();
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
new file mode 100644
index 0000000000..240dc33571
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
@@ -0,0 +1,53 @@
+package com.baeldung.architecture.domain.task;
+
+import java.time.Instant;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+@Entity
+public class Task {
+ @Id
+ @GeneratedValue(strategy=GenerationType.AUTO)
+ private Long id;
+ private Instant dueDate = Instant.now();
+ private String description;
+
+ public Task() {}
+
+ public Task(Instant dueDate, String description) {
+ this.dueDate = dueDate;
+ this.description = description;
+ }
+
+ public Task(Long id, Instant dueDate, String description) {
+ this(dueDate, description);
+ this.id = id;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Instant getDueDate() {
+ return dueDate;
+ }
+
+ public void setDueDate(Instant dueDate) {
+ this.dueDate = dueDate;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
new file mode 100644
index 0000000000..d896212714
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
@@ -0,0 +1,7 @@
+package com.baeldung.architecture.domain.task;
+
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TaskRepository extends CrudRepository {};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
new file mode 100644
index 0000000000..cace0614ad
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
@@ -0,0 +1,22 @@
+package com.baeldung.architecture.domain.task;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class TaskService {
+
+ private TaskRepository taskRepository;
+
+ public TaskService(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ public void createTask(Task task) {
+ taskRepository.save(task);
+ }
+
+ public Iterable getAllTasks() {
+ return taskRepository.findAll();
+ }
+
+};
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
new file mode 100644
index 0000000000..260c033b71
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -0,0 +1,25 @@
+package com.baeldung.architecture.framework.cli;
+
+import com.baeldung.architecture.application.task.AddNewDailyTask;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+public class StartupRunner implements ApplicationRunner {
+
+ AddNewDailyTask addNewDailyTask;
+
+ public StartupRunner(AddNewDailyTask addNewDailyTask) {
+ this.addNewDailyTask = addNewDailyTask;
+ }
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ System.out.println("Adding daily tasks");
+ Task task = new Task();
+ task.setDescription("Startup Task");
+ addNewDailyTask.create(task);
+ }
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
new file mode 100644
index 0000000000..c6f7bff2dd
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
@@ -0,0 +1,42 @@
+package com.baeldung.architecture.framework.http.task;
+
+import java.time.Instant;
+
+import com.baeldung.architecture.application.task.AddNewTask;
+import com.baeldung.architecture.application.task.GetTasks;
+import com.baeldung.architecture.domain.task.Task;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("task")
+public class TaskApiController {
+
+ private AddNewTask addNewTask;
+ private GetTasks getTasks;
+
+ public TaskApiController(
+ AddNewTask addNewTask,
+ GetTasks getTasks
+ ) {
+ this.addNewTask = addNewTask;
+ this.getTasks = getTasks;
+ }
+
+ @GetMapping
+ Iterable listTasks() {
+ return getTasks.getAll();
+ }
+
+ @PostMapping(consumes = "application/json", produces = "application/json")
+ void createTask(@RequestBody TaskRequest taskRequest) {
+ Task task = new Task();
+ task.setDescription(taskRequest.getDescription());
+ task.setDueDate(Instant.parse(taskRequest.getDueDate()));
+ addNewTask.create(task);
+ }
+}
\ No newline at end of file
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
new file mode 100644
index 0000000000..2e353b079a
--- /dev/null
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
@@ -0,0 +1,29 @@
+package com.baeldung.architecture.framework.http.task;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+public class TaskRequest {
+ @JsonInclude(Include.NON_NULL)
+ private String description;
+
+ @JsonInclude(Include.NON_NULL)
+ private String dueDate;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getDueDate() {
+ return dueDate;
+ }
+
+ public void setDueDate(String dueDate) {
+ this.dueDate = dueDate;
+ }
+
+}
\ No newline at end of file
From 8ed374c4b073fe83d326401bee41dca828d7d1e7 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 20:15:39 -0400
Subject: [PATCH 02/26] Fixup styling
---
.../architecture/HexagonalArchitectureTaskApplication.java | 6 +++---
.../baeldung/architecture/application/task/AddNewTask.java | 2 +-
.../baeldung/architecture/application/task/GetTasks.java | 2 +-
.../baeldung/architecture/framework/cli/StartupRunner.java | 1 -
4 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
index 83e4fc4c0b..69c6f4b276 100644
--- a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
+++ b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
@@ -5,8 +5,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HexagonalArchitectureTaskApplication {
- public static void main(String[] args) {
- SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
- }
+ public static void main(String[] args) {
+ SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
+ }
}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
index 2e5aff4a53..70638378f9 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
@@ -19,4 +19,4 @@ public class AddNewTask implements CreateTask {
public void create(Task newTask) {
taskService.createTask(newTask);
}
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
index 54539290ba..c876f7de85 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
@@ -19,4 +19,4 @@ public class GetTasks implements GetAllTasks {
public Iterable getAll() {
return taskService.getAllTasks();
}
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index 260c033b71..cf38e5ee5e 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -17,7 +17,6 @@ public class StartupRunner implements ApplicationRunner {
}
@Override
public void run(ApplicationArguments args) throws Exception {
- System.out.println("Adding daily tasks");
Task task = new Task();
task.setDescription("Startup Task");
addNewDailyTask.create(task);
From f830524b20cf2dde5a8667779c39ac07ad84e095 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 1 Oct 2019 20:15:39 -0400
Subject: [PATCH 03/26] Fixup styling
---
.../architecture/application/task/AddNewDailyTask.java | 2 +-
.../com/baeldung/architecture/commands/task/CreateTask.java | 2 +-
.../com/baeldung/architecture/commands/task/GetAllTasks.java | 2 +-
.../com/baeldung/architecture/domain/task/TaskService.java | 2 +-
.../com/baeldung/architecture/framework/cli/StartupRunner.java | 2 +-
.../architecture/framework/http/task/TaskApiController.java | 2 +-
.../baeldung/architecture/framework/http/task/TaskRequest.java | 3 +--
7 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
index 208d1bfcc9..f9ee97542c 100644
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
@@ -26,4 +26,4 @@ public class AddNewDailyTask implements CreateTask {
addNewTask.create(task);
}
}
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
index 26e6da10e2..ec60868a22 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
public interface CreateTask {
public void create(Task newTask);
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
index d3c40db92f..c9aa1be5f8 100644
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
+++ b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
@@ -4,4 +4,4 @@ import com.baeldung.architecture.domain.task.Task;
public interface GetAllTasks {
public Iterable getAll();
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
index cace0614ad..11ef0f3e19 100644
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
+++ b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
@@ -19,4 +19,4 @@ public class TaskService {
return taskRepository.findAll();
}
-};
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
index cf38e5ee5e..449bc9386e 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
@@ -21,4 +21,4 @@ public class StartupRunner implements ApplicationRunner {
task.setDescription("Startup Task");
addNewDailyTask.create(task);
}
-}
\ No newline at end of file
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
index c6f7bff2dd..87a8f5fe4b 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
@@ -39,4 +39,4 @@ public class TaskApiController {
task.setDueDate(Instant.parse(taskRequest.getDueDate()));
addNewTask.create(task);
}
-}
\ No newline at end of file
+}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
index 2e353b079a..70b98a32f9 100644
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
+++ b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
@@ -25,5 +25,4 @@ public class TaskRequest {
public void setDueDate(String dueDate) {
this.dueDate = dueDate;
}
-
-}
\ No newline at end of file
+}
From 48cdcb20fb46d3a8d48ad94e598851ff7ce9f556 Mon Sep 17 00:00:00 2001
From: luvarqpp
Date: Wed, 1 Jul 2020 15:39:19 +0200
Subject: [PATCH 04/26] Fix exception when receiving POISON_PILL
POISON_PILL is causing writing to closed client due to logic in code.
---
.../src/main/java/com/baeldung/selector/EchoServer.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java
index 8cf2e941fe..9e9edcd0ba 100644
--- a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java
+++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/selector/EchoServer.java
@@ -49,11 +49,11 @@ public class EchoServer {
if (new String(buffer.array()).trim().equals(POISON_PILL)) {
client.close();
System.out.println("Not accepting client messages anymore");
+ } else {
+ buffer.flip();
+ client.write(buffer);
+ buffer.clear();
}
-
- buffer.flip();
- client.write(buffer);
- buffer.clear();
}
private static void register(Selector selector, ServerSocketChannel serverSocket) throws IOException {
From 9e03b89e699d9dc567af844157dc9307fe3f8329 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Wed, 15 Jul 2020 20:53:23 -0400
Subject: [PATCH 05/26] BAEL-4007 Add jpa data equality unit test specs
---
persistence-modules/java-jpa-3/README.md | 3 +
persistence-modules/java-jpa-3/pom.xml | 139 ++++++++++++++++++
.../jpa/equality/EqualByBusinessKey.java | 54 +++++++
.../com/baeldung/jpa/equality/EqualById.java | 54 +++++++
.../jpa/equality/EqualByJavaDefault.java | 38 +++++
.../main/resources/META-INF/persistence.xml | 25 ++++
.../java-jpa-3/src/main/resources/logback.xml | 15 ++
.../jpa/equality/EqualityUnitTest.java | 74 ++++++++++
8 files changed, 402 insertions(+)
create mode 100644 persistence-modules/java-jpa-3/README.md
create mode 100644 persistence-modules/java-jpa-3/pom.xml
create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
create mode 100644 persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
create mode 100644 persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
create mode 100644 persistence-modules/java-jpa-3/src/main/resources/logback.xml
create mode 100644 persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
diff --git a/persistence-modules/java-jpa-3/README.md b/persistence-modules/java-jpa-3/README.md
new file mode 100644
index 0000000000..01fdf05b53
--- /dev/null
+++ b/persistence-modules/java-jpa-3/README.md
@@ -0,0 +1,3 @@
+## JPA in Java
+
+This module contains articles about the Java Persistence API (JPA) in Java.
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
new file mode 100644
index 0000000000..562f337215
--- /dev/null
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -0,0 +1,139 @@
+
+
+ 4.0.0
+ java-jpa-3
+ java-jpa-3
+
+
+ com.baeldung
+ persistence-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+ org.hibernate
+ hibernate-core
+ ${hibernate.version}
+
+
+ org.hibernate
+ hibernate-jpamodelgen
+ ${hibernate.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
+ javax.persistence
+ javax.persistence-api
+ ${javax.persistence-api.version}
+
+
+
+
+ org.eclipse.persistence
+ eclipselink
+ ${eclipselink.version}
+ runtime
+
+
+ org.postgresql
+ postgresql
+ ${postgres.version}
+ runtime
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ -proc:none
+
+
+
+ org.bsc.maven
+ maven-processor-plugin
+ ${maven-processor-plugin.version}
+
+
+ process
+
+ process
+
+ generate-sources
+
+ target/metamodel
+
+ org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
+
+
+
+
+
+
+ org.codehaus.mojo
+ build-helper-maven-plugin
+ ${build-helper-maven-plugin.version}
+
+
+ add-source
+ generate-sources
+
+ add-source
+
+
+
+ target/metamodel
+ ${project.build.directory}/generated-sources/java/
+
+
+
+
+
+
+ com.mysema.maven
+ apt-maven-plugin
+ 1.1.3
+
+
+
+ process
+
+
+ target/generated-sources/java
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+
+
+
+ 5.4.14.Final
+ 2.7.4
+ 42.2.5
+ 2.2
+ 3.11.1
+ 3.5.1
+ 3.3.3
+ 3.0.0
+
+
+
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
new file mode 100644
index 0000000000..3e34f97d77
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
@@ -0,0 +1,54 @@
+package com.baeldung.jpa.equality;
+
+import javax.persistence.*;
+
+@Entity
+public class EqualByBusinessKey {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String email;
+
+ public EqualByBusinessKey() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((email == null) ? 0 : email.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (obj instanceof EqualByBusinessKey)
+ if (((EqualByBusinessKey) obj).getEmail() == getEmail())
+ return true;
+
+ return false;
+ }
+
+}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
new file mode 100644
index 0000000000..f29a152f3e
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
@@ -0,0 +1,54 @@
+package com.baeldung.jpa.equality;
+
+import javax.persistence.*;
+
+@Entity
+public class EqualById {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String email;
+
+ public EqualById() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((id == null) ? 0 : id.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (obj instanceof EqualById)
+ return ((EqualById) obj).getId() == getId();
+
+ return false;
+ }
+
+}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
new file mode 100644
index 0000000000..04a81865c6
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
@@ -0,0 +1,38 @@
+package com.baeldung.jpa.equality;
+
+import javax.persistence.*;
+
+@Entity
+public class EqualByJavaDefault implements Cloneable{
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private Long id;
+
+ private String email;
+
+ public EqualByJavaDefault() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public Object clone() throws
+ CloneNotSupportedException
+ {
+ return super.clone();
+ }
+}
diff --git a/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 0000000000..28a929f912
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,25 @@
+
+
+
+ org.hibernate.jpa.HibernatePersistenceProvider
+ com.baeldung.jpa.equality.EqualByJavaDefault
+ com.baeldung.jpa.equality.EqualById
+ com.baeldung.jpa.equality.EqualByBusinessKey
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/java-jpa-3/src/main/resources/logback.xml b/persistence-modules/java-jpa-3/src/main/resources/logback.xml
new file mode 100644
index 0000000000..2527fea245
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/main/resources/logback.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -
+ %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
new file mode 100644
index 0000000000..c672c9e460
--- /dev/null
+++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
@@ -0,0 +1,74 @@
+package com.baeldung.jpa.equality;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class EqualityUnitTest {
+
+ private static EntityManagerFactory factory;
+ private static EntityManager entityManager;
+
+ @BeforeClass
+ public static void setup() {
+ factory = Persistence.createEntityManagerFactory("jpa-h2-equality");
+ entityManager = factory.createEntityManager();
+ }
+
+ @Test
+ public void givenObjectBasedEquality_whenUsingEquals_thenEqualIsBasedOnInstance() throws CloneNotSupportedException {
+ EqualByJavaDefault object1 = new EqualByJavaDefault();
+ EqualByJavaDefault object2 = new EqualByJavaDefault();
+
+ object1.setEmail("test.user@domain.com");
+
+ entityManager.getTransaction().begin();
+ entityManager.persist(object1);
+ entityManager.getTransaction().commit();
+
+ object2 = (EqualByJavaDefault) object1.clone();
+
+ Assert.assertNotEquals(object1, object2);
+ Assert.assertEquals(object1.getId(), object2.getId());
+ Assert.assertEquals(object1.getEmail(), object2.getEmail());
+ }
+
+ @Test
+ public void givenIdBasedEquality_whenUsingEquals_thenEqualIsBasedOnId() {
+ EqualById object1 = new EqualById();
+ EqualById object2 = new EqualById();
+
+ object1.setEmail("test.user.1@domain.com");
+ object2.setEmail("test.user.2@domain.com");
+
+ entityManager.getTransaction().begin();
+ entityManager.persist(object1);
+ entityManager.getTransaction().commit();
+
+ object2.setId(object1.getId());
+
+ Assert.assertEquals(object1, object2);
+ Assert.assertEquals(object1.getId(), object2.getId());
+ Assert.assertNotEquals(object1.getEmail(), object2.getEmail());
+ }
+
+ @Test
+ public void givenBusinessKeyBasedEquality_whenUsingEquals_thenEqualIsBasedOnBusinessKey() {
+ EqualByBusinessKey object1 = new EqualByBusinessKey();
+ EqualByBusinessKey object2 = new EqualByBusinessKey();
+
+ object1.setEmail("test.user@test-domain.com");
+ object2.setEmail("test.user@test-domain.com");
+
+ entityManager.getTransaction().begin();
+ entityManager.persist(object1);
+ entityManager.getTransaction().commit();
+
+ Assert.assertEquals(object1, object2);
+ Assert.assertNotEquals(object1.getId(), object2.getId());
+ }
+}
\ No newline at end of file
From 1ba39d1b95e0d6984903a2f8755d2c1026e1fa7b Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Wed, 15 Jul 2020 21:16:31 -0400
Subject: [PATCH 06/26] Remove heagonal architecture
---
architecture/README.md | 3 --
architecture/pom.xml | 33 ------------
.../HexagonalArchitectureTaskApplication.java | 12 -----
.../application/task/AddNewDailyTask.java | 29 ----------
.../application/task/AddNewTask.java | 22 --------
.../application/task/GetTasks.java | 22 --------
.../commands/task/CreateTask.java | 7 ---
.../commands/task/GetAllTasks.java | 7 ---
.../architecture/domain/task/Task.java | 53 -------------------
.../domain/task/TaskRepository.java | 7 ---
.../architecture/domain/task/TaskService.java | 22 --------
.../framework/cli/StartupRunner.java | 24 ---------
.../http/task/TaskApiController.java | 42 ---------------
.../framework/http/task/TaskRequest.java | 28 ----------
14 files changed, 311 deletions(-)
delete mode 100644 architecture/README.md
delete mode 100644 architecture/pom.xml
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
delete mode 100644 architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
diff --git a/architecture/README.md b/architecture/README.md
deleted file mode 100644
index be093f25ed..0000000000
--- a/architecture/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-### Relevant articles
-
-- [A Quick and Practical Example of Hexagonal Architecture in Java](https://www.baeldung.com/a-quick-and-practical-example-of-hexagonal-architecture-in-java-3/)
diff --git a/architecture/pom.xml b/architecture/pom.xml
deleted file mode 100644
index 4ad104293e..0000000000
--- a/architecture/pom.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
- 4.0.0
- com.baeldung.architecture
- architecture
- 0.0.1-SNAPSHOT
- architecture
- jar
- A Quick and Practical Example of Hexagonal Architecture in Java
-
-
- parent-boot-2
- com.baeldung
- 0.0.1-SNAPSHOT
- ../parent-boot-2
-
-
-
-
- org.springframework.boot
- spring-boot-starter-data-jpa
-
-
- com.h2database
- h2
- runtime
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
diff --git a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java b/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
deleted file mode 100644
index 69c6f4b276..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/HexagonalArchitectureTaskApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.baeldung.architecture;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class HexagonalArchitectureTaskApplication {
- public static void main(String[] args) {
- SpringApplication.run(HexagonalArchitectureTaskApplication.class, args);
- }
-
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
deleted file mode 100644
index f9ee97542c..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewDailyTask.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import java.time.Instant;
-import java.time.temporal.ChronoUnit;
-
-import com.baeldung.architecture.commands.task.CreateTask;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class AddNewDailyTask implements CreateTask {
-
- private AddNewTask addNewTask;
-
- public AddNewDailyTask(AddNewTask addNewTask) {
- this.addNewTask = addNewTask;
- }
-
- @Override
- public void create(Task newTask) {
- Instant initialDueDate = newTask.getDueDate();
- String description = newTask.getDescription();
- for (int i = 1; i <= 5; i++) {
- Task task = new Task(initialDueDate.plus(i, ChronoUnit.DAYS), description);
- addNewTask.create(task);
- }
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java b/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
deleted file mode 100644
index 70638378f9..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/AddNewTask.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import com.baeldung.architecture.domain.task.Task;
-import com.baeldung.architecture.domain.task.TaskService;
-import com.baeldung.architecture.commands.task.*;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class AddNewTask implements CreateTask {
-
- private TaskService taskService;
-
- public AddNewTask(TaskService taskService) {
- this.taskService = taskService;
- }
-
- @Override
- public void create(Task newTask) {
- taskService.createTask(newTask);
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java b/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
deleted file mode 100644
index c876f7de85..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/application/task/GetTasks.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.application.task;
-
-import com.baeldung.architecture.domain.task.Task;
-import com.baeldung.architecture.domain.task.TaskService;
-import com.baeldung.architecture.commands.task.*;
-
-import org.springframework.stereotype.Component;
-
-@Component
-public class GetTasks implements GetAllTasks {
-
- private TaskService taskService;
-
- public GetTasks(TaskService taskService) {
- this.taskService = taskService;
- }
-
- @Override
- public Iterable getAll() {
- return taskService.getAllTasks();
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
deleted file mode 100644
index ec60868a22..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/CreateTask.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.commands.task;
-
-import com.baeldung.architecture.domain.task.Task;
-
-public interface CreateTask {
- public void create(Task newTask);
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java b/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
deleted file mode 100644
index c9aa1be5f8..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/commands/task/GetAllTasks.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.commands.task;
-
-import com.baeldung.architecture.domain.task.Task;
-
-public interface GetAllTasks {
- public Iterable getAll();
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
deleted file mode 100644
index 240dc33571..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/Task.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import java.time.Instant;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-@Entity
-public class Task {
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- private Long id;
- private Instant dueDate = Instant.now();
- private String description;
-
- public Task() {}
-
- public Task(Instant dueDate, String description) {
- this.dueDate = dueDate;
- this.description = description;
- }
-
- public Task(Long id, Instant dueDate, String description) {
- this(dueDate, description);
- this.id = id;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Instant getDueDate() {
- return dueDate;
- }
-
- public void setDueDate(Instant dueDate) {
- this.dueDate = dueDate;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
deleted file mode 100644
index d896212714..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskRepository.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import org.springframework.data.repository.CrudRepository;
-import org.springframework.stereotype.Repository;
-
-@Repository
-public interface TaskRepository extends CrudRepository {};
diff --git a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java b/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
deleted file mode 100644
index 11ef0f3e19..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/domain/task/TaskService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.architecture.domain.task;
-
-import org.springframework.stereotype.Service;
-
-@Service
-public class TaskService {
-
- private TaskRepository taskRepository;
-
- public TaskService(TaskRepository taskRepository) {
- this.taskRepository = taskRepository;
- }
-
- public void createTask(Task task) {
- taskRepository.save(task);
- }
-
- public Iterable getAllTasks() {
- return taskRepository.findAll();
- }
-
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java b/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
deleted file mode 100644
index 449bc9386e..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/cli/StartupRunner.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.baeldung.architecture.framework.cli;
-
-import com.baeldung.architecture.application.task.AddNewDailyTask;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-@Component
-public class StartupRunner implements ApplicationRunner {
-
- AddNewDailyTask addNewDailyTask;
-
- public StartupRunner(AddNewDailyTask addNewDailyTask) {
- this.addNewDailyTask = addNewDailyTask;
- }
- @Override
- public void run(ApplicationArguments args) throws Exception {
- Task task = new Task();
- task.setDescription("Startup Task");
- addNewDailyTask.create(task);
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
deleted file mode 100644
index 87a8f5fe4b..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskApiController.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.baeldung.architecture.framework.http.task;
-
-import java.time.Instant;
-
-import com.baeldung.architecture.application.task.AddNewTask;
-import com.baeldung.architecture.application.task.GetTasks;
-import com.baeldung.architecture.domain.task.Task;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@RequestMapping("task")
-public class TaskApiController {
-
- private AddNewTask addNewTask;
- private GetTasks getTasks;
-
- public TaskApiController(
- AddNewTask addNewTask,
- GetTasks getTasks
- ) {
- this.addNewTask = addNewTask;
- this.getTasks = getTasks;
- }
-
- @GetMapping
- Iterable listTasks() {
- return getTasks.getAll();
- }
-
- @PostMapping(consumes = "application/json", produces = "application/json")
- void createTask(@RequestBody TaskRequest taskRequest) {
- Task task = new Task();
- task.setDescription(taskRequest.getDescription());
- task.setDueDate(Instant.parse(taskRequest.getDueDate()));
- addNewTask.create(task);
- }
-}
diff --git a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java b/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
deleted file mode 100644
index 70b98a32f9..0000000000
--- a/architecture/src/main/java/com/baeldung/architecture/framework/http/task/TaskRequest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.baeldung.architecture.framework.http.task;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-
-public class TaskRequest {
- @JsonInclude(Include.NON_NULL)
- private String description;
-
- @JsonInclude(Include.NON_NULL)
- private String dueDate;
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getDueDate() {
- return dueDate;
- }
-
- public void setDueDate(String dueDate) {
- this.dueDate = dueDate;
- }
-}
From eadd24ad5de2567d7dca6365715340b8c5258b05 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 28 Jul 2020 18:03:57 -0400
Subject: [PATCH 07/26] Simplify hashcode example
---
.../java/com/baeldung/jpa/equality/EqualByBusinessKey.java | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
index 3e34f97d77..78ba1ad1e9 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
@@ -32,10 +32,7 @@ public class EqualByBusinessKey {
@Override
public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((email == null) ? 0 : email.hashCode());
- return result;
+ return java.util.Objects.hashCode(email);
}
@Override
From da07a30a00cf92b2b251714f56684dd4a94d57fa Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Tue, 28 Jul 2020 18:40:29 -0400
Subject: [PATCH 08/26] Remove metamodel plugin
---
persistence-modules/java-jpa-3/pom.xml | 20 --------------------
1 file changed, 20 deletions(-)
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
index 562f337215..57791f474e 100644
--- a/persistence-modules/java-jpa-3/pom.xml
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -66,26 +66,6 @@
-proc:none
-
- org.bsc.maven
- maven-processor-plugin
- ${maven-processor-plugin.version}
-
-
- process
-
- process
-
- generate-sources
-
- target/metamodel
-
- org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
-
-
-
-
-
org.codehaus.mojo
build-helper-maven-plugin
From ebb836524dfee18e3493f360a6c3fe17c36d3c7d Mon Sep 17 00:00:00 2001
From: azhwani <>
Date: Mon, 3 Aug 2020 12:46:26 +0100
Subject: [PATCH 09/26] first commit
---
.../logoutredirects/LogoutApplication.java | 13 +++++++
.../controller/RestApiController.java | 20 ++++++++++
.../securityconfig/SpringSecurityConfig.java | 27 +++++++++++++
.../src/main/resources/application.properties | 4 +-
.../LogoutApplicationUnitTest.java | 38 +++++++++++++++++++
5 files changed, 101 insertions(+), 1 deletion(-)
create mode 100644 spring-5-security/src/main/java/com/baeldung/logoutredirects/LogoutApplication.java
create mode 100644 spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
create mode 100644 spring-5-security/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java
create mode 100644 spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java
diff --git a/spring-5-security/src/main/java/com/baeldung/logoutredirects/LogoutApplication.java b/spring-5-security/src/main/java/com/baeldung/logoutredirects/LogoutApplication.java
new file mode 100644
index 0000000000..ef8175ffb2
--- /dev/null
+++ b/spring-5-security/src/main/java/com/baeldung/logoutredirects/LogoutApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.logoutredirects;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class LogoutApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(LogoutApplication.class, args);
+ }
+
+}
diff --git a/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java b/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
new file mode 100644
index 0000000000..7d5b3ebbaa
--- /dev/null
+++ b/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
@@ -0,0 +1,20 @@
+package com.baeldung.logoutredirects.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class RestApiController {
+
+ @GetMapping("/login")
+ public String login() {
+ return "login";
+ }
+
+ @PostMapping("/logout")
+ public String logout() {
+ return "redirect:/login";
+ }
+
+}
diff --git a/spring-5-security/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java
new file mode 100644
index 0000000000..64141f63d8
--- /dev/null
+++ b/spring-5-security/src/main/java/com/baeldung/logoutredirects/securityconfig/SpringSecurityConfig.java
@@ -0,0 +1,27 @@
+package com.baeldung.logoutredirects.securityconfig;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.authorizeRequests(authz -> authz.mvcMatchers("/login")
+ .permitAll()
+ .anyRequest()
+ .authenticated())
+ .logout(logout -> logout.permitAll()
+ .logoutSuccessHandler((request, response, authentication) -> {
+ response.setStatus(HttpServletResponse.SC_OK);
+ }));
+
+ }
+
+}
diff --git a/spring-5-security/src/main/resources/application.properties b/spring-5-security/src/main/resources/application.properties
index 5912b0f755..8159ace060 100644
--- a/spring-5-security/src/main/resources/application.properties
+++ b/spring-5-security/src/main/resources/application.properties
@@ -2,4 +2,6 @@ server.port=8081
logging.level.root=INFO
-logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG
\ No newline at end of file
+logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG
+
+logging.level.org.springframework.security=DEBUG
\ No newline at end of file
diff --git a/spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java b/spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java
new file mode 100644
index 0000000000..22ec67dea1
--- /dev/null
+++ b/spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.authresolver.logoutredirects;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import com.baeldung.logoutredirects.securityconfig.SpringSecurityConfig;
+
+import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
+import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest()
+@ContextConfiguration(classes = { SpringSecurityConfig.class })
+public class LogoutApplicationUnitTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @WithMockUser(value = "spring")
+ @Test
+ public void whenLogout_thenDisableRedirect() throws Exception {
+
+ this.mockMvc.perform(post("/logout").with(csrf()))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$").doesNotExist())
+ .andExpect(unauthenticated())
+ .andReturn();
+ }
+
+}
\ No newline at end of file
From 1cd7cca2cabd30d36c9dbef35fc8fbfd319cd8c0 Mon Sep 17 00:00:00 2001
From: azhwani <>
Date: Mon, 3 Aug 2020 12:57:37 +0100
Subject: [PATCH 10/26] quick fix
---
.../logoutredirects/LogoutApplicationUnitTest.java | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
rename spring-5-security/src/test/java/com/baeldung/{authresolver => }/logoutredirects/LogoutApplicationUnitTest.java (83%)
diff --git a/spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java b/spring-5-security/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java
similarity index 83%
rename from spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java
rename to spring-5-security/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java
index 22ec67dea1..519a6bdc99 100644
--- a/spring-5-security/src/test/java/com/baeldung/authresolver/logoutredirects/LogoutApplicationUnitTest.java
+++ b/spring-5-security/src/test/java/com/baeldung/logoutredirects/LogoutApplicationUnitTest.java
@@ -1,16 +1,13 @@
-package com.baeldung.authresolver.logoutredirects;
+package com.baeldung.logoutredirects;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
-import com.baeldung.logoutredirects.securityconfig.SpringSecurityConfig;
-
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
@@ -18,7 +15,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
@RunWith(SpringRunner.class)
@WebMvcTest()
-@ContextConfiguration(classes = { SpringSecurityConfig.class })
public class LogoutApplicationUnitTest {
@Autowired
From 021c119be4ffcc8a028eab5bdc93f60491d71fbf Mon Sep 17 00:00:00 2001
From: Krzysiek
Date: Mon, 3 Aug 2020 21:22:23 +0200
Subject: [PATCH 11/26] JAVA-2300: Upgrade Spring Core to 5.2.8 in
parent-spring-5
---
parent-spring-5/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/parent-spring-5/pom.xml b/parent-spring-5/pom.xml
index 949e40b021..5893701c68 100644
--- a/parent-spring-5/pom.xml
+++ b/parent-spring-5/pom.xml
@@ -31,7 +31,7 @@
- 5.2.5.RELEASE
+ 5.2.8.RELEASE
5.2.3.RELEASE
1.5.10.RELEASE
From 3ac4049caee949f692185dd9b33245a4b8938e9a Mon Sep 17 00:00:00 2001
From: mikr
Date: Tue, 4 Aug 2020 22:39:30 +0200
Subject: [PATCH 12/26] Java-65 split persistence-modules/spring-jpa
---
persistence-modules/spring-jpa-2/.gitignore | 13 ++
persistence-modules/spring-jpa-2/README.md | 19 +++
persistence-modules/spring-jpa-2/pom.xml | 152 ++++++++++++++++++
.../baeldung/config/PersistenceJPAConfig.java | 85 ++++++++++
.../config/PersistenceJPAConfigXml.java | 17 ++
.../com/baeldung/config/SpringWebConfig.java | 24 +++
.../com/baeldung/config/StudentJpaConfig.java | 67 ++++++++
.../com/baeldung/config/WebInitializer.java | 20 +++
.../com/baeldung/manytomany/model/Course.java | 0
.../manytomany/model/CourseRating.java | 0
.../manytomany/model/CourseRatingKey.java | 0
.../manytomany/model/CourseRegistration.java | 0
.../baeldung/manytomany/model/Student.java | 0
.../src/main/resources/context.xml | 1 +
.../src/main/resources/logback.xml | 19 +++
.../main/resources/persistence-h2.properties | 10 ++
.../resources/persistence-student.properties | 11 ++
.../src/main/resources/persistence.xml | 42 +++++
.../src/main/resources/server.xml | 6 +
.../src/main/resources/sqlfiles.properties | 1 +
.../src/test/java/META-INF/persistence.xml | 20 +++
.../java/com/baeldung/SpringContextTest.java | 21 +++
.../manytomany/ManyToManyIntegrationTest.java | 0
.../ManyToManyTestConfiguration.java | 2 +-
.../src/test/resources/.gitignore | 13 ++
.../src/test/resources/manytomany/db.sql | 0
.../test/resources/manytomany/test.properties | 0
.../resources/persistence-student.properties | 9 ++
persistence-modules/spring-jpa/README.md | 4 +-
29 files changed, 552 insertions(+), 4 deletions(-)
create mode 100644 persistence-modules/spring-jpa-2/.gitignore
create mode 100644 persistence-modules/spring-jpa-2/README.md
create mode 100644 persistence-modules/spring-jpa-2/pom.xml
create mode 100644 persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
create mode 100644 persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfigXml.java
create mode 100644 persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/SpringWebConfig.java
create mode 100644 persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/StudentJpaConfig.java
create mode 100644 persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/WebInitializer.java
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/main/java/com/baeldung/manytomany/model/Course.java (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/main/java/com/baeldung/manytomany/model/CourseRating.java (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/main/java/com/baeldung/manytomany/model/Student.java (100%)
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/context.xml
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/logback.xml
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/persistence-h2.properties
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/persistence-student.properties
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/persistence.xml
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/server.xml
create mode 100644 persistence-modules/spring-jpa-2/src/main/resources/sqlfiles.properties
create mode 100644 persistence-modules/spring-jpa-2/src/test/java/META-INF/persistence.xml
create mode 100644 persistence-modules/spring-jpa-2/src/test/java/com/baeldung/SpringContextTest.java
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java (97%)
create mode 100644 persistence-modules/spring-jpa-2/src/test/resources/.gitignore
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/test/resources/manytomany/db.sql (100%)
rename persistence-modules/{spring-jpa => spring-jpa-2}/src/test/resources/manytomany/test.properties (100%)
create mode 100644 persistence-modules/spring-jpa-2/src/test/resources/persistence-student.properties
diff --git a/persistence-modules/spring-jpa-2/.gitignore b/persistence-modules/spring-jpa-2/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/.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/persistence-modules/spring-jpa-2/README.md b/persistence-modules/spring-jpa-2/README.md
new file mode 100644
index 0000000000..71b368b44a
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/README.md
@@ -0,0 +1,19 @@
+=========
+
+## Spring JPA Example Project
+
+
+### Relevant Articles:
+- [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many)
+- More articles: [[<-- prev]](/spring-jpa)
+
+
+### Eclipse Config
+After importing the project into Eclipse, you may see the following error:
+"No persistence xml file found in project"
+
+This can be ignored:
+- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
+Or:
+- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
+
diff --git a/persistence-modules/spring-jpa-2/pom.xml b/persistence-modules/spring-jpa-2/pom.xml
new file mode 100644
index 0000000000..410ed592b0
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/pom.xml
@@ -0,0 +1,152 @@
+
+
+ 4.0.0
+ spring-jpa
+ 0.1-SNAPSHOT
+ spring-jpa
+ war
+
+
+ com.baeldung
+ persistence-modules
+ 1.0.0-SNAPSHOT
+
+
+
+
+
+ org.springframework
+ spring-orm
+ ${org.springframework.version}
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.springframework
+ spring-context
+ ${org.springframework.version}
+
+
+ org.springframework
+ spring-webmvc
+ ${org.springframework.version}
+
+
+
+
+
+ org.hibernate
+ hibernate-entitymanager
+ ${hibernate.version}
+
+
+ xml-apis
+ xml-apis
+ ${xml-apis.version}
+
+
+ org.javassist
+ javassist
+ ${javassist.version}
+
+
+ mysql
+ mysql-connector-java
+ ${mysql-connector-java.version}
+ runtime
+
+
+ org.springframework.data
+ spring-data-jpa
+ ${spring-data-jpa.version}
+
+
+ com.h2database
+ h2
+ ${h2.version}
+
+
+
+
+
+ org.hibernate
+ hibernate-validator
+ ${hibernate-validator.version}
+
+
+ javax.el
+ javax.el-api
+ ${javax.el-api.version}
+
+
+
+
+ javax.servlet
+ jstl
+ ${jstl.version}
+
+
+ javax.servlet
+ servlet-api
+ provided
+ ${javax.servlet.servlet-api.version}
+
+
+
+
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+ test
+
+
+
+ org.springframework
+ spring-test
+ ${org.springframework.version}
+ test
+
+
+
+
+
+
+ 5.1.5.RELEASE
+ 3.21.0-GA
+
+ 6.0.6
+ 2.1.5.RELEASE
+
+
+ 2.5
+
+
+ 6.0.15.Final
+ 1.4.01
+ 2.2.5
+
+
+ 21.0
+ 3.8.0
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfig.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
new file mode 100644
index 0000000000..c489321122
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfig.java
@@ -0,0 +1,85 @@
+package com.baeldung.config;
+
+import com.google.common.base.Preconditions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-h2.properties" })
+@ComponentScan({ "com.baeldung.persistence" })
+@EnableJpaRepositories(basePackages = "com.baeldung.persistence.dao")
+public class PersistenceJPAConfig {
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceJPAConfig() {
+ super();
+ }
+
+ // beans
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource());
+ em.setPackagesToScan(new String[] { "com.baeldung.persistence.model" });
+
+ final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
+ em.setJpaVendorAdapter(vendorAdapter);
+ em.setJpaProperties(additionalProperties());
+
+ return em;
+ }
+
+ @Bean
+ public DataSource dataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
+ final JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(emf);
+ return transactionManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ final Properties additionalProperties() {
+ final Properties hibernateProperties = new Properties();
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", "false");
+
+
+ return hibernateProperties;
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfigXml.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfigXml.java
new file mode 100644
index 0000000000..95224a4662
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/PersistenceJPAConfigXml.java
@@ -0,0 +1,17 @@
+package com.baeldung.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ImportResource;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+// @Configuration
+@EnableTransactionManagement
+@ComponentScan({ "com.baeldung.persistence" })
+@ImportResource({ "classpath:jpaConfig.xml" })
+public class PersistenceJPAConfigXml {
+
+ public PersistenceJPAConfigXml() {
+ super();
+ }
+
+}
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/SpringWebConfig.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/SpringWebConfig.java
new file mode 100644
index 0000000000..475970d1f0
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/SpringWebConfig.java
@@ -0,0 +1,24 @@
+package com.baeldung.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+import org.springframework.web.servlet.view.JstlView;
+
+@EnableWebMvc
+@Configuration
+@ComponentScan({ "com.baeldung.web" })
+public class SpringWebConfig extends WebMvcConfigurerAdapter {
+
+ @Bean
+ public InternalResourceViewResolver viewResolver() {
+ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
+ viewResolver.setViewClass(JstlView.class);
+ viewResolver.setPrefix("/WEB-INF/views/jsp/");
+ viewResolver.setSuffix(".jsp");
+ return viewResolver;
+ }
+}
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/StudentJpaConfig.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/StudentJpaConfig.java
new file mode 100644
index 0000000000..54ced72dd1
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/StudentJpaConfig.java
@@ -0,0 +1,67 @@
+package com.baeldung.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
+import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.persistence.EntityManagerFactory;
+import javax.sql.DataSource;
+import java.util.Properties;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "com.baeldung.inmemory.persistence.dao")
+@PropertySource("persistence-student.properties")
+@EnableTransactionManagement
+public class StudentJpaConfig {
+
+ @Autowired
+ private Environment env;
+
+ @Bean
+ public DataSource dataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
+ dataSource.setUrl(env.getProperty("jdbc.url"));
+ dataSource.setUsername(env.getProperty("jdbc.user"));
+ dataSource.setPassword(env.getProperty("jdbc.pass"));
+
+ return dataSource;
+ }
+
+ @Bean
+ public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
+ final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
+ em.setDataSource(dataSource());
+ em.setPackagesToScan(new String[] { "com.baeldung.inmemory.persistence.model" });
+ em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
+ em.setJpaProperties(additionalProperties());
+ return em;
+ }
+
+ @Bean
+ JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
+ JpaTransactionManager transactionManager = new JpaTransactionManager();
+ transactionManager.setEntityManagerFactory(entityManagerFactory);
+ return transactionManager;
+ }
+
+ final Properties additionalProperties() {
+ final Properties hibernateProperties = new Properties();
+
+ hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+ hibernateProperties.setProperty("hibernate.show_sql", env.getProperty("hibernate.show_sql"));
+ hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", env.getProperty("hibernate.cache.use_second_level_cache"));
+ hibernateProperties.setProperty("hibernate.cache.use_query_cache", env.getProperty("hibernate.cache.use_query_cache"));
+
+ return hibernateProperties;
+ }
+}
diff --git a/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/WebInitializer.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/WebInitializer.java
new file mode 100644
index 0000000000..be81cca76b
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/config/WebInitializer.java
@@ -0,0 +1,20 @@
+package com.baeldung.config;
+
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
+ @Override
+ protected Class>[] getRootConfigClasses() {
+ return new Class[] { PersistenceJPAConfig.class };
+ }
+
+ @Override
+ protected Class>[] getServletConfigClasses() {
+ return new Class[] { SpringWebConfig.class };
+ }
+
+ @Override
+ protected String[] getServletMappings() {
+ return new String[] { "/" };
+ }
+}
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Course.java
rename to persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Course.java
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRating.java
rename to persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRating.java
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
rename to persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRatingKey.java
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
rename to persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/CourseRegistration.java
diff --git a/persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java b/persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/main/java/com/baeldung/manytomany/model/Student.java
rename to persistence-modules/spring-jpa-2/src/main/java/com/baeldung/manytomany/model/Student.java
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/context.xml b/persistence-modules/spring-jpa-2/src/main/resources/context.xml
new file mode 100644
index 0000000000..a64dfe9a61
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/context.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/logback.xml b/persistence-modules/spring-jpa-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..ec0dc2469a
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/logback.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ web - %date [%thread] %-5level %logger{36} - %message%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/persistence-h2.properties b/persistence-modules/spring-jpa-2/src/main/resources/persistence-h2.properties
new file mode 100644
index 0000000000..a3060cc796
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/persistence-h2.properties
@@ -0,0 +1,10 @@
+# jdbc.X
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
+jdbc.user=sa
+jdbc.pass=
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/persistence-student.properties b/persistence-modules/spring-jpa-2/src/main/resources/persistence-student.properties
new file mode 100644
index 0000000000..d4c82420de
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/persistence-student.properties
@@ -0,0 +1,11 @@
+jdbc.driverClassName=com.mysql.cj.jdbc.Driver
+jdbc.url=jdbc:mysql://localhost:3306/myDb
+jdbc.user=tutorialuser
+jdbc.pass=tutorialpass
+
+hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create-drop
+
+hibernate.cache.use_second_level_cache=false
+hibernate.cache.use_query_cache=false
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/persistence.xml b/persistence-modules/spring-jpa-2/src/main/resources/persistence.xml
new file mode 100644
index 0000000000..57687c306d
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/persistence.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${hibernate.hbm2ddl.auto}
+ ${hibernate.dialect}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/server.xml b/persistence-modules/spring-jpa-2/src/main/resources/server.xml
new file mode 100644
index 0000000000..5c61659018
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/server.xml
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/main/resources/sqlfiles.properties b/persistence-modules/spring-jpa-2/src/main/resources/sqlfiles.properties
new file mode 100644
index 0000000000..0bea6adad1
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/main/resources/sqlfiles.properties
@@ -0,0 +1 @@
+spring.jpa.hibernate.ddl-auto=none
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa-2/src/test/java/META-INF/persistence.xml b/persistence-modules/spring-jpa-2/src/test/java/META-INF/persistence.xml
new file mode 100644
index 0000000000..495f076fef
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/test/java/META-INF/persistence.xml
@@ -0,0 +1,20 @@
+
+
+
+ com.baeldung.persistence.model.Foo
+ com.baeldung.persistence.model.Bar
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/SpringContextTest.java
new file mode 100644
index 0000000000..abc73e250d
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/SpringContextTest.java
@@ -0,0 +1,21 @@
+package com.baeldung;
+
+import com.baeldung.config.PersistenceJPAConfig;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class)
+@WebAppConfiguration
+@DirtiesContext
+public class SpringContextTest {
+
+ @Test
+ public void whenSpringContextIsBootstrapped_thenNoExceptions() {
+ }
+}
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
similarity index 100%
rename from persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
rename to persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyIntegrationTest.java
diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
similarity index 97%
rename from persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
rename to persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
index f4635b563a..1cc3621f0d 100644
--- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
+++ b/persistence-modules/spring-jpa-2/src/test/java/com/baeldung/manytomany/ManyToManyTestConfiguration.java
@@ -16,7 +16,7 @@ import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
@Configuration
-@PropertySource("classpath:/manytomany/test.properties")
+@PropertySource("manytomany/test.properties")
public class ManyToManyTestConfiguration {
@Bean
diff --git a/persistence-modules/spring-jpa-2/src/test/resources/.gitignore b/persistence-modules/spring-jpa-2/src/test/resources/.gitignore
new file mode 100644
index 0000000000..83c05e60c8
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/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/persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql b/persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql
similarity index 100%
rename from persistence-modules/spring-jpa/src/test/resources/manytomany/db.sql
rename to persistence-modules/spring-jpa-2/src/test/resources/manytomany/db.sql
diff --git a/persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties b/persistence-modules/spring-jpa-2/src/test/resources/manytomany/test.properties
similarity index 100%
rename from persistence-modules/spring-jpa/src/test/resources/manytomany/test.properties
rename to persistence-modules/spring-jpa-2/src/test/resources/manytomany/test.properties
diff --git a/persistence-modules/spring-jpa-2/src/test/resources/persistence-student.properties b/persistence-modules/spring-jpa-2/src/test/resources/persistence-student.properties
new file mode 100644
index 0000000000..3b6b580630
--- /dev/null
+++ b/persistence-modules/spring-jpa-2/src/test/resources/persistence-student.properties
@@ -0,0 +1,9 @@
+jdbc.driverClassName=org.h2.Driver
+jdbc.url=jdbc:h2:mem:myDb;DB_CLOSE_DELAY=-1
+
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+hibernate.show_sql=true
+hibernate.hbm2ddl.auto=create
+
+hibernate.cache.use_second_level_cache=false
+hibernate.cache.use_query_cache=false
\ No newline at end of file
diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md
index 94a1e1f575..3eb8ae8d55 100644
--- a/persistence-modules/spring-jpa/README.md
+++ b/persistence-modules/spring-jpa/README.md
@@ -11,9 +11,7 @@
- [A Guide to Spring AbstractRoutingDatasource](https://www.baeldung.com/spring-abstract-routing-data-source)
- [Obtaining Auto-generated Keys in Spring JDBC](https://www.baeldung.com/spring-jdbc-autogenerated-keys)
- [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries)
-- [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many)
-- [Spring Persistence (Hibernate and JPA) with a JNDI datasource](https://www.baeldung.com/spring-persistence-hibernate-and-jpa-with-a-jndi-datasource-2)
-
+- More articles: [[next -->]](/spring-jpa-2)
### Eclipse Config
After importing the project into Eclipse, you may see the following error:
From e176cc2d4226943d8c132fe3ca4f462bd5283747 Mon Sep 17 00:00:00 2001
From: Krzysiek
Date: Tue, 4 Aug 2020 23:06:05 +0200
Subject: [PATCH 13/26] JAVA-1652: Get rid of the overriden spring-boot.version
property
---
spring-cloud/spring-cloud-zuul/pom.xml | 3 +--
.../spring-cloud-zuul/spring-zuul-post-filter/pom.xml | 4 ----
.../spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml | 2 --
3 files changed, 1 insertion(+), 8 deletions(-)
diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml
index 140a1337b3..b3c66dd1c6 100644
--- a/spring-cloud/spring-cloud-zuul/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/pom.xml
@@ -72,8 +72,7 @@
- Hoxton.RELEASE
- 2.2.2.RELEASE
+ Hoxton.SR4
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml
index 8643309645..0ca9f0d050 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml
@@ -18,8 +18,4 @@
-
- Hoxton.SR1
-
-
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
index fd6d18fc09..8873282d1e 100644
--- a/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-rate-limiting/pom.xml
@@ -48,8 +48,6 @@
- Finchley.SR1
- 2.0.6.RELEASE
2.2.0.RELEASE
From 099b9e9121b7f180fe00697624019cf18720cdbc Mon Sep 17 00:00:00 2001
From: Oussama BEN MAHMOUD
Date: Sun, 9 Aug 2020 02:05:27 +0200
Subject: [PATCH 14/26] BAEL-4392: Java Files Open Options
---
.../openoptions/OpenOptionsUnitTest.java | 96 +++++++++++++++++++
1 file changed, 96 insertions(+)
create mode 100644 core-java-modules/core-java-io-3/src/test/java/com/baeldung/openoptions/OpenOptionsUnitTest.java
diff --git a/core-java-modules/core-java-io-3/src/test/java/com/baeldung/openoptions/OpenOptionsUnitTest.java b/core-java-modules/core-java-io-3/src/test/java/com/baeldung/openoptions/OpenOptionsUnitTest.java
new file mode 100644
index 0000000000..323c965edf
--- /dev/null
+++ b/core-java-modules/core-java-io-3/src/test/java/com/baeldung/openoptions/OpenOptionsUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.openoptions;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+
+import static org.junit.Assert.*;
+
+public class OpenOptionsUnitTest {
+
+ private static final String HOME = System.getProperty("user.home");
+ private static final String DUMMY_FILE_NAME = "sample.txt";
+ private static final String EXISTING_FILE_NAME = "existingFile.txt";
+
+ private static final String DUMMY_TEXT = "This is a sample text.";
+ private static final String ANOTHER_DUMMY_TEXT = "This is a another text.";
+
+ @BeforeClass
+ public static void beforeAll() throws IOException {
+ Path path = Paths.get(HOME, DUMMY_FILE_NAME);
+
+ try (OutputStream out = Files.newOutputStream(path)) {
+ out.write(DUMMY_TEXT.getBytes());
+ }
+
+ Files.createFile(Paths.get(HOME, EXISTING_FILE_NAME));
+ }
+
+ @AfterClass
+ public static void afterAll() throws IOException {
+ Files.delete(Paths.get(HOME, "newfile.txt"));
+ Files.delete(Paths.get(HOME, "sparse.txt"));
+ Files.delete(Paths.get(HOME, DUMMY_FILE_NAME));
+ }
+
+ @Test
+ public void givenExistingPath_whenCreateNewFile_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, "newfile.txt");
+ assertFalse(Files.exists(path));
+
+ Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE);
+ assertTrue(Files.exists(path));
+ }
+
+ @Test
+ public void givenExistingPath_whenReadExistingFile_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, DUMMY_FILE_NAME);
+
+ try (InputStream in = Files.newInputStream(path); BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ assertThat(line, CoreMatchers.containsString(DUMMY_TEXT));
+ }
+ }
+ }
+
+ @Test
+ public void givenExistingPath_whenWriteToExistingFile_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, DUMMY_FILE_NAME);
+
+ try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {
+ out.write(ANOTHER_DUMMY_TEXT.getBytes());
+ }
+ }
+
+ @Test
+ public void givenExistingPath_whenCreateSparseFile_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, "sparse.txt");
+ Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE);
+ }
+
+ @Test
+ public void givenExistingPath_whenDeleteOnClose_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, EXISTING_FILE_NAME);
+ assertTrue(Files.exists(path)); // file was already created and exists
+
+ try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {
+ out.write(ANOTHER_DUMMY_TEXT.getBytes());
+ }
+
+ assertFalse(Files.exists(path)); // file is deleted
+ }
+
+ @Test
+ public void givenExistingPath_whenWriteAndSync_thenCorrect() throws IOException {
+ Path path = Paths.get(HOME, DUMMY_FILE_NAME);
+ Files.write(path, ANOTHER_DUMMY_TEXT.getBytes(), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC);
+ }
+}
From d50a83197279a0fda143ac3f1bc66025c5873b42 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 8 Aug 2020 21:05:32 -0400
Subject: [PATCH 15/26] BAEL-4077 Fixup styling
---
.../baeldung/jpa/equality/EqualByBusinessKey.java | 14 ++++++++------
.../java/com/baeldung/jpa/equality/EqualById.java | 13 +++++++------
.../baeldung/jpa/equality/EqualByJavaDefault.java | 4 +---
.../baeldung/jpa/equality/EqualityUnitTest.java | 2 +-
4 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
index 3e34f97d77..655db4e575 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
@@ -40,15 +40,17 @@ public class EqualByBusinessKey {
@Override
public boolean equals(Object obj) {
- if (this == obj)
+ if (this == obj) {
return true;
- if (obj == null)
+ }
+ if (obj == null) {
return false;
- if (obj instanceof EqualByBusinessKey)
- if (((EqualByBusinessKey) obj).getEmail() == getEmail())
+ }
+ if (obj instanceof EqualByBusinessKey) {
+ if (((EqualByBusinessKey) obj).getEmail() == getEmail()) {
return true;
-
+ }
+ }
return false;
}
-
}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
index f29a152f3e..cebfb5fcec 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
@@ -41,14 +41,15 @@ public class EqualById {
@Override
public boolean equals(Object obj) {
- if (this == obj)
+ if (this == obj) {
return true;
- if (obj == null)
+ }
+ if (obj == null) {
return false;
- if (obj instanceof EqualById)
- return ((EqualById) obj).getId() == getId();
-
+ }
+ if (obj instanceof EqualById) {
+ return ((EqualById) obj).getId().equals(getId());
+ }
return false;
}
-
}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
index 04a81865c6..b312845b61 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
@@ -30,9 +30,7 @@ public class EqualByJavaDefault implements Cloneable{
this.email = email;
}
- public Object clone() throws
- CloneNotSupportedException
- {
+ public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
index c672c9e460..03ac11b6fd 100644
--- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
+++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
@@ -71,4 +71,4 @@ public class EqualityUnitTest {
Assert.assertEquals(object1, object2);
Assert.assertNotEquals(object1.getId(), object2.getId());
}
-}
\ No newline at end of file
+}
From 18d7fc0bdc5b9b6b7f3de538a0a91485008df700 Mon Sep 17 00:00:00 2001
From: andrebrowne <42154231+andrebrowne@users.noreply.github.com>
Date: Sat, 8 Aug 2020 21:05:32 -0400
Subject: [PATCH 16/26] BAEL-4077 Fixup styling
---
persistence-modules/java-jpa-3/pom.xml | 56 -------------------
.../jpa/equality/EqualByBusinessKey.java | 14 +++--
.../com/baeldung/jpa/equality/EqualById.java | 13 +++--
.../jpa/equality/EqualByJavaDefault.java | 4 +-
.../jpa/equality/EqualityUnitTest.java | 2 +-
5 files changed, 17 insertions(+), 72 deletions(-)
diff --git a/persistence-modules/java-jpa-3/pom.xml b/persistence-modules/java-jpa-3/pom.xml
index 562f337215..da18ae3046 100644
--- a/persistence-modules/java-jpa-3/pom.xml
+++ b/persistence-modules/java-jpa-3/pom.xml
@@ -66,62 +66,6 @@
-proc:none
-
- org.bsc.maven
- maven-processor-plugin
- ${maven-processor-plugin.version}
-
-
- process
-
- process
-
- generate-sources
-
- target/metamodel
-
- org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor
-
-
-
-
-
-
- org.codehaus.mojo
- build-helper-maven-plugin
- ${build-helper-maven-plugin.version}
-
-
- add-source
- generate-sources
-
- add-source
-
-
-
- target/metamodel
- ${project.build.directory}/generated-sources/java/
-
-
-
-
-
-
- com.mysema.maven
- apt-maven-plugin
- 1.1.3
-
-
-
- process
-
-
- target/generated-sources/java
- com.querydsl.apt.jpa.JPAAnnotationProcessor
-
-
-
-
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
index 3e34f97d77..655db4e575 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByBusinessKey.java
@@ -40,15 +40,17 @@ public class EqualByBusinessKey {
@Override
public boolean equals(Object obj) {
- if (this == obj)
+ if (this == obj) {
return true;
- if (obj == null)
+ }
+ if (obj == null) {
return false;
- if (obj instanceof EqualByBusinessKey)
- if (((EqualByBusinessKey) obj).getEmail() == getEmail())
+ }
+ if (obj instanceof EqualByBusinessKey) {
+ if (((EqualByBusinessKey) obj).getEmail() == getEmail()) {
return true;
-
+ }
+ }
return false;
}
-
}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
index f29a152f3e..cebfb5fcec 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualById.java
@@ -41,14 +41,15 @@ public class EqualById {
@Override
public boolean equals(Object obj) {
- if (this == obj)
+ if (this == obj) {
return true;
- if (obj == null)
+ }
+ if (obj == null) {
return false;
- if (obj instanceof EqualById)
- return ((EqualById) obj).getId() == getId();
-
+ }
+ if (obj instanceof EqualById) {
+ return ((EqualById) obj).getId().equals(getId());
+ }
return false;
}
-
}
diff --git a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
index 04a81865c6..b312845b61 100644
--- a/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
+++ b/persistence-modules/java-jpa-3/src/main/java/com/baeldung/jpa/equality/EqualByJavaDefault.java
@@ -30,9 +30,7 @@ public class EqualByJavaDefault implements Cloneable{
this.email = email;
}
- public Object clone() throws
- CloneNotSupportedException
- {
+ public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
diff --git a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
index c672c9e460..03ac11b6fd 100644
--- a/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
+++ b/persistence-modules/java-jpa-3/src/test/java/com/baeldung/jpa/equality/EqualityUnitTest.java
@@ -71,4 +71,4 @@ public class EqualityUnitTest {
Assert.assertEquals(object1, object2);
Assert.assertNotEquals(object1.getId(), object2.getId());
}
-}
\ No newline at end of file
+}
From 164957ad0ab5baf72a686ef26851b15f6aaeb161 Mon Sep 17 00:00:00 2001
From: Ali Dehghani
Date: Sun, 9 Aug 2020 11:38:50 +0430
Subject: [PATCH 17/26] Improvement for Spring Boot Exit Codes
---
...ExceptionExitCodeGeneratorApplication.java | 21 +++++++++++++++++++
.../FailedToStartException.java | 11 ++++++++++
2 files changed, 32 insertions(+)
create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/ExceptionExitCodeGeneratorApplication.java
create mode 100644 spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/FailedToStartException.java
diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/ExceptionExitCodeGeneratorApplication.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/ExceptionExitCodeGeneratorApplication.java
new file mode 100644
index 0000000000..a4ccb61dbb
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/ExceptionExitCodeGeneratorApplication.java
@@ -0,0 +1,21 @@
+package com.baeldung.exitcode.exceptionexitgen;
+
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class ExceptionExitCodeGeneratorApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ExceptionExitCodeGeneratorApplication.class, args);
+ }
+
+ @Bean
+ CommandLineRunner failApplication() {
+ return args -> {
+ throw new FailedToStartException();
+ };
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/FailedToStartException.java b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/FailedToStartException.java
new file mode 100644
index 0000000000..04ac553153
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization/src/main/java/com/baeldung/exitcode/exceptionexitgen/FailedToStartException.java
@@ -0,0 +1,11 @@
+package com.baeldung.exitcode.exceptionexitgen;
+
+import org.springframework.boot.ExitCodeGenerator;
+
+public class FailedToStartException extends RuntimeException implements ExitCodeGenerator {
+
+ @Override
+ public int getExitCode() {
+ return 127;
+ }
+}
From 2453a731ca25192bb116554faf1d3cb133f33760 Mon Sep 17 00:00:00 2001
From: "amit.pandey"
Date: Sun, 9 Aug 2020 19:35:21 +0530
Subject: [PATCH 18/26] make folder name and artifactId same
---
jhipster-5/bookstore-monolith/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/jhipster-5/bookstore-monolith/pom.xml b/jhipster-5/bookstore-monolith/pom.xml
index 03395e47ed..c965fd962d 100644
--- a/jhipster-5/bookstore-monolith/pom.xml
+++ b/jhipster-5/bookstore-monolith/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.baeldung.jhipster5
- bookstore
+ bookstore-monolith
0.0.1-SNAPSHOT
war
Bookstore
From 0c413754437cb84e3f024802683e8528d8f0a2ff Mon Sep 17 00:00:00 2001
From: azhwani <>
Date: Mon, 10 Aug 2020 13:58:50 +0100
Subject: [PATCH 19/26] quick fix
---
.../controller/RestApiController.java | 20 -------------------
1 file changed, 20 deletions(-)
delete mode 100644 spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
diff --git a/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java b/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
deleted file mode 100644
index 7d5b3ebbaa..0000000000
--- a/spring-5-security/src/main/java/com/baeldung/logoutredirects/controller/RestApiController.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.baeldung.logoutredirects.controller;
-
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-public class RestApiController {
-
- @GetMapping("/login")
- public String login() {
- return "login";
- }
-
- @PostMapping("/logout")
- public String logout() {
- return "redirect:/login";
- }
-
-}
From 009308131f46a10537245afc853eafb10b3603cc Mon Sep 17 00:00:00 2001
From: sampadawagde
Date: Tue, 11 Aug 2020 12:17:02 +0530
Subject: [PATCH 20/26] JAVA-2344: Update "Dockerizing with Jib" article
---
jib/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/jib/pom.xml b/jib/pom.xml
index 1d7413cc18..15e7e44e7c 100644
--- a/jib/pom.xml
+++ b/jib/pom.xml
@@ -40,6 +40,6 @@
- 0.9.10
+ 2.5.0
From b09abfc0bf564d74a10ba11be2e25bc5080da630 Mon Sep 17 00:00:00 2001
From: sampadawagde
Date: Tue, 11 Aug 2020 13:05:01 +0530
Subject: [PATCH 21/26] JAVA-1089: Move the OAuth related lesson code from
spring-boot-modules/spring-boot-security
---
.../SpringBootOAuth2ResourceApplication.java | 30 -------
...ingBootAuthorizationServerApplication.java | 47 ----------
.../config/AuthenticationMananagerConfig.java | 18 ----
.../config/AuthorizationServerConfig.java | 46 ----------
.../config/WebSecurityConfiguration.java | 17 ----
.../SpringBootOAuth2SsoApplication.java | 19 ----
...figAuthorizationServerIntegrationTest.java | 89 -------------------
...figAuthorizationServerIntegrationTest.java | 32 -------
.../OAuth2IntegrationTestSupport.java | 53 -----------
9 files changed, 351 deletions(-)
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthenticationMananagerConfig.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/WebSecurityConfiguration.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java
delete mode 100644 spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java
deleted file mode 100644
index 56231a28bd..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2resource/SpringBootOAuth2ResourceApplication.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2resource;
-
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@EnableResourceServer
-@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2resource")
-public class SpringBootOAuth2ResourceApplication {
-
- public static void main(String[] args) {
- new SpringApplicationBuilder()
- .profiles("resource")
- .sources(SpringBootOAuth2ResourceApplication.class)
- .build()
- .run(args);
- }
-
- @RestController
- class SecuredResourceController {
-
- @GetMapping("/securedResource")
- public String securedResource() {
- return "Baeldung Secured Resource OK";
- }
-
- }
-}
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java
deleted file mode 100644
index 04f046ff78..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/SpringBootAuthorizationServerApplication.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.annotation.CurrentSecurityContext;
-import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
-import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.security.Principal;
-
-@EnableResourceServer
-@EnableAuthorizationServer
-@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2server")
-public class SpringBootAuthorizationServerApplication {
-
- private static final Logger logger = LoggerFactory.getLogger(SpringBootAuthorizationServerApplication.class);
-
- public static void main(String[] args) {
- SpringApplication.run(SpringBootAuthorizationServerApplication.class, args);
- }
-
- @RestController
- class UserController {
-
- @GetMapping("/user")
- public Principal user(Principal user) {
- return user;
- }
-
- @GetMapping("/authentication")
- public Object getAuthentication(@CurrentSecurityContext(expression = "authentication") Authentication authentication) {
- logger.info("authentication -> {}", authentication);
- return authentication.getDetails();
- }
-
- @GetMapping("/principal")
- public String getPrincipal(@CurrentSecurityContext(expression = "authentication.principal") Principal principal) {
- logger.info("principal -> {}", principal);
- return principal.getName();
- }
- }
-}
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthenticationMananagerConfig.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthenticationMananagerConfig.java
deleted file mode 100644
index 2b4135f36d..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthenticationMananagerConfig.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-
-@Configuration
-@Profile("authz")
-public class AuthenticationMananagerConfig extends WebSecurityConfigurerAdapter {
-
- @Bean
- @Override
- public AuthenticationManager authenticationManagerBean() throws Exception {
- return super.authenticationManagerBean();
- }
-}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java
deleted file mode 100644
index 6e21987a89..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/AuthorizationServerConfig.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
-import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
-import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
-
-@Configuration
-@Profile("authz")
-public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
-
- @Autowired
- private AuthenticationManager authenticationManager;
-
- @Override
- public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
- endpoints.authenticationManager(authenticationManager);
- }
-
- @Override
- public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
- clients
- .inMemory()
- .withClient("baeldung")
- .secret(passwordEncoder().encode("baeldung"))
- .authorizedGrantTypes("client_credentials", "password", "authorization_code")
- .scopes("openid", "read")
- .autoApprove(true)
- .and()
- .withClient("baeldung-admin")
- .secret(passwordEncoder().encode("baeldung"))
- .authorizedGrantTypes("authorization_code", "client_credentials", "refresh_token")
- .scopes("read", "write")
- .autoApprove(true);
- }
-
- @Bean
- public BCryptPasswordEncoder passwordEncoder() {
- return new BCryptPasswordEncoder();
- }
-}
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/WebSecurityConfiguration.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/WebSecurityConfiguration.java
deleted file mode 100644
index 3a8c073870..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2server/config/WebSecurityConfiguration.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server.config;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Profile;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-
-@Configuration
-@Profile("!authz")
-public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
-
- @Bean
- public AuthenticationManager customAuthenticationManager() throws Exception {
- return authenticationManager();
- }
-}
diff --git a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java b/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java
deleted file mode 100644
index 342c246e66..0000000000
--- a/spring-boot-modules/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/oauth2sso/SpringBootOAuth2SsoApplication.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2sso;
-
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso;
-import org.springframework.boot.builder.SpringApplicationBuilder;
-
-@EnableOAuth2Sso
-@SpringBootApplication(scanBasePackages = "com.baeldung.springbootsecurity.oauth2sso")
-public class SpringBootOAuth2SsoApplication {
-
- public static void main(String[] args) {
- new SpringApplicationBuilder()
- .profiles("sso")
- .sources(SpringBootOAuth2SsoApplication.class)
- .build()
- .run(args);
- }
-}
diff --git a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java b/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java
deleted file mode 100644
index 104e115b18..0000000000
--- a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/CustomConfigAuthorizationServerIntegrationTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.web.server.LocalServerPort;
-import org.springframework.security.oauth2.client.OAuth2RestTemplate;
-import org.springframework.security.oauth2.client.resource.OAuth2AccessDeniedException;
-import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.net.URL;
-import java.util.regex.Pattern;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootAuthorizationServerApplication.class)
-@ActiveProfiles("authz")
-public class CustomConfigAuthorizationServerIntegrationTest extends OAuth2IntegrationTestSupport {
-
- @LocalServerPort
- private int port;
-
- @Before
- public void setUp() throws Exception {
- base = new URL("http://localhost:" + port);
- }
-
- @Test
- public void givenOAuth2Context_whenAccessTokenIsRequested_ThenAccessTokenValueIsNotNull() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- OAuth2AccessToken accessToken = restTemplate.getAccessToken();
-
- assertNotNull(accessToken);
- }
-
- @Test
- public void givenOAuth2Context_whenAccessingAuthentication_ThenRespondTokenDetails() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- String authentication = executeGetRequest(restTemplate, "/authentication");
-
- Pattern pattern = Pattern.compile("\\{\"remoteAddress\":\".*" +
- "\",\"sessionId\":null,\"tokenValue\":\".*" +
- "\",\"tokenType\":\"Bearer\",\"decodedDetails\":null}");
- assertTrue("authentication", pattern.matcher(authentication).matches());
- }
-
- @Test
- public void givenOAuth2Context_whenAccessingPrincipal_ThenRespondBaeldung() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("read"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- String principal = executeGetRequest(restTemplate, "/principal");
-
- assertEquals("baeldung", principal);
- }
-
- @Test(expected = OAuth2AccessDeniedException.class)
- public void givenOAuth2Context_whenAccessTokenIsRequestedWithInvalidException_ThenExceptionIsThrown() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung", singletonList("write"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- restTemplate.getAccessToken();
- }
-
- @Test
- public void givenOAuth2Context_whenAccessTokenIsRequestedByClientWithWriteScope_ThenAccessTokenIsNotNull() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("baeldung-admin", singletonList("write"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- OAuth2AccessToken accessToken = restTemplate.getAccessToken();
-
- assertNotNull(accessToken);
- }
-
-}
-
diff --git a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java b/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java
deleted file mode 100644
index 4d7b449380..0000000000
--- a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/DefaultConfigAuthorizationServerIntegrationTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.security.oauth2.client.OAuth2RestTemplate;
-import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static java.util.Arrays.asList;
-import static org.junit.Assert.assertNotNull;
-import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootAuthorizationServerApplication.class,
- properties = { "security.oauth2.client.client-id=client", "security.oauth2.client.client-secret=baeldung" })
-public class DefaultConfigAuthorizationServerIntegrationTest extends OAuth2IntegrationTestSupport {
-
- @Test
- public void givenOAuth2Context_whenAccessTokenIsRequested_ThenAccessTokenValueIsNotNull() {
- ClientCredentialsResourceDetails resourceDetails = getClientCredentialsResourceDetails("client", asList("read", "write"));
- OAuth2RestTemplate restTemplate = getOAuth2RestTemplate(resourceDetails);
-
- OAuth2AccessToken accessToken = restTemplate.getAccessToken();
-
- assertNotNull(accessToken);
-
- }
-
-}
-
diff --git a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java b/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java
deleted file mode 100644
index a005965998..0000000000
--- a/spring-boot-modules/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/oauth2server/OAuth2IntegrationTestSupport.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.baeldung.springbootsecurity.oauth2server;
-
-import org.apache.commons.io.IOUtils;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
-import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
-import org.springframework.security.oauth2.client.OAuth2RestTemplate;
-import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
-import org.springframework.web.client.RequestCallback;
-import org.springframework.web.client.ResponseExtractor;
-
-import java.net.URL;
-import java.nio.charset.Charset;
-import java.util.List;
-
-import static java.lang.String.format;
-import static java.util.Collections.singletonList;
-import static org.springframework.http.HttpMethod.GET;
-
-public class OAuth2IntegrationTestSupport {
-
- public static final ResponseExtractor EXTRACT_BODY_AS_STRING = clientHttpResponse ->
- IOUtils.toString(clientHttpResponse.getBody(), Charset.defaultCharset());
- private static final RequestCallback DO_NOTHING_CALLBACK = request -> {
- };
-
- @Value("${local.server.port}")
- protected int port;
-
- protected URL base;
-
- protected ClientCredentialsResourceDetails getClientCredentialsResourceDetails(final String clientId, final List scopes) {
- ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
- resourceDetails.setAccessTokenUri(format("http://localhost:%d/oauth/token", port));
- resourceDetails.setClientId(clientId);
- resourceDetails.setClientSecret("baeldung");
- resourceDetails.setScope(scopes);
- resourceDetails.setGrantType("client_credentials");
- return resourceDetails;
- }
-
- protected OAuth2RestTemplate getOAuth2RestTemplate(final ClientCredentialsResourceDetails resourceDetails) {
- DefaultOAuth2ClientContext clientContext = new DefaultOAuth2ClientContext();
- OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails, clientContext);
- restTemplate.setMessageConverters(singletonList(new MappingJackson2HttpMessageConverter()));
- return restTemplate;
- }
-
- protected String executeGetRequest(OAuth2RestTemplate restTemplate, String path) {
- return restTemplate.execute(base.toString() + path, GET, DO_NOTHING_CALLBACK, EXTRACT_BODY_AS_STRING);
- }
-
-}
From 96502d8626ad700c89927e3e4efa896d4b332b12 Mon Sep 17 00:00:00 2001
From: Krzysztof Woyke
Date: Tue, 11 Aug 2020 15:09:34 +0200
Subject: [PATCH 22/26] JAVA-2380: Fix failing integration tests in the
spring-data-jpa-enterprise
---
.../src/main/java/com/baeldung/boot/Application.java | 4 ++--
.../src/main/java/com/baeldung/osiv/model/BasicUser.java | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/Application.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/Application.java
index aaca760499..d9da2c53b6 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/Application.java
+++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/boot/Application.java
@@ -6,8 +6,8 @@ import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
-@EnableJpaRepositories("com.baeldung")
-@EntityScan("com.baeldung")
+@EnableJpaRepositories("com.baeldung.boot")
+@EntityScan("com.baeldung.boot")
public class Application {
public static void main(String[] args) {
diff --git a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/osiv/model/BasicUser.java b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/osiv/model/BasicUser.java
index 98f4e379d4..a4f8e4e5f2 100644
--- a/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/osiv/model/BasicUser.java
+++ b/persistence-modules/spring-data-jpa-enterprise/src/main/java/com/baeldung/osiv/model/BasicUser.java
@@ -4,7 +4,7 @@ import javax.persistence.*;
import java.util.Set;
@Entity
-@Table(name = "users")
+@Table(name = "basic_users")
public class BasicUser {
@Id
From ded13f14b22653a8448b62b731a28ce22110d912 Mon Sep 17 00:00:00 2001
From: Daniel Strmecki
Date: Tue, 11 Aug 2020 19:29:46 +0200
Subject: [PATCH 23/26] Feature/bael 4280 diff between lists (#9600)
* BAEL-4280: Initial commit for finding diff between lists
* BAEL-4280: Format
* BAEL-4280: Refactor
* BAEL-4280: Refactor not to use private methods
* BAEL-4280: Refactor based on editor comments
* BAEL-4280: Review round 2
* BAEL-4280: Use assertj
* BAEL-4280: Use assertj
* BAEL-4280: Shorter names for tests
* BAEL-4280: Remove HashSet as its not used anymore
* BAEL-4280: Use containsExactlyInAnyOrder for Set example
* BAEL-4280: Remove distinct method call
* BAEL-4280: Move impl to test
* BAEL-4280: Use containsExactlyInAnyOrder
* BAEL-4280: Rename test methods
---
.../core-java-collections-list-3/pom.xml | 6 ++
.../FindDifferencesBetweenListsUnitTest.java | 96 +++++++++++++++++++
2 files changed, 102 insertions(+)
create mode 100644 core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/difference/FindDifferencesBetweenListsUnitTest.java
diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml
index 373190a130..e1cf645c8a 100644
--- a/core-java-modules/core-java-collections-list-3/pom.xml
+++ b/core-java-modules/core-java-collections-list-3/pom.xml
@@ -21,6 +21,12 @@
commons-collections4
${commons-collections4.version}
+
+ com.google.guava
+ guava
+ ${guava.version}
+ compile
+
org.assertj
assertj-core
diff --git a/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/difference/FindDifferencesBetweenListsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/difference/FindDifferencesBetweenListsUnitTest.java
new file mode 100644
index 0000000000..ceeff5e442
--- /dev/null
+++ b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/list/difference/FindDifferencesBetweenListsUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.list.difference;
+
+import com.google.common.collect.Sets;
+import org.apache.commons.collections4.CollectionUtils;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.assertj.core.api.Assertions.*;
+
+public class FindDifferencesBetweenListsUnitTest {
+
+ private static final List listOne = Arrays.asList("Jack", "Tom", "Sam", "John", "James", "Jack");
+ private static final List listTwo = Arrays.asList("Jack", "Daniel", "Sam", "Alan", "James", "George");
+
+ @Test
+ public void givenLists_whenUsingPlainJavaImpl_thenDifferencesAreFound() {
+ List differences = new ArrayList<>(listOne);
+ differences.removeAll(listTwo);
+ assertEquals(2, differences.size());
+ assertThat(differences).containsExactly("Tom", "John");
+ }
+
+ @Test
+ public void givenReverseLists_whenUsingPlainJavaImpl_thenDifferencesAreFound() {
+ List differences = new ArrayList<>(listTwo);
+ differences.removeAll(listOne);
+ assertEquals(3, differences.size());
+ assertThat(differences).containsExactly("Daniel", "Alan", "George");
+ }
+
+ @Test
+ public void givenLists_whenUsingJavaStreams_thenDifferencesAreFound() {
+ List differences = listOne.stream()
+ .filter(element -> !listTwo.contains(element))
+ .collect(Collectors.toList());
+ assertEquals(2, differences.size());
+ assertThat(differences).containsExactly("Tom", "John");
+ }
+
+ @Test
+ public void givenReverseLists_whenUsingJavaStreams_thenDifferencesAreFound() {
+ List differences = listTwo.stream()
+ .filter(element -> !listOne.contains(element))
+ .collect(Collectors.toList());
+ assertEquals(3, differences.size());
+ assertThat(differences).containsExactly("Daniel", "Alan", "George");
+ }
+
+ @Test
+ public void givenLists_whenUsingGoogleGuava_thenDifferencesAreFound() {
+ List differences = new ArrayList<>(Sets.difference(Sets.newHashSet(listOne), Sets.newHashSet(listTwo)));
+ assertEquals(2, differences.size());
+ assertThat(differences).containsExactlyInAnyOrder("Tom", "John");
+ }
+
+ @Test
+ public void givenReverseLists_whenUsingGoogleGuava_thenDifferencesAreFound() {
+ List differences = new ArrayList<>(Sets.difference(Sets.newHashSet(listTwo), Sets.newHashSet(listOne)));
+ assertEquals(3, differences.size());
+ assertThat(differences).containsExactlyInAnyOrder("Daniel", "Alan", "George");
+ }
+
+ @Test
+ public void givenLists_whenUsingApacheCommons_thenDifferencesAreFound() {
+ List differences = new ArrayList<>((CollectionUtils.removeAll(listOne, listTwo)));
+ assertEquals(2, differences.size());
+ assertThat(differences).containsExactly("Tom", "John");
+ }
+
+ @Test
+ public void givenReverseLists_whenUsingApacheCommons_thenDifferencesAreFound() {
+ List differences = new ArrayList<>((CollectionUtils.removeAll(listTwo, listOne)));
+ assertEquals(3, differences.size());
+ assertThat(differences).containsExactly("Daniel", "Alan", "George");
+ }
+
+ @Test
+ public void givenLists_whenUsingPlainJavaImpl_thenDifferencesWithDuplicatesAreFound() {
+ List differences = new ArrayList<>(listOne);
+ listTwo.forEach(differences::remove);
+ assertThat(differences).containsExactly("Tom", "John", "Jack");
+ }
+
+ @Test
+ public void givenLists_whenUsingApacheCommons_thenDifferencesWithDuplicatesAreFound() {
+ List differences = new ArrayList<>(CollectionUtils.subtract(listOne, listTwo));
+ assertEquals(3, differences.size());
+ assertThat(differences).containsExactly("Tom", "John", "Jack");
+ }
+
+}
From 94f50e785ee122b1f31310a5b6f518990841fda6 Mon Sep 17 00:00:00 2001
From: Mona Mohamadinia
Date: Tue, 11 Aug 2020 22:50:22 +0430
Subject: [PATCH 24/26] ThreadLocals and Thread Pools (#9592)
---
.../ThreadLocalAwareThreadPool.java | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalAwareThreadPool.java
diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalAwareThreadPool.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalAwareThreadPool.java
new file mode 100644
index 0000000000..5a41cd9dbf
--- /dev/null
+++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalAwareThreadPool.java
@@ -0,0 +1,25 @@
+package com.baeldung.threadlocal;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class ThreadLocalAwareThreadPool extends ThreadPoolExecutor {
+
+ public ThreadLocalAwareThreadPool(int corePoolSize,
+ int maximumPoolSize,
+ long keepAliveTime,
+ TimeUnit unit,
+ BlockingQueue workQueue,
+ ThreadFactory threadFactory,
+ RejectedExecutionHandler handler) {
+ super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
+ }
+
+ @Override
+ protected void afterExecute(Runnable r, Throwable t) {
+ // Call remove on each ThreadLocal
+ }
+}
From e52c8269680c821a2aa612dee9ab9f67de119588 Mon Sep 17 00:00:00 2001
From: Krzysiek
Date: Tue, 11 Aug 2020 22:14:45 +0200
Subject: [PATCH 25/26] JAVA-1648: Get rid of the overriden spring-boot.version
property in spring-5-security
---
spring-5-security/pom.xml | 3 ---
1 file changed, 3 deletions(-)
diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml
index 3fd31c8bc5..c486d5346b 100644
--- a/spring-5-security/pom.xml
+++ b/spring-5-security/pom.xml
@@ -60,8 +60,5 @@
-
- 2.2.1.RELEASE
-
From 986566727c3d4ee908271c5978de246140525e83 Mon Sep 17 00:00:00 2001
From: Krzysiek
Date: Wed, 12 Aug 2020 21:40:45 +0200
Subject: [PATCH 26/26] JAVA-1640: Get rid of the overriden spring-boot.version
property
---
spring-5-security-oauth/pom.xml | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml
index 40d54bf668..325aacea86 100644
--- a/spring-5-security-oauth/pom.xml
+++ b/spring-5-security-oauth/pom.xml
@@ -37,7 +37,7 @@
org.springframework.security.oauth.boot
spring-security-oauth2-autoconfigure
- ${oauth-auto.version}
+ ${spring-boot.version}
org.springframework.security
@@ -65,8 +65,6 @@
- 2.1.0.RELEASE
- 2.1.0.RELEASE
com.baeldung.oauth2.SpringOAuthApplication