From b32138629ab0aec63418b3715dd4b8cd2df47eaf Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 3 Jul 2019 20:41:14 +0100 Subject: [PATCH 01/99] initial commit --- .../.gitignore | 21 ++++++++ java-hexagonal-architecture-example/pom.xml | 28 ++++++++++ .../main/java/com/baeldung/Application.java | 15 ++++++ .../application/EmployeeRestAdapter.java | 44 ++++++++++++++++ .../config/ApplicationConfiguration.java | 24 +++++++++ .../java/com/baeldung/domain/Employee.java | 52 +++++++++++++++++++ .../domain/EmployeeRepositoryPort.java | 13 +++++ .../domain/EmployeeServiceAdapter.java | 45 ++++++++++++++++ .../baeldung/domain/EmployeeServicePort.java | 16 ++++++ .../exception/EmployeeNotFoundException.java | 6 +++ .../InMemoryEmployeeRepositoryAdapter.java | 37 +++++++++++++ .../EmployeeServiceAdapterUnitTest.java | 38 ++++++++++++++ 12 files changed, 339 insertions(+) create mode 100644 java-hexagonal-architecture-example/.gitignore create mode 100644 java-hexagonal-architecture-example/pom.xml create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java create mode 100644 java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java diff --git a/java-hexagonal-architecture-example/.gitignore b/java-hexagonal-architecture-example/.gitignore new file mode 100644 index 0000000000..69ec9daf41 --- /dev/null +++ b/java-hexagonal-architecture-example/.gitignore @@ -0,0 +1,21 @@ +/build/ +/target/ +/.gradle/ +/.settings/ +/bin/ +.project +.classpath +*.log +.DS_Store +.idea/** +*.class +*.log +*.ctxt +.mtj.tmp/ +*.jar +*.war +*.ear +*.zip +*.tar.gz +*.rar +hs_err_pid* diff --git a/java-hexagonal-architecture-example/pom.xml b/java-hexagonal-architecture-example/pom.xml new file mode 100644 index 0000000000..f2645e7666 --- /dev/null +++ b/java-hexagonal-architecture-example/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + java-hexagonal-architecture-example + java-hexagonal-architecture-example + 0.0.1-SNAPSHOT + java-hexagonal-architecture-example + jar + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + org.springframework.boot + spring-boot-starter-web + 2.1.6.RELEASE + + + org.springframework.boot + spring-boot-starter-test + 2.1.6.RELEASE + test + + + \ No newline at end of file diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..b98a73ab48 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Spring Boot application main runner. + */ +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java new file mode 100644 index 0000000000..47f87d4f66 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java @@ -0,0 +1,44 @@ +package com.baeldung.application; + +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.domain.Employee; +import com.baeldung.domain.EmployeeServicePort; +import com.baeldung.exception.EmployeeNotFoundException; + +@RestController +public class EmployeeRestAdapter { + + private EmployeeServicePort employeeServicePort; + + public EmployeeRestAdapter(EmployeeServicePort employeeServicePort) { + this.employeeServicePort = employeeServicePort; + } + + @GetMapping + public List getAllEmployees() { + return employeeServicePort.getAll(); + } + + @GetMapping ("{employeeId}") + public Employee getById(@PathVariable String employeeId) throws EmployeeNotFoundException { + return employeeServicePort.get(employeeId); + } + + @PostMapping + public Employee create(@RequestBody Employee employee) { + return employeeServicePort.create(employee); + } + + @PutMapping + public Employee update(@RequestBody Employee employee) { + return employeeServicePort.update(employee); + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java new file mode 100644 index 0000000000..3b0ee9ca84 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java @@ -0,0 +1,24 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.baeldung.domain.EmployeeRepositoryPort; +import com.baeldung.domain.EmployeeServiceAdapter; +import com.baeldung.domain.EmployeeServicePort; +import com.baeldung.infrastructure.InMemoryEmployeeRepositoryAdapter; + +@Configuration +public class ApplicationConfiguration { + + @Bean + public EmployeeServicePort employeeServicePort( + EmployeeRepositoryPort employeeRepositoryPort) { + return new EmployeeServiceAdapter(employeeRepositoryPort); + } + + @Bean + public EmployeeRepositoryPort employeeRepositoryPort() { + return new InMemoryEmployeeRepositoryAdapter(); + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java new file mode 100644 index 0000000000..48093df658 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java @@ -0,0 +1,52 @@ +package com.baeldung.domain; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; + +@JsonDeserialize (builder = Employee.Builder.class) +public class Employee { + + private final String employeeId; + private final String name; + + private Employee( + Builder builder) { + this.employeeId = builder.employeeId; + this.name = builder.name; + } + + public String getEmployeeId() { + return employeeId; + } + + public String getName() { + return name; + } + + public static Builder builder() { + return new Builder(); + } + + @JsonPOJOBuilder + public static final class Builder { + private String employeeId; + private String name; + + private Builder() { + } + + public Builder withEmployeeId(String employeeId) { + this.employeeId = employeeId; + return this; + } + + public Builder withName(String name) { + this.name = name; + return this; + } + + public Employee build() { + return new Employee(this); + } + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java new file mode 100644 index 0000000000..d1138ff7d7 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java @@ -0,0 +1,13 @@ +package com.baeldung.domain; + +import java.util.List; +import java.util.Optional; + +public interface EmployeeRepositoryPort { + + List findAll(); + + Optional findById(String employeeId); + + Employee save(Employee employee); +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java new file mode 100644 index 0000000000..c3f387f7a0 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java @@ -0,0 +1,45 @@ +package com.baeldung.domain; + +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baeldung.exception.EmployeeNotFoundException; + +@Service +public class EmployeeServiceAdapter implements EmployeeServicePort { + + private EmployeeRepositoryPort employeeRepositoryPort; + + @Autowired + public EmployeeServiceAdapter( + EmployeeRepositoryPort employeeRepositoryPort) { + this.employeeRepositoryPort = employeeRepositoryPort; + } + + @Override + public List getAll() { + return employeeRepositoryPort.findAll(); + } + + @Override + public Employee get(String employeeId) throws EmployeeNotFoundException { + Optional employee = employeeRepositoryPort.findById(employeeId); + if (employee.isPresent()) { + return employee.get(); + } + throw new EmployeeNotFoundException(); + } + + @Override + public Employee create(Employee employee) { + return employeeRepositoryPort.save(employee); + } + + @Override + public Employee update(Employee employee) { + return employeeRepositoryPort.save(employee); + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java new file mode 100644 index 0000000000..3de53fc1e0 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java @@ -0,0 +1,16 @@ +package com.baeldung.domain; + +import java.util.List; + +import com.baeldung.exception.EmployeeNotFoundException; + +public interface EmployeeServicePort { + + List getAll(); + + Employee get(String employeeId) throws EmployeeNotFoundException; + + Employee create(Employee employee); + + Employee update(Employee employee); +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java new file mode 100644 index 0000000000..72df315b57 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java @@ -0,0 +1,6 @@ +package com.baeldung.exception; + +public class EmployeeNotFoundException extends Exception { + + private static final long serialVersionUID = -7130595265355361728L; +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java new file mode 100644 index 0000000000..056a59ba51 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java @@ -0,0 +1,37 @@ +package com.baeldung.infrastructure; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.baeldung.domain.Employee; +import com.baeldung.domain.EmployeeRepositoryPort; + +@Repository +public class InMemoryEmployeeRepositoryAdapter implements EmployeeRepositoryPort { + + private Map employeeRepository = new HashMap<>(); + + @Override + public List findAll() { + return new ArrayList<>(employeeRepository.values()); + } + + @Override + public Optional findById(String employeeId) { + if (employeeRepository.containsKey(employeeId)) { + return Optional.of(employeeRepository.get(employeeId)); + } + return Optional.empty(); + } + + @Override + public Employee save(Employee employee) { + employeeRepository.put(employee.getEmployeeId(), employee); + return employee; + } +} diff --git a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java new file mode 100644 index 0000000000..f0be334e29 --- /dev/null +++ b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.domain; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith (MockitoJUnitRunner.class) +public class EmployeeServiceAdapterUnitTest { + + @Mock + private EmployeeRepositoryPort employeeRepositoryPort; + @InjectMocks + private EmployeeServiceAdapter adapter; + + @Test + public void whenGettingAllEmployeesWillReturnAListWithOneElement() { + Employee employee = Employee.builder() + .withEmployeeId("ABC123") + .withName("Bob Doe") + .build(); + + when(employeeRepositoryPort.findAll()).thenReturn(Arrays.asList(employee)); + + List result = adapter.getAll(); + assertThat(result, hasSize(1)); + assertThat(result, containsInAnyOrder(employee)); + } +} From d3661fdb58f0ac2219969c464bbdc320d2d9f9e0 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 7 Jul 2019 11:37:46 +0100 Subject: [PATCH 02/99] Reformatting and addressing review comments --- .../main/java/com/baeldung/Application.java | 6 +- .../application/EmployeeRestAdapter.java | 41 ++++++----- .../config/ApplicationConfiguration.java | 19 +++-- .../java/com/baeldung/domain/Employee.java | 71 +++++++++---------- .../domain/EmployeeRepositoryPort.java | 6 +- .../com/baeldung/domain/EmployeeService.java | 38 ++++++++++ .../domain/EmployeeServiceAdapter.java | 45 ------------ .../baeldung/domain/EmployeeServicePort.java | 10 ++- .../exception/EmployeeNotFoundException.java | 6 -- .../InMemoryEmployeeRepositoryAdapter.java | 34 ++++----- .../EmployeeServiceAdapterUnitTest.java | 38 ---------- .../domain/EmployeeServiceUnitTest.java | 38 ++++++++++ 12 files changed, 167 insertions(+), 185 deletions(-) create mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java delete mode 100644 java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java create mode 100644 java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java index b98a73ab48..e6655ded82 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java @@ -9,7 +9,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java index 47f87d4f66..bb0dc129b0 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java @@ -11,34 +11,33 @@ import org.springframework.web.bind.annotation.RestController; import com.baeldung.domain.Employee; import com.baeldung.domain.EmployeeServicePort; -import com.baeldung.exception.EmployeeNotFoundException; @RestController public class EmployeeRestAdapter { - private EmployeeServicePort employeeServicePort; + private EmployeeServicePort employeeServicePort; - public EmployeeRestAdapter(EmployeeServicePort employeeServicePort) { - this.employeeServicePort = employeeServicePort; - } + public EmployeeRestAdapter(EmployeeServicePort employeeServicePort) { + this.employeeServicePort = employeeServicePort; + } - @GetMapping - public List getAllEmployees() { - return employeeServicePort.getAll(); - } + @GetMapping + public List getAllEmployees() { + return employeeServicePort.getAll(); + } - @GetMapping ("{employeeId}") - public Employee getById(@PathVariable String employeeId) throws EmployeeNotFoundException { - return employeeServicePort.get(employeeId); - } + @GetMapping("{employeeId}") + public Employee getById(@PathVariable String employeeId) { + return employeeServicePort.get(employeeId); + } - @PostMapping - public Employee create(@RequestBody Employee employee) { - return employeeServicePort.create(employee); - } + @PostMapping + public Employee create(@RequestBody Employee employee) { + return employeeServicePort.create(employee); + } - @PutMapping - public Employee update(@RequestBody Employee employee) { - return employeeServicePort.update(employee); - } + @PutMapping + public Employee update(@RequestBody Employee employee) { + return employeeServicePort.update(employee); + } } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java index 3b0ee9ca84..5a8dc701c4 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java @@ -4,21 +4,20 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baeldung.domain.EmployeeRepositoryPort; -import com.baeldung.domain.EmployeeServiceAdapter; +import com.baeldung.domain.EmployeeService; import com.baeldung.domain.EmployeeServicePort; import com.baeldung.infrastructure.InMemoryEmployeeRepositoryAdapter; @Configuration public class ApplicationConfiguration { - @Bean - public EmployeeServicePort employeeServicePort( - EmployeeRepositoryPort employeeRepositoryPort) { - return new EmployeeServiceAdapter(employeeRepositoryPort); - } + @Bean + public EmployeeServicePort employeeServicePort(EmployeeRepositoryPort employeeRepositoryPort) { + return new EmployeeService(employeeRepositoryPort); + } - @Bean - public EmployeeRepositoryPort employeeRepositoryPort() { - return new InMemoryEmployeeRepositoryAdapter(); - } + @Bean + public EmployeeRepositoryPort employeeRepositoryPort() { + return new InMemoryEmployeeRepositoryAdapter(); + } } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java index 48093df658..59c44b63ac 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java @@ -3,50 +3,49 @@ package com.baeldung.domain; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; -@JsonDeserialize (builder = Employee.Builder.class) +@JsonDeserialize(builder = Employee.Builder.class) public class Employee { - private final String employeeId; - private final String name; + private final String employeeId; + private final String name; - private Employee( - Builder builder) { - this.employeeId = builder.employeeId; - this.name = builder.name; - } - - public String getEmployeeId() { - return employeeId; - } - - public String getName() { - return name; - } - - public static Builder builder() { - return new Builder(); - } - - @JsonPOJOBuilder - public static final class Builder { - private String employeeId; - private String name; - - private Builder() { + private Employee(Builder builder) { + this.employeeId = builder.employeeId; + this.name = builder.name; } - public Builder withEmployeeId(String employeeId) { - this.employeeId = employeeId; - return this; + public String getEmployeeId() { + return employeeId; } - public Builder withName(String name) { - this.name = name; - return this; + public String getName() { + return name; } - public Employee build() { - return new Employee(this); + public static Builder builder() { + return new Builder(); + } + + @JsonPOJOBuilder + public static final class Builder { + private String employeeId; + private String name; + + private Builder() { + } + + public Builder withEmployeeId(String employeeId) { + this.employeeId = employeeId; + return this; + } + + public Builder withName(String name) { + this.name = name; + return this; + } + + public Employee build() { + return new Employee(this); + } } - } } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java index d1138ff7d7..e140e6aa26 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java @@ -5,9 +5,9 @@ import java.util.Optional; public interface EmployeeRepositoryPort { - List findAll(); + List findAll(); - Optional findById(String employeeId); + Optional findById(String employeeId); - Employee save(Employee employee); + Employee save(Employee employee); } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java new file mode 100644 index 0000000000..66ab173a39 --- /dev/null +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java @@ -0,0 +1,38 @@ +package com.baeldung.domain; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EmployeeService implements EmployeeServicePort { + + private EmployeeRepositoryPort employeeRepositoryPort; + + @Autowired + public EmployeeService(EmployeeRepositoryPort employeeRepositoryPort) { + this.employeeRepositoryPort = employeeRepositoryPort; + } + + @Override + public List getAll() { + return employeeRepositoryPort.findAll(); + } + + @Override + public Employee get(String employeeId) { + return employeeRepositoryPort.findById(employeeId) + .get(); + } + + @Override + public Employee create(Employee employee) { + return employeeRepositoryPort.save(employee); + } + + @Override + public Employee update(Employee employee) { + return employeeRepositoryPort.save(employee); + } +} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java deleted file mode 100644 index c3f387f7a0..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServiceAdapter.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.baeldung.domain; - -import java.util.List; -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.baeldung.exception.EmployeeNotFoundException; - -@Service -public class EmployeeServiceAdapter implements EmployeeServicePort { - - private EmployeeRepositoryPort employeeRepositoryPort; - - @Autowired - public EmployeeServiceAdapter( - EmployeeRepositoryPort employeeRepositoryPort) { - this.employeeRepositoryPort = employeeRepositoryPort; - } - - @Override - public List getAll() { - return employeeRepositoryPort.findAll(); - } - - @Override - public Employee get(String employeeId) throws EmployeeNotFoundException { - Optional employee = employeeRepositoryPort.findById(employeeId); - if (employee.isPresent()) { - return employee.get(); - } - throw new EmployeeNotFoundException(); - } - - @Override - public Employee create(Employee employee) { - return employeeRepositoryPort.save(employee); - } - - @Override - public Employee update(Employee employee) { - return employeeRepositoryPort.save(employee); - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java index 3de53fc1e0..3e9162a5c1 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java @@ -2,15 +2,13 @@ package com.baeldung.domain; import java.util.List; -import com.baeldung.exception.EmployeeNotFoundException; - public interface EmployeeServicePort { - List getAll(); + List getAll(); - Employee get(String employeeId) throws EmployeeNotFoundException; + Employee get(String employeeId); - Employee create(Employee employee); + Employee create(Employee employee); - Employee update(Employee employee); + Employee update(Employee employee); } diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java deleted file mode 100644 index 72df315b57..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/exception/EmployeeNotFoundException.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.baeldung.exception; - -public class EmployeeNotFoundException extends Exception { - - private static final long serialVersionUID = -7130595265355361728L; -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java index 056a59ba51..7f521596ef 100644 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java +++ b/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java @@ -14,24 +14,24 @@ import com.baeldung.domain.EmployeeRepositoryPort; @Repository public class InMemoryEmployeeRepositoryAdapter implements EmployeeRepositoryPort { - private Map employeeRepository = new HashMap<>(); + private Map employeeRepository = new HashMap<>(); - @Override - public List findAll() { - return new ArrayList<>(employeeRepository.values()); - } - - @Override - public Optional findById(String employeeId) { - if (employeeRepository.containsKey(employeeId)) { - return Optional.of(employeeRepository.get(employeeId)); + @Override + public List findAll() { + return new ArrayList<>(employeeRepository.values()); } - return Optional.empty(); - } - @Override - public Employee save(Employee employee) { - employeeRepository.put(employee.getEmployeeId(), employee); - return employee; - } + @Override + public Optional findById(String employeeId) { + if (employeeRepository.containsKey(employeeId)) { + return Optional.of(employeeRepository.get(employeeId)); + } + return Optional.empty(); + } + + @Override + public Employee save(Employee employee) { + employeeRepository.put(employee.getEmployeeId(), employee); + return employee; + } } diff --git a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java deleted file mode 100644 index f0be334e29..0000000000 --- a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceAdapterUnitTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.domain; - -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith (MockitoJUnitRunner.class) -public class EmployeeServiceAdapterUnitTest { - - @Mock - private EmployeeRepositoryPort employeeRepositoryPort; - @InjectMocks - private EmployeeServiceAdapter adapter; - - @Test - public void whenGettingAllEmployeesWillReturnAListWithOneElement() { - Employee employee = Employee.builder() - .withEmployeeId("ABC123") - .withName("Bob Doe") - .build(); - - when(employeeRepositoryPort.findAll()).thenReturn(Arrays.asList(employee)); - - List result = adapter.getAll(); - assertThat(result, hasSize(1)); - assertThat(result, containsInAnyOrder(employee)); - } -} diff --git a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java new file mode 100644 index 0000000000..9cc94f3505 --- /dev/null +++ b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.domain; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class EmployeeServiceUnitTest { + + @Mock + private EmployeeRepositoryPort employeeRepositoryPort; + @InjectMocks + private EmployeeService adapter; + + @Test + public void whenGettingAllEmployeesWillReturnAListWithOneElement() { + Employee employee = Employee.builder() + .withEmployeeId("ABC123") + .withName("Bob Doe") + .build(); + + when(employeeRepositoryPort.findAll()).thenReturn(Arrays.asList(employee)); + + List result = adapter.getAll(); + assertThat(result, hasSize(1)); + assertThat(result, containsInAnyOrder(employee)); + } +} From 34300d031169c2a2fc4605ce0996cb3fddb75e57 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 22 Aug 2019 20:44:22 +0100 Subject: [PATCH 03/99] Examples for 'Finding the difference between two strings in Java' --- java-string-diff/pom.xml | 26 +++++++ .../stringdiff/StringDiffUnitTest.java | 69 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 java-string-diff/pom.xml create mode 100644 java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java diff --git a/java-string-diff/pom.xml b/java-string-diff/pom.xml new file mode 100644 index 0000000000..79dddea9fb --- /dev/null +++ b/java-string-diff/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + java-string-diff + java-string-diff + java-string-diff + jar + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + org.bitbucket.cowwoc + diff-match-patch + 1.1 + + + org.apache.commons + commons-lang3 + 3.9 + + + \ No newline at end of file diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java new file mode 100644 index 0000000000..fc335a0467 --- /dev/null +++ b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.stringdiff; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.junit.Test; + +public class StringDiffUnitTest { + + private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); + + @Test + public void testStringDiff() { + String text1 = "ABCDELMN"; + String text2 = "ABCFGLMN"; + + // Diff with Diff-Match-Patch + System.out.println(diffMatchPatch.diffMain(text1, text2, false)); + System.out.println(diffMatchPatch.diffMain(text2, text1, false)); + + // Diff with StringUtils + System.out.println(StringUtils.difference(text1, text2)); + System.out.println(StringUtils.difference(text2, text1)); + } + + @Test + public void testPerformance() { + // Create input + List inputs = randomizeInputs(10000); + + // Google diff match patch + LocalDateTime begin = LocalDateTime.now(); + for (int i = 0; i < inputs.size() - 1; i++) { + diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); + } + System.out.println("Diff-Match-Patch Duration: " + Duration.between(begin, LocalDateTime.now()) + .toMillis()); + + // Apache commons + begin = LocalDateTime.now(); + for (int i = 0; i < inputs.size() - 1; i++) { + StringUtils.difference(inputs.get(i), inputs.get(i + 1)); + } + System.out.println("StringUtils Duration: " + Duration.between(begin, LocalDateTime.now()) + .toMillis()); + } + + /** + * Creates a list of a given size, containing 30 character long strings, + * each starting with a static prefix of 10 characters and followed by + * a random 20 character suffix + * + * @return a {@link List} of randomised strings + */ + private List randomizeInputs(int size) { + String staticPart = "ABCDEF1234"; + List inputs = new ArrayList<>(); + for (int i = 0; i < size; i++) { + inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20)); + } + return inputs; + } + +} From 86d9994776576766184bc97191b8babdf7701751 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 22 Aug 2019 20:49:04 +0100 Subject: [PATCH 04/99] Removing evaluation article code --- .../.gitignore | 21 -------- java-hexagonal-architecture-example/pom.xml | 28 ---------- .../main/java/com/baeldung/Application.java | 15 ------ .../application/EmployeeRestAdapter.java | 43 ---------------- .../config/ApplicationConfiguration.java | 23 --------- .../java/com/baeldung/domain/Employee.java | 51 ------------------- .../domain/EmployeeRepositoryPort.java | 13 ----- .../com/baeldung/domain/EmployeeService.java | 38 -------------- .../baeldung/domain/EmployeeServicePort.java | 14 ----- .../InMemoryEmployeeRepositoryAdapter.java | 37 -------------- .../domain/EmployeeServiceUnitTest.java | 38 -------------- 11 files changed, 321 deletions(-) delete mode 100644 java-hexagonal-architecture-example/.gitignore delete mode 100644 java-hexagonal-architecture-example/pom.xml delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java delete mode 100644 java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java delete mode 100644 java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java diff --git a/java-hexagonal-architecture-example/.gitignore b/java-hexagonal-architecture-example/.gitignore deleted file mode 100644 index 69ec9daf41..0000000000 --- a/java-hexagonal-architecture-example/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -/build/ -/target/ -/.gradle/ -/.settings/ -/bin/ -.project -.classpath -*.log -.DS_Store -.idea/** -*.class -*.log -*.ctxt -.mtj.tmp/ -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar -hs_err_pid* diff --git a/java-hexagonal-architecture-example/pom.xml b/java-hexagonal-architecture-example/pom.xml deleted file mode 100644 index f2645e7666..0000000000 --- a/java-hexagonal-architecture-example/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - 4.0.0 - java-hexagonal-architecture-example - java-hexagonal-architecture-example - 0.0.1-SNAPSHOT - java-hexagonal-architecture-example - jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - org.springframework.boot - spring-boot-starter-web - 2.1.6.RELEASE - - - org.springframework.boot - spring-boot-starter-test - 2.1.6.RELEASE - test - - - \ No newline at end of file diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java deleted file mode 100644 index e6655ded82..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/Application.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Spring Boot application main runner. - */ -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java deleted file mode 100644 index bb0dc129b0..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/application/EmployeeRestAdapter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.application; - -import java.util.List; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.domain.Employee; -import com.baeldung.domain.EmployeeServicePort; - -@RestController -public class EmployeeRestAdapter { - - private EmployeeServicePort employeeServicePort; - - public EmployeeRestAdapter(EmployeeServicePort employeeServicePort) { - this.employeeServicePort = employeeServicePort; - } - - @GetMapping - public List getAllEmployees() { - return employeeServicePort.getAll(); - } - - @GetMapping("{employeeId}") - public Employee getById(@PathVariable String employeeId) { - return employeeServicePort.get(employeeId); - } - - @PostMapping - public Employee create(@RequestBody Employee employee) { - return employeeServicePort.create(employee); - } - - @PutMapping - public Employee update(@RequestBody Employee employee) { - return employeeServicePort.update(employee); - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java deleted file mode 100644 index 5a8dc701c4..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/config/ApplicationConfiguration.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.baeldung.domain.EmployeeRepositoryPort; -import com.baeldung.domain.EmployeeService; -import com.baeldung.domain.EmployeeServicePort; -import com.baeldung.infrastructure.InMemoryEmployeeRepositoryAdapter; - -@Configuration -public class ApplicationConfiguration { - - @Bean - public EmployeeServicePort employeeServicePort(EmployeeRepositoryPort employeeRepositoryPort) { - return new EmployeeService(employeeRepositoryPort); - } - - @Bean - public EmployeeRepositoryPort employeeRepositoryPort() { - return new InMemoryEmployeeRepositoryAdapter(); - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java deleted file mode 100644 index 59c44b63ac..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/Employee.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.baeldung.domain; - -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; - -@JsonDeserialize(builder = Employee.Builder.class) -public class Employee { - - private final String employeeId; - private final String name; - - private Employee(Builder builder) { - this.employeeId = builder.employeeId; - this.name = builder.name; - } - - public String getEmployeeId() { - return employeeId; - } - - public String getName() { - return name; - } - - public static Builder builder() { - return new Builder(); - } - - @JsonPOJOBuilder - public static final class Builder { - private String employeeId; - private String name; - - private Builder() { - } - - public Builder withEmployeeId(String employeeId) { - this.employeeId = employeeId; - return this; - } - - public Builder withName(String name) { - this.name = name; - return this; - } - - public Employee build() { - return new Employee(this); - } - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java deleted file mode 100644 index e140e6aa26..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeRepositoryPort.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.domain; - -import java.util.List; -import java.util.Optional; - -public interface EmployeeRepositoryPort { - - List findAll(); - - Optional findById(String employeeId); - - Employee save(Employee employee); -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java deleted file mode 100644 index 66ab173a39..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.domain; - -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class EmployeeService implements EmployeeServicePort { - - private EmployeeRepositoryPort employeeRepositoryPort; - - @Autowired - public EmployeeService(EmployeeRepositoryPort employeeRepositoryPort) { - this.employeeRepositoryPort = employeeRepositoryPort; - } - - @Override - public List getAll() { - return employeeRepositoryPort.findAll(); - } - - @Override - public Employee get(String employeeId) { - return employeeRepositoryPort.findById(employeeId) - .get(); - } - - @Override - public Employee create(Employee employee) { - return employeeRepositoryPort.save(employee); - } - - @Override - public Employee update(Employee employee) { - return employeeRepositoryPort.save(employee); - } -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java deleted file mode 100644 index 3e9162a5c1..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/domain/EmployeeServicePort.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.domain; - -import java.util.List; - -public interface EmployeeServicePort { - - List getAll(); - - Employee get(String employeeId); - - Employee create(Employee employee); - - Employee update(Employee employee); -} diff --git a/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java b/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java deleted file mode 100644 index 7f521596ef..0000000000 --- a/java-hexagonal-architecture-example/src/main/java/com/baeldung/infrastructure/InMemoryEmployeeRepositoryAdapter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.infrastructure; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.springframework.stereotype.Repository; - -import com.baeldung.domain.Employee; -import com.baeldung.domain.EmployeeRepositoryPort; - -@Repository -public class InMemoryEmployeeRepositoryAdapter implements EmployeeRepositoryPort { - - private Map employeeRepository = new HashMap<>(); - - @Override - public List findAll() { - return new ArrayList<>(employeeRepository.values()); - } - - @Override - public Optional findById(String employeeId) { - if (employeeRepository.containsKey(employeeId)) { - return Optional.of(employeeRepository.get(employeeId)); - } - return Optional.empty(); - } - - @Override - public Employee save(Employee employee) { - employeeRepository.put(employee.getEmployeeId(), employee); - return employee; - } -} diff --git a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java b/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java deleted file mode 100644 index 9cc94f3505..0000000000 --- a/java-hexagonal-architecture-example/src/test/java/com/baeldung/domain/EmployeeServiceUnitTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.domain; - -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class EmployeeServiceUnitTest { - - @Mock - private EmployeeRepositoryPort employeeRepositoryPort; - @InjectMocks - private EmployeeService adapter; - - @Test - public void whenGettingAllEmployeesWillReturnAListWithOneElement() { - Employee employee = Employee.builder() - .withEmployeeId("ABC123") - .withName("Bob Doe") - .build(); - - when(employeeRepositoryPort.findAll()).thenReturn(Arrays.asList(employee)); - - List result = adapter.getAll(); - assertThat(result, hasSize(1)); - assertThat(result, containsInAnyOrder(employee)); - } -} From 873449b8179d0b441ed6377850d5068c2ca19780 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 24 Aug 2019 15:42:41 +0100 Subject: [PATCH 05/99] Adding benchmarks --- java-string-diff/pom.xml | 14 ++++ .../StringDiffBenchmarkUnitTest.java | 71 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java diff --git a/java-string-diff/pom.xml b/java-string-diff/pom.xml index 79dddea9fb..86baaa1f3e 100644 --- a/java-string-diff/pom.xml +++ b/java-string-diff/pom.xml @@ -16,11 +16,25 @@ org.bitbucket.cowwoc diff-match-patch 1.1 + test org.apache.commons commons-lang3 3.9 + test + + + org.openjdk.jmh + jmh-core + 1.19 + test + + + org.openjdk.jmh + jmh-generator-annprocess + 1.19 + test \ No newline at end of file diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java new file mode 100644 index 0000000000..f55bf16751 --- /dev/null +++ b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.stringdiff; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class StringDiffBenchmarkUnitTest { + + private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); + + private List inputs = randomizeInputs(10000); + + public static void main(String[] args) throws RunnerException { + Options opts = new OptionsBuilder().include(".*") + .warmupIterations(1) + .measurementIterations(50) + .jvmArgs("-Xms2g", "-Xmx2g") + .shouldDoGC(true) + .forks(1) + .build(); + + new Runner(opts).run(); + } + + @Benchmark + public void diffMatchPatch() { + for (int i = 0; i < inputs.size() - 1; i++) { + diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); + } + } + + @Benchmark + public void stringUtils() { + for (int i = 0; i < inputs.size() - 1; i++) { + StringUtils.difference(inputs.get(i), inputs.get(i + 1)); + } + } + + /** + * Creates a list of a given size, containing 30 character long strings, + * each starting with a static prefix of 10 characters and followed by + * a random 20 character suffix + * + * @return a {@link List} of randomised strings + */ + private List randomizeInputs(int size) { + String staticPart = "ABCDEF1234"; + List inputs = new ArrayList<>(); + for (int i = 0; i < size; i++) { + inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20)); + } + return inputs; + } +} From f02345eb4f5a2c6a1524a91f6d110cdef4719a85 Mon Sep 17 00:00:00 2001 From: Nick Date: Sat, 24 Aug 2019 15:43:31 +0100 Subject: [PATCH 06/99] Removing performance tests from unit test class --- .../stringdiff/StringDiffUnitTest.java | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java index fc335a0467..ece414f65c 100644 --- a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java +++ b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java @@ -1,11 +1,5 @@ package com.baeldung.stringdiff; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; import org.junit.Test; @@ -27,43 +21,4 @@ public class StringDiffUnitTest { System.out.println(StringUtils.difference(text1, text2)); System.out.println(StringUtils.difference(text2, text1)); } - - @Test - public void testPerformance() { - // Create input - List inputs = randomizeInputs(10000); - - // Google diff match patch - LocalDateTime begin = LocalDateTime.now(); - for (int i = 0; i < inputs.size() - 1; i++) { - diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); - } - System.out.println("Diff-Match-Patch Duration: " + Duration.between(begin, LocalDateTime.now()) - .toMillis()); - - // Apache commons - begin = LocalDateTime.now(); - for (int i = 0; i < inputs.size() - 1; i++) { - StringUtils.difference(inputs.get(i), inputs.get(i + 1)); - } - System.out.println("StringUtils Duration: " + Duration.between(begin, LocalDateTime.now()) - .toMillis()); - } - - /** - * Creates a list of a given size, containing 30 character long strings, - * each starting with a static prefix of 10 characters and followed by - * a random 20 character suffix - * - * @return a {@link List} of randomised strings - */ - private List randomizeInputs(int size) { - String staticPart = "ABCDEF1234"; - List inputs = new ArrayList<>(); - for (int i = 0; i < size; i++) { - inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20)); - } - return inputs; - } - } From a16f020a7ac44447c4376a4aab6537925fed7a13 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 25 Aug 2019 14:52:26 +0100 Subject: [PATCH 07/99] upgrading diff-match-patch version --- java-string-diff/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-string-diff/pom.xml b/java-string-diff/pom.xml index 86baaa1f3e..9bcd2b37ff 100644 --- a/java-string-diff/pom.xml +++ b/java-string-diff/pom.xml @@ -15,7 +15,7 @@ org.bitbucket.cowwoc diff-match-patch - 1.1 + 1.2 test From 81623640a8ccf36e7c7488669e44c46c93a842fa Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 25 Aug 2019 15:09:19 +0100 Subject: [PATCH 08/99] making benchmark methods return a value --- .../baeldung/stringdiff/StringDiffBenchmarkUnitTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java index f55bf16751..20e87a1f4e 100644 --- a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java +++ b/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java @@ -40,17 +40,19 @@ public class StringDiffBenchmarkUnitTest { } @Benchmark - public void diffMatchPatch() { + public int diffMatchPatch() { for (int i = 0; i < inputs.size() - 1; i++) { diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); } + return inputs.size(); } @Benchmark - public void stringUtils() { + public int stringUtils() { for (int i = 0; i < inputs.size() - 1; i++) { StringUtils.difference(inputs.get(i), inputs.get(i + 1)); } + return inputs.size(); } /** From 488cb7a04d303de1b3541d54a922ed356539cbba Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 28 Aug 2019 09:39:43 +0100 Subject: [PATCH 09/99] Moving code to java-strings-3 --- {java-string-diff => java-strings-3/java-string-3}/pom.xml | 0 .../java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java | 0 .../src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {java-string-diff => java-strings-3/java-string-3}/pom.xml (100%) rename {java-string-diff => java-strings-3/java-string-3}/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java (100%) rename {java-string-diff => java-strings-3/java-string-3}/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java (100%) diff --git a/java-string-diff/pom.xml b/java-strings-3/java-string-3/pom.xml similarity index 100% rename from java-string-diff/pom.xml rename to java-strings-3/java-string-3/pom.xml diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java similarity index 100% rename from java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java rename to java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java diff --git a/java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java similarity index 100% rename from java-string-diff/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java rename to java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java From 1bbe829e9a144a7c6324e611894aac352f4e09c5 Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 28 Aug 2019 19:46:34 +0100 Subject: [PATCH 10/99] Moving stuff around --- java-strings-3/java-string-3/pom.xml | 40 ------------------- java-strings-3/pom.xml | 6 +++ .../StringDiffBenchmarkUnitTest.java | 0 .../stringdiff/StringDiffUnitTest.java | 0 4 files changed, 6 insertions(+), 40 deletions(-) delete mode 100644 java-strings-3/java-string-3/pom.xml rename java-strings-3/{java-string-3 => }/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java (100%) rename java-strings-3/{java-string-3 => }/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java (100%) diff --git a/java-strings-3/java-string-3/pom.xml b/java-strings-3/java-string-3/pom.xml deleted file mode 100644 index 9bcd2b37ff..0000000000 --- a/java-strings-3/java-string-3/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - 4.0.0 - java-string-diff - java-string-diff - java-string-diff - jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - org.bitbucket.cowwoc - diff-match-patch - 1.2 - test - - - org.apache.commons - commons-lang3 - 3.9 - test - - - org.openjdk.jmh - jmh-core - 1.19 - test - - - org.openjdk.jmh - jmh-generator-annprocess - 1.19 - test - - - \ No newline at end of file diff --git a/java-strings-3/pom.xml b/java-strings-3/pom.xml index 1e5f757943..4589780c15 100644 --- a/java-strings-3/pom.xml +++ b/java-strings-3/pom.xml @@ -68,6 +68,12 @@ ${assertj.version} test + + org.bitbucket.cowwoc + diff-match-patch + 1.2 + test + diff --git a/java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java similarity index 100% rename from java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java rename to java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java diff --git a/java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java similarity index 100% rename from java-strings-3/java-string-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java rename to java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java From 0fd3f51ef9a954be5393d30724d86da8239f1a32 Mon Sep 17 00:00:00 2001 From: Nick Date: Fri, 30 Aug 2019 21:11:18 +0100 Subject: [PATCH 11/99] New unit test format --- .../stringdiff/StringDiffUnitTest.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java index ece414f65c..94b7deb64d 100644 --- a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java @@ -1,24 +1,39 @@ package com.baeldung.stringdiff; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + import org.apache.commons.lang3.StringUtils; import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Operation; import org.junit.Test; public class StringDiffUnitTest { private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); + // Test samples + private final String text1 = "ABCDELMN"; + private final String text2 = "ABCFGLMN"; + @Test - public void testStringDiff() { - String text1 = "ABCDELMN"; - String text2 = "ABCFGLMN"; + public void givenTwoStrings_whenDiffMatchPatch_thenReturnCorrectDiff() { + assertThat(diffMatchPatch.diffMain(text1, text2, false), containsInAnyOrder( + new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), + new DiffMatchPatch.Diff(Operation.DELETE, "DE"), + new DiffMatchPatch.Diff(Operation.INSERT, "FG"), + new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); + assertThat(diffMatchPatch.diffMain(text2, text1, false), containsInAnyOrder( + new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), + new DiffMatchPatch.Diff(Operation.INSERT, "DE"), + new DiffMatchPatch.Diff(Operation.DELETE, "FG"), + new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); + } - // Diff with Diff-Match-Patch - System.out.println(diffMatchPatch.diffMain(text1, text2, false)); - System.out.println(diffMatchPatch.diffMain(text2, text1, false)); - - // Diff with StringUtils - System.out.println(StringUtils.difference(text1, text2)); - System.out.println(StringUtils.difference(text2, text1)); + @Test + public void givenTwoStrings_whenStringUtilsDifference_thenReturnCorrectDiff() { + assertThat(StringUtils.difference(text1, text2), is("FGLMN")); + assertThat(StringUtils.difference(text2, text1), is("DELMN")); } } From cae025bd1b22a3cdcecd2d91720791b22941041c Mon Sep 17 00:00:00 2001 From: Roger Yates Date: Wed, 6 Nov 2019 06:00:41 +1000 Subject: [PATCH 12/99] BAEL-3475 - Add code for Lombok Accessors --- .../lombok/accessors/AccessorsTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java diff --git a/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java b/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java new file mode 100644 index 0000000000..b3d9cb16f6 --- /dev/null +++ b/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java @@ -0,0 +1,72 @@ +package com.baeldung.lombok.accessors; + +import com.baeldung.lombok.accessors.model.*; +import org.junit.Test; + +import java.math.BigDecimal; + +import static org.junit.Assert.assertEquals; + +public class AccessorsTest { + + @Test + public void givenBasicAccount_thenUseBasicAccessors() { + BasicAccount account = new BasicAccount(); + account.setBalance(BigDecimal.TEN); + account.setName("Basic Accessors"); + + assertEquals(BigDecimal.TEN, account.getBalance()); + assertEquals("Basic Accessors", account.getName()); + } + + @Test + public void givenFluentAccount_thenUseFluentAccessors() { + FluentAccount account = new FluentAccount(); + account.name("Fluent Account"); + account.balance(BigDecimal.TEN); + + assertEquals(BigDecimal.TEN, account.balance()); + assertEquals("Fluent Account", account.name()); + } + + @Test + public void givenChainedAccount_thenUseChainedAccessors() { + ChainedAccount account = new ChainedAccount(); + account.setName("Chained Account").setBalance(BigDecimal.TEN); + + assertEquals(BigDecimal.TEN, account.getBalance()); + assertEquals("Chained Account", account.getName()); + } + + @Test + public void givenChainedFluentAccount_thenUseChainedFluentAccessors() { + ChainedFluentAccount account = new ChainedFluentAccount() + .name("Fluent Account") + .balance(BigDecimal.TEN); + + assertEquals(BigDecimal.TEN, account.balance()); + assertEquals("Fluent Account", account.name()); + } + + @Test + public void givenPrefixedAccount_thenRemovePrefixFromAccessors() { + PrefixedAccount account = new PrefixedAccount(); + account.setName("Prefixed Fields"); + account.setBalance(BigDecimal.TEN); + + assertEquals(BigDecimal.TEN, account.getBalance()); + assertEquals("Prefixed Fields", account.getName()); + } + + @Test + public void givenPrefixedFluentAccount_thenRemovePrefixFromAccessors() { + PrefixedFluentAccount account = new PrefixedFluentAccount(); + account + .name("Prefixed Fluent Fields") + .balance(BigDecimal.TEN); + + assertEquals(BigDecimal.TEN, account.balance()); + assertEquals("Prefixed Fluent Fields", account.name()); + } + +} From a6c3e6e2bda6b4956062937c630e78088eb5ec81 Mon Sep 17 00:00:00 2001 From: Roger Yates Date: Wed, 6 Nov 2019 06:22:50 +1000 Subject: [PATCH 13/99] BAEL-3475 - Updated lombok.version to latest --- lombok/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/lombok/pom.xml b/lombok/pom.xml index b67320909e..b93780c9cf 100644 --- a/lombok/pom.xml +++ b/lombok/pom.xml @@ -77,6 +77,7 @@ 1.18.10 + 1.0.0.Final From 6b3e07771ce96a890092a15a3fdeaab80b47d4f5 Mon Sep 17 00:00:00 2001 From: Roger Yates Date: Wed, 6 Nov 2019 06:44:10 +1000 Subject: [PATCH 14/99] BAEL-3475 - Rename Test to UnitTest --- .../lombok/accessors/AccessorsTest.java | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java diff --git a/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java b/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java deleted file mode 100644 index b3d9cb16f6..0000000000 --- a/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung.lombok.accessors; - -import com.baeldung.lombok.accessors.model.*; -import org.junit.Test; - -import java.math.BigDecimal; - -import static org.junit.Assert.assertEquals; - -public class AccessorsTest { - - @Test - public void givenBasicAccount_thenUseBasicAccessors() { - BasicAccount account = new BasicAccount(); - account.setBalance(BigDecimal.TEN); - account.setName("Basic Accessors"); - - assertEquals(BigDecimal.TEN, account.getBalance()); - assertEquals("Basic Accessors", account.getName()); - } - - @Test - public void givenFluentAccount_thenUseFluentAccessors() { - FluentAccount account = new FluentAccount(); - account.name("Fluent Account"); - account.balance(BigDecimal.TEN); - - assertEquals(BigDecimal.TEN, account.balance()); - assertEquals("Fluent Account", account.name()); - } - - @Test - public void givenChainedAccount_thenUseChainedAccessors() { - ChainedAccount account = new ChainedAccount(); - account.setName("Chained Account").setBalance(BigDecimal.TEN); - - assertEquals(BigDecimal.TEN, account.getBalance()); - assertEquals("Chained Account", account.getName()); - } - - @Test - public void givenChainedFluentAccount_thenUseChainedFluentAccessors() { - ChainedFluentAccount account = new ChainedFluentAccount() - .name("Fluent Account") - .balance(BigDecimal.TEN); - - assertEquals(BigDecimal.TEN, account.balance()); - assertEquals("Fluent Account", account.name()); - } - - @Test - public void givenPrefixedAccount_thenRemovePrefixFromAccessors() { - PrefixedAccount account = new PrefixedAccount(); - account.setName("Prefixed Fields"); - account.setBalance(BigDecimal.TEN); - - assertEquals(BigDecimal.TEN, account.getBalance()); - assertEquals("Prefixed Fields", account.getName()); - } - - @Test - public void givenPrefixedFluentAccount_thenRemovePrefixFromAccessors() { - PrefixedFluentAccount account = new PrefixedFluentAccount(); - account - .name("Prefixed Fluent Fields") - .balance(BigDecimal.TEN); - - assertEquals(BigDecimal.TEN, account.balance()); - assertEquals("Prefixed Fluent Fields", account.name()); - } - -} From 9692fae3cc9d17c534bd15ddc5826d349ced6237 Mon Sep 17 00:00:00 2001 From: Roger Yates <587230+rojyates@users.noreply.github.com> Date: Sun, 10 Nov 2019 22:57:34 +1000 Subject: [PATCH 15/99] BAEL-3475 - Add prefix with trailing _, make fields private, and update delombok version --- lombok/pom.xml | 2 +- .../lombok/accessors/model/BasicAccount.java | 4 ++-- .../lombok/accessors/model/ChainedAccount.java | 4 ++-- .../accessors/model/ChainedFluentAccount.java | 4 ++-- .../lombok/accessors/model/FluentAccount.java | 4 ++-- .../lombok/accessors/model/PrefixedAccount.java | 8 ++++++-- .../accessors/model/PrefixedFluentAccount.java | 4 ++-- .../lombok/accessors/model/StandardAccount.java | 4 ++-- .../lombok/accessors/AccessorsUnitTest.java | 16 +++++++++------- 9 files changed, 28 insertions(+), 22 deletions(-) diff --git a/lombok/pom.xml b/lombok/pom.xml index b93780c9cf..5e2ad33f66 100644 --- a/lombok/pom.xml +++ b/lombok/pom.xml @@ -81,7 +81,7 @@ 1.0.0.Final - 1.18.4.0 + 1.18.10.0 3.8.0 diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/BasicAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/BasicAccount.java index 74ae51c040..a9332735c7 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/BasicAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/BasicAccount.java @@ -3,8 +3,8 @@ package com.baeldung.lombok.accessors.model; import java.math.BigDecimal; public class BasicAccount { - String name; - BigDecimal balance; + private String name; + private BigDecimal balance; public BigDecimal getBalance() { return this.balance; diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedAccount.java index 8fa9a2e8aa..0437d8f60e 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedAccount.java @@ -10,6 +10,6 @@ import java.math.BigDecimal; @Getter @Setter public class ChainedAccount { - String name; - BigDecimal balance; + private String name; + private BigDecimal balance; } diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedFluentAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedFluentAccount.java index 22e85848bd..6ebc080c94 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedFluentAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/ChainedFluentAccount.java @@ -10,6 +10,6 @@ import java.math.BigDecimal; @Getter @Setter public class ChainedFluentAccount { - String name; - BigDecimal balance; + private String name; + private BigDecimal balance; } diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/FluentAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/FluentAccount.java index bc5e6ba70e..4c2e1f7976 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/FluentAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/FluentAccount.java @@ -10,6 +10,6 @@ import java.math.BigDecimal; @Getter @Setter public class FluentAccount { - String name; - BigDecimal balance; + private String name; + private BigDecimal balance; } diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedAccount.java index e3e3ae620b..506d7adc75 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedAccount.java @@ -11,6 +11,10 @@ import java.math.BigDecimal; @Getter @Setter public class PrefixedAccount { - String sName; - BigDecimal bdBalance; + private String sName; + private BigDecimal bdBalance; + + @Accessors(prefix = "s_") + private String s_notes; + } diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedFluentAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedFluentAccount.java index 462a9b41ec..eb23bf58e2 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedFluentAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/PrefixedFluentAccount.java @@ -10,6 +10,6 @@ import java.math.BigDecimal; @Getter @Setter public class PrefixedFluentAccount { - String sName; - BigDecimal bdBalance; + private String sName; + private BigDecimal bdBalance; } diff --git a/lombok/src/main/java/com/baeldung/lombok/accessors/model/StandardAccount.java b/lombok/src/main/java/com/baeldung/lombok/accessors/model/StandardAccount.java index 89727fef19..4d0d578a4d 100644 --- a/lombok/src/main/java/com/baeldung/lombok/accessors/model/StandardAccount.java +++ b/lombok/src/main/java/com/baeldung/lombok/accessors/model/StandardAccount.java @@ -8,6 +8,6 @@ import java.math.BigDecimal; @Getter @Setter public class StandardAccount { - String name; - BigDecimal balance; + private String name; + private BigDecimal balance; } diff --git a/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsUnitTest.java b/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsUnitTest.java index 679c7d39ef..04f38bfc32 100644 --- a/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsUnitTest.java +++ b/lombok/src/test/java/com/baeldung/lombok/accessors/AccessorsUnitTest.java @@ -12,11 +12,11 @@ public class AccessorsUnitTest { @Test public void givenBasicAccount_thenUseBasicAccessors() { BasicAccount account = new BasicAccount(); - account.setBalance(BigDecimal.TEN); account.setName("Basic Accessors"); + account.setBalance(BigDecimal.TEN); - assertEquals(BigDecimal.TEN, account.getBalance()); assertEquals("Basic Accessors", account.getName()); + assertEquals(BigDecimal.TEN, account.getBalance()); } @Test @@ -25,8 +25,8 @@ public class AccessorsUnitTest { account.name("Fluent Account"); account.balance(BigDecimal.TEN); - assertEquals(BigDecimal.TEN, account.balance()); assertEquals("Fluent Account", account.name()); + assertEquals(BigDecimal.TEN, account.balance()); } @Test @@ -34,8 +34,8 @@ public class AccessorsUnitTest { ChainedAccount account = new ChainedAccount(); account.setName("Chained Account").setBalance(BigDecimal.TEN); - assertEquals(BigDecimal.TEN, account.getBalance()); assertEquals("Chained Account", account.getName()); + assertEquals(BigDecimal.TEN, account.getBalance()); } @Test @@ -44,8 +44,8 @@ public class AccessorsUnitTest { .name("Fluent Account") .balance(BigDecimal.TEN); - assertEquals(BigDecimal.TEN, account.balance()); assertEquals("Fluent Account", account.name()); + assertEquals(BigDecimal.TEN, account.balance()); } @Test @@ -53,9 +53,11 @@ public class AccessorsUnitTest { PrefixedAccount account = new PrefixedAccount(); account.setName("Prefixed Fields"); account.setBalance(BigDecimal.TEN); + account.setNotes("Notes"); - assertEquals(BigDecimal.TEN, account.getBalance()); assertEquals("Prefixed Fields", account.getName()); + assertEquals(BigDecimal.TEN, account.getBalance()); + assertEquals("Notes", account.getNotes()); } @Test @@ -65,8 +67,8 @@ public class AccessorsUnitTest { .name("Prefixed Fluent Fields") .balance(BigDecimal.TEN); - assertEquals(BigDecimal.TEN, account.balance()); assertEquals("Prefixed Fluent Fields", account.name()); + assertEquals(BigDecimal.TEN, account.balance()); } } From 91fc4ecb06fe0cdea57fff1dc7fe2fe9aecbd7db Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 15:19:28 +0100 Subject: [PATCH 16/99] BAEL-2275: Init version --- ddd/docker/.env | 1 + ddd/docker/docker-compose.yml | 14 +++ ddd/docker/mongo-init.js | 12 +++ ddd/pom.xml | 5 + .../ddd/layers/DomainLayerApplication.java | 13 +++ .../layers/application/OrderController.java | 44 +++++++++ .../request/AddProductRequest.java | 18 ++++ .../request/CreateOrderRequest.java | 21 +++++ .../response/CreateOrderResponse.java | 15 +++ .../com/baeldung/ddd/layers/domain/Order.java | 84 +++++++++++++++++ .../ddd/layers/domain/OrderStatus.java | 5 + .../baeldung/ddd/layers/domain/Product.java | 43 +++++++++ .../domain/exception/DomainException.java | 7 ++ .../domain/repository/OrderRepository.java | 12 +++ .../domain/service/DomainOrderService.java | 56 ++++++++++++ .../layers/domain/service/OrderService.java | 16 ++++ .../configuration/DomainConfiguration.java | 16 ++++ .../configuration/MongoDBConfiguration.java | 7 ++ .../repository/MongoDbOrderRepository.java | 30 ++++++ .../repository/SpringDataOrderRepository.java | 10 ++ ddd/src/main/resources/ddd-layers.properties | 5 + .../ddd/layers/domain/OrderProvider.java | 19 ++++ .../ddd/layers/domain/OrderUnitTest.java | 57 ++++++++++++ .../service/DomainOrderServiceUnitTest.java | 91 +++++++++++++++++++ .../MongoDbOrderRepositoryUnitTest.java | 25 +++++ 25 files changed, 626 insertions(+) create mode 100644 ddd/docker/.env create mode 100644 ddd/docker/docker-compose.yml create mode 100644 ddd/docker/mongo-init.js create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java create mode 100644 ddd/src/main/resources/ddd-layers.properties create mode 100644 ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java create mode 100644 ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java create mode 100644 ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java create mode 100644 ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java diff --git a/ddd/docker/.env b/ddd/docker/.env new file mode 100644 index 0000000000..99f7e8b8d4 --- /dev/null +++ b/ddd/docker/.env @@ -0,0 +1 @@ +ORDER_DOCKER_MONGODB_PORT=27017 \ No newline at end of file diff --git a/ddd/docker/docker-compose.yml b/ddd/docker/docker-compose.yml new file mode 100644 index 0000000000..eb27e56061 --- /dev/null +++ b/ddd/docker/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3' + +services: + order-mongo-database: + image: mongo:3.4.13 + restart: always + ports: + - ${ORDER_DOCKER_MONGODB_PORT}:27017 + environment: + MONGO_INITDB_ROOT_USERNAME: admin + MONGO_INITDB_ROOT_PASSWORD: admin + MONGO_INITDB_DATABASE: order-database + volumes: + - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro \ No newline at end of file diff --git a/ddd/docker/mongo-init.js b/ddd/docker/mongo-init.js new file mode 100644 index 0000000000..b1564df50a --- /dev/null +++ b/ddd/docker/mongo-init.js @@ -0,0 +1,12 @@ +db.createUser( + { + user: "order", + pwd: "order", + roles: [ + { + role: "readWrite", + db: "order-database" + } + ] + } +); \ No newline at end of file diff --git a/ddd/pom.xml b/ddd/pom.xml index c249007ba4..6571470116 100644 --- a/ddd/pom.xml +++ b/ddd/pom.xml @@ -74,6 +74,11 @@ spring-boot-starter-test test + + org.mockito + mockito-core + test + de.flapdoodle.embed de.flapdoodle.embed.mongo diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java b/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java new file mode 100644 index 0000000000..35fb1958e2 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.ddd.layers; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.PropertySource; + +@SpringBootApplication +@PropertySource(value={"classpath:ddd-layers.properties"}) +public class DomainLayerApplication { + public static void main(String[] args) { + SpringApplication.run(DomainLayerApplication.class, args); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java new file mode 100644 index 0000000000..fa3576eb37 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java @@ -0,0 +1,44 @@ +package com.baeldung.ddd.layers.application; + +import com.baeldung.ddd.layers.application.request.AddProductRequest; +import com.baeldung.ddd.layers.application.request.CreateOrderRequest; +import com.baeldung.ddd.layers.application.response.CreateOrderResponse; +import com.baeldung.ddd.layers.domain.service.OrderService; +import org.bson.types.ObjectId; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/orders") +public class OrderController { + + private final OrderService orderService; + + @Autowired + public OrderController(OrderService orderService) { + this.orderService = orderService; + } + + @PostMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + CreateOrderResponse createOrder(@RequestBody final CreateOrderRequest createOrderRequest) { + return new CreateOrderResponse(orderService + .createOrder(createOrderRequest.getProducts()) + .toString()); + } + + @PostMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + void addProduct(@PathVariable final ObjectId id, @RequestBody final AddProductRequest addProductRequest) { + orderService.addProduct(id, addProductRequest.getProduct()); + } + + @DeleteMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + void deleteProduct(@PathVariable final ObjectId id, @RequestParam final String name) { + orderService.deleteProduct(id, name); + } + + @PostMapping("/{id}/complete") + void completeOrder(@PathVariable final ObjectId id) { + orderService.completeOrder(id); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java new file mode 100644 index 0000000000..823b2191ef --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java @@ -0,0 +1,18 @@ +package com.baeldung.ddd.layers.application.request; + +import com.baeldung.ddd.layers.domain.Product; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AddProductRequest { + private Product product; + + @JsonCreator + public AddProductRequest(@JsonProperty("product") final Product product) { + this.product = product; + } + + public Product getProduct() { + return product; + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java new file mode 100644 index 0000000000..a2dabd05fc --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java @@ -0,0 +1,21 @@ +package com.baeldung.ddd.layers.application.request; + +import com.baeldung.ddd.layers.domain.Product; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; + +public class CreateOrderRequest { + private List products; + + @JsonCreator + public CreateOrderRequest(@JsonProperty("products") final List productList) { + this.products = new ArrayList<>(productList); + } + + public List getProducts() { + return products; + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java new file mode 100644 index 0000000000..d57f297bde --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java @@ -0,0 +1,15 @@ +package com.baeldung.ddd.layers.application.response; + +import org.bson.types.ObjectId; + +public class CreateOrderResponse { + private final String id; + + public CreateOrderResponse(String id) { + this.id = id; + } + + public String getId() { + return id; + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java new file mode 100644 index 0000000000..d69b51ae57 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -0,0 +1,84 @@ +package com.baeldung.ddd.layers.domain; + +import com.baeldung.ddd.layers.domain.exception.DomainException; +import org.bson.types.ObjectId; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Order { + private final ObjectId id; + private OrderStatus status; + private List products; + private BigDecimal price; + + public Order(final ObjectId id, final List products) { + this.id = id; + this.products = new ArrayList<>(products); + this.status = OrderStatus.CREATED; + this.price = products + .stream() + .map(Product::getPrice) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + public void complete() { + validateState(); + this.status = OrderStatus.COMPLETED; + } + + public void addProduct(final Product product) { + validateState(); + validateProduct(product); + products.add(product); + price = price.add(product.getPrice()); + } + + public void removeProduct(final String name) { + validateState(); + final Product product = getProduct(name); + products.remove(product); + + price = price.subtract(product.getPrice()); + } + + private Product getProduct(String name) { + return products + .stream() + .filter(product -> product + .getName() + .equals(name)) + .findFirst() + .orElseThrow(() -> new DomainException("Product with " + name + " doesn't exist.")); + } + + private void validateState() { + if (OrderStatus.COMPLETED.equals(status)) { + throw new DomainException("The order is in completed state."); + } + } + + private void validateProduct(final Product product) { + if (product == null) { + throw new DomainException("The product cannot be null."); + } + } + + public ObjectId getId() { + return id; + } + + public OrderStatus getStatus() { + return status; + } + + public List getProducts() { + return Collections.unmodifiableList(products); + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java new file mode 100644 index 0000000000..f5d32374be --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java @@ -0,0 +1,5 @@ +package com.baeldung.ddd.layers.domain; + +public enum OrderStatus { + CREATED, COMPLETED +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java new file mode 100644 index 0000000000..286585d84a --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java @@ -0,0 +1,43 @@ +package com.baeldung.ddd.layers.domain; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.math.BigDecimal; +import java.util.Objects; + +public class Product { + private final BigDecimal price; + private final String name; + + @JsonCreator + public Product(@JsonProperty("price") final BigDecimal price, @JsonProperty("name") final String name) { + this.price = price; + this.name = name; + } + + public BigDecimal getPrice() { + return price; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final Product product = (Product) o; + return Objects.equals(price, product.price) && Objects.equals(name, product.name); + } + + @Override + public int hashCode() { + return Objects.hash(price, name); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java new file mode 100644 index 0000000000..05d25cc800 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java @@ -0,0 +1,7 @@ +package com.baeldung.ddd.layers.domain.exception; + +public class DomainException extends RuntimeException { + public DomainException(final String message) { + super(message); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java new file mode 100644 index 0000000000..45b0c42782 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java @@ -0,0 +1,12 @@ +package com.baeldung.ddd.layers.domain.repository; + +import com.baeldung.ddd.layers.domain.Order; +import org.bson.types.ObjectId; + +import java.util.Optional; + +public interface OrderRepository { + Optional findById(ObjectId id); + + void save(Order order); +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java new file mode 100644 index 0000000000..961309e94e --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java @@ -0,0 +1,56 @@ +package com.baeldung.ddd.layers.domain.service; + +import com.baeldung.ddd.layers.domain.Order; +import com.baeldung.ddd.layers.domain.Product; +import com.baeldung.ddd.layers.domain.exception.DomainException; +import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import org.bson.types.ObjectId; + +import java.util.List; + +public class DomainOrderService implements OrderService { + + private final OrderRepository orderRepository; + + public DomainOrderService(OrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + @Override + public ObjectId createOrder(List products) { + final Order order = new Order(ObjectId.get(), products); + orderRepository.save(order); + + return order.getId(); + } + + @Override + public void addProduct(ObjectId id, Product product) { + final Order order = getOrder(id); + order.addProduct(product); + + orderRepository.save(order); + } + + @Override + public void completeOrder(ObjectId id) { + final Order order = getOrder(id); + order.complete(); + + orderRepository.save(order); + } + + @Override + public void deleteProduct(ObjectId id, String name) { + final Order order = getOrder(id); + order.removeProduct(name); + + orderRepository.save(order); + } + + private Order getOrder(ObjectId id) { + return orderRepository + .findById(id) + .orElseThrow(() -> new RuntimeException("Order with given id doesn't exist")); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java new file mode 100644 index 0000000000..dbc7d3aba1 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java @@ -0,0 +1,16 @@ +package com.baeldung.ddd.layers.domain.service; + +import com.baeldung.ddd.layers.domain.Product; +import org.bson.types.ObjectId; + +import java.util.List; + +public interface OrderService { + ObjectId createOrder(List products); + + void addProduct(ObjectId id, Product product); + + void completeOrder(ObjectId id); + + void deleteProduct(ObjectId id, String name); +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java new file mode 100644 index 0000000000..7c56456719 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java @@ -0,0 +1,16 @@ +package com.baeldung.ddd.layers.infrastracture.configuration; + +import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import com.baeldung.ddd.layers.domain.service.DomainOrderService; +import com.baeldung.ddd.layers.domain.service.OrderService; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DomainConfiguration { + + @Bean + OrderService orderService(final OrderRepository orderRepository) { + return new DomainOrderService(orderRepository); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java new file mode 100644 index 0000000000..db6743e90f --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java @@ -0,0 +1,7 @@ +package com.baeldung.ddd.layers.infrastracture.configuration; + +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@EnableMongoRepositories +public class MongoDBConfiguration { +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java new file mode 100644 index 0000000000..5ec166738a --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java @@ -0,0 +1,30 @@ +package com.baeldung.ddd.layers.infrastracture.repository; + +import com.baeldung.ddd.layers.domain.Order; +import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import org.bson.types.ObjectId; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public class MongoDbOrderRepository implements OrderRepository { + + private final SpringDataOrderRepository orderRepository; + + @Autowired + public MongoDbOrderRepository(final SpringDataOrderRepository orderRepository) { + this.orderRepository = orderRepository; + } + + @Override + public Optional findById(final ObjectId id) { + return orderRepository.findById(id); + } + + @Override + public void save(final Order order) { + orderRepository.save(order); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java new file mode 100644 index 0000000000..0cbbcb3827 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.ddd.layers.infrastracture.repository; + +import com.baeldung.ddd.layers.domain.Order; +import org.bson.types.ObjectId; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SpringDataOrderRepository extends MongoRepository { +} diff --git a/ddd/src/main/resources/ddd-layers.properties b/ddd/src/main/resources/ddd-layers.properties new file mode 100644 index 0000000000..0479996b17 --- /dev/null +++ b/ddd/src/main/resources/ddd-layers.properties @@ -0,0 +1,5 @@ +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.database=order-database +spring.data.mongodb.username=order +spring.data.mongodb.password=order \ No newline at end of file diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java new file mode 100644 index 0000000000..8aa3ff4068 --- /dev/null +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java @@ -0,0 +1,19 @@ +package com.baeldung.ddd.layers.domain; + +import org.bson.types.ObjectId; + +import java.math.BigDecimal; +import java.util.Arrays; + +public class OrderProvider { + public static Order getCreatedOrder() { + return new Order(ObjectId.get(), Arrays.asList(new Product(BigDecimal.TEN, "productName"))); + } + + public static Order getCompletedOrder() { + final Order order = getCreatedOrder(); + order.complete(); + + return order; + } +} diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java new file mode 100644 index 0000000000..0996383610 --- /dev/null +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.ddd.layers.domain; + +import com.baeldung.ddd.layers.domain.exception.DomainException; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; + +import java.math.BigDecimal; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class OrderUnitTest { + + @Test + void shouldCompleteOrder_thenChangeStatus() { + final Order order = OrderProvider.getCreatedOrder(); + + order.complete(); + + assertEquals(OrderStatus.COMPLETED, order.getStatus()); + } + + @Test + void shouldAddProduct_thenUpdatePrice() { + final Order order = OrderProvider.getCreatedOrder(); + final int orderOriginalProductSize = order.getProducts().size(); + final BigDecimal orderOriginalPrice = order.getPrice(); + final Product productToAdd = new Product(new BigDecimal("20"), "secondProduct"); + + order.addProduct(productToAdd); + + assertEquals(orderOriginalProductSize + 1, order.getProducts().size()); + assertEquals(orderOriginalPrice.add(productToAdd.getPrice()), order.getPrice()); + } + + @Test + void shouldAddProduct_thenThrowException(){ + final Order order = OrderProvider.getCompletedOrder(); + final Product productToAdd = new Product(new BigDecimal("20"), "secondProduct"); + + final Executable executable = () -> order.addProduct(productToAdd); + + Assertions.assertThrows(DomainException.class, executable); + } + + @Test + void shouldRemoveProduct_thenUpdatePrice() { + final Order order = OrderProvider.getCreatedOrder(); + + order.removeProduct(order.getProducts().get(0).getName()); + + assertEquals(0, order.getProducts().size()); + assertEquals(BigDecimal.ZERO, order.getPrice()); + } +} \ No newline at end of file diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java new file mode 100644 index 0000000000..841f49f7f5 --- /dev/null +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java @@ -0,0 +1,91 @@ +package com.baeldung.ddd.layers.domain.service; + +import com.baeldung.ddd.layers.domain.Order; +import com.baeldung.ddd.layers.domain.OrderProvider; +import com.baeldung.ddd.layers.domain.Product; +import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import org.bson.types.ObjectId; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +class DomainOrderServiceUnitTest { + + private OrderRepository orderRepository; + private DomainOrderService tested; + + @BeforeEach + void setUp() { + orderRepository = mock(OrderRepository.class); + tested = new DomainOrderService(orderRepository); + } + + @Test + void shouldCreateOrder_thenSaveIt() { + final Product product = new Product(BigDecimal.TEN, "productName"); + + final ObjectId id = tested.createOrder(Arrays.asList(product)); + + verify(orderRepository).save(any(Order.class)); + assertNotNull(id); + } + + @Test + void shouldAddProduct_thenSaveOrder() { + final Order order = spy(OrderProvider.getCreatedOrder()); + final Product product = new Product(BigDecimal.TEN, "test"); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); + + tested.addProduct(order.getId(), product); + + verify(orderRepository).save(order); + verify(order).addProduct(product); + } + + @Test + void shouldAddProduct_thenThrowException() { + final Product product = new Product(BigDecimal.TEN, "test"); + final ObjectId id = ObjectId.get(); + when(orderRepository.findById(id)).thenReturn(Optional.empty()); + + final Executable executable = () -> tested.addProduct(id, product); + + verify(orderRepository, times(0)).save(any(Order.class)); + assertThrows(RuntimeException.class, executable); + } + + @Test + void shouldCompleteOrder_thenSaveIt() { + final Order order = spy(OrderProvider.getCreatedOrder()); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); + + tested.completeOrder(order.getId()); + + verify(orderRepository).save(any(Order.class)); + verify(order).complete(); + } + + @Test + void shouldDeleteProduct_thenSaveOrder() { + final Order order = spy(OrderProvider.getCreatedOrder()); + final String productName = order + .getProducts() + .get(0) + .getName(); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); + + tested.deleteProduct(order.getId(), productName); + + verify(orderRepository).save(order); + verify(order).removeProduct(productName); + } +} \ No newline at end of file diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java new file mode 100644 index 0000000000..356e60946c --- /dev/null +++ b/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.ddd.layers.infrastracture.repository; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class MongoDbOrderRepositoryUnitTest { + + private SpringDataOrderRepository springDataOrderRepository; + private MongoDbOrderRepository tested; + + @BeforeEach + void setUp(){ + + } + + @Test + void findById() { + } + + @Test + void save() { + } +} \ No newline at end of file From 75ff212f1dadbf1be73d77c3e32bd8f5084bc3cb Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 15:54:37 +0100 Subject: [PATCH 17/99] BAEL-2275: Change constructor of Order --- .../PersistingDddAggregatesApplication.java | 24 +++++++++---------- .../layers/application/OrderController.java | 6 ++--- .../request/AddProductRequest.java | 4 +++- .../request/CreateOrderRequest.java | 13 +++++----- .../com/baeldung/ddd/layers/domain/Order.java | 9 +++---- .../domain/service/DomainOrderService.java | 7 ++---- .../layers/domain/service/OrderService.java | 4 +--- .../configuration/DomainConfiguration.java | 3 +++ .../configuration/MongoDBConfiguration.java | 3 ++- .../ddd/layers/domain/OrderProvider.java | 3 +-- .../service/DomainOrderServiceUnitTest.java | 3 +-- .../MongoDbOrderRepositoryUnitTest.java | 2 +- 12 files changed, 38 insertions(+), 43 deletions(-) diff --git a/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java b/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java index cd9be34278..3a52fd0440 100644 --- a/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java +++ b/ddd/src/main/java/com/baeldung/ddd/PersistingDddAggregatesApplication.java @@ -1,12 +1,12 @@ -package com.baeldung.ddd; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class PersistingDddAggregatesApplication { - - public static void main(String[] args) { - SpringApplication.run(PersistingDddAggregatesApplication.class, args); - } -} +package com.baeldung.ddd; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication(scanBasePackages = "com.baeldung.ddd.order") +public class PersistingDddAggregatesApplication { + + public static void main(String[] args) { + SpringApplication.run(PersistingDddAggregatesApplication.class, args); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java index fa3576eb37..19aa0493fa 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java @@ -22,9 +22,9 @@ public class OrderController { @PostMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) CreateOrderResponse createOrder(@RequestBody final CreateOrderRequest createOrderRequest) { - return new CreateOrderResponse(orderService - .createOrder(createOrderRequest.getProducts()) - .toString()); + final ObjectId id = orderService.createOrder(createOrderRequest.getProduct()); + + return new CreateOrderResponse(id.toString()); } @PostMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java index 823b2191ef..18a09e3636 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java @@ -4,8 +4,10 @@ import com.baeldung.ddd.layers.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import javax.validation.constraints.NotNull; + public class AddProductRequest { - private Product product; + @NotNull private Product product; @JsonCreator public AddProductRequest(@JsonProperty("product") final Product product) { diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java index a2dabd05fc..26d6d379c5 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java @@ -4,18 +4,17 @@ import com.baeldung.ddd.layers.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; -import java.util.List; +import javax.validation.constraints.NotNull; public class CreateOrderRequest { - private List products; + @NotNull private Product product; @JsonCreator - public CreateOrderRequest(@JsonProperty("products") final List productList) { - this.products = new ArrayList<>(productList); + public CreateOrderRequest(@JsonProperty("product") @NotNull Product product) { + this.product = product; } - public List getProducts() { - return products; + public Product getProduct() { + return product; } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java index d69b51ae57..c41d856d33 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -14,14 +14,11 @@ public class Order { private List products; private BigDecimal price; - public Order(final ObjectId id, final List products) { + public Order(final ObjectId id, final Product product) { this.id = id; - this.products = new ArrayList<>(products); + this.products = new ArrayList<>(Collections.singletonList(product)); this.status = OrderStatus.CREATED; - this.price = products - .stream() - .map(Product::getPrice) - .reduce(BigDecimal.ZERO, BigDecimal::add); + this.price = product.getPrice(); } public void complete() { diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java index 961309e94e..6ccef2e842 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java @@ -2,12 +2,9 @@ package com.baeldung.ddd.layers.domain.service; import com.baeldung.ddd.layers.domain.Order; import com.baeldung.ddd.layers.domain.Product; -import com.baeldung.ddd.layers.domain.exception.DomainException; import com.baeldung.ddd.layers.domain.repository.OrderRepository; import org.bson.types.ObjectId; -import java.util.List; - public class DomainOrderService implements OrderService { private final OrderRepository orderRepository; @@ -17,8 +14,8 @@ public class DomainOrderService implements OrderService { } @Override - public ObjectId createOrder(List products) { - final Order order = new Order(ObjectId.get(), products); + public ObjectId createOrder(final Product product) { + final Order order = new Order(ObjectId.get(), product); orderRepository.save(order); return order.getId(); diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java index dbc7d3aba1..b00d5b286a 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java @@ -3,10 +3,8 @@ package com.baeldung.ddd.layers.domain.service; import com.baeldung.ddd.layers.domain.Product; import org.bson.types.ObjectId; -import java.util.List; - public interface OrderService { - ObjectId createOrder(List products); + ObjectId createOrder(final Product product); void addProduct(ObjectId id, Product product); diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java index 7c56456719..8e97b4ca01 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java @@ -1,12 +1,15 @@ package com.baeldung.ddd.layers.infrastracture.configuration; +import com.baeldung.ddd.layers.DomainLayerApplication; import com.baeldung.ddd.layers.domain.repository.OrderRepository; import com.baeldung.ddd.layers.domain.service.DomainOrderService; import com.baeldung.ddd.layers.domain.service.OrderService; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration +@ComponentScan(basePackageClasses = DomainLayerApplication.class) public class DomainConfiguration { @Bean diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java index db6743e90f..5341b9fe95 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java @@ -1,7 +1,8 @@ package com.baeldung.ddd.layers.infrastracture.configuration; +import com.baeldung.ddd.layers.infrastracture.repository.SpringDataOrderRepository; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; -@EnableMongoRepositories +@EnableMongoRepositories(basePackageClasses = SpringDataOrderRepository.class) public class MongoDBConfiguration { } diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java index 8aa3ff4068..8b86992ad5 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java @@ -3,11 +3,10 @@ package com.baeldung.ddd.layers.domain; import org.bson.types.ObjectId; import java.math.BigDecimal; -import java.util.Arrays; public class OrderProvider { public static Order getCreatedOrder() { - return new Order(ObjectId.get(), Arrays.asList(new Product(BigDecimal.TEN, "productName"))); + return new Order(ObjectId.get(), new Product(BigDecimal.TEN, "productName")); } public static Order getCompletedOrder() { diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java index 841f49f7f5..3ac40a867e 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java @@ -10,7 +10,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import java.math.BigDecimal; -import java.util.Arrays; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -33,7 +32,7 @@ class DomainOrderServiceUnitTest { void shouldCreateOrder_thenSaveIt() { final Product product = new Product(BigDecimal.TEN, "productName"); - final ObjectId id = tested.createOrder(Arrays.asList(product)); + final ObjectId id = tested.createOrder(product); verify(orderRepository).save(any(Order.class)); assertNotNull(id); diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java index 356e60946c..1b4eac06be 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java @@ -14,7 +14,7 @@ class MongoDbOrderRepositoryUnitTest { void setUp(){ } - + @Test void findById() { } From a99c2c818f3d72d2d6283fa6800b4f1e8954dae1 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 20:55:03 +0100 Subject: [PATCH 18/99] BAEL-2275: Add OrderItem --- .../ddd/layers/DomainLayerApplication.java | 4 +- .../layers/application/OrderController.java | 6 ++- .../request/CreateOrderRequest.java | 2 +- .../response/CreateOrderResponse.java | 2 +- .../ddd/layers/domain/DomainException.java | 7 ++++ .../com/baeldung/ddd/layers/domain/Order.java | 39 ++++++++++--------- .../baeldung/ddd/layers/domain/OrderItem.java | 33 ++++++++++++++++ .../baeldung/ddd/layers/domain/Product.java | 25 ++++++------ .../domain/exception/DomainException.java | 7 ---- .../domain/service/DomainOrderService.java | 14 ++++--- .../layers/domain/service/OrderService.java | 4 +- ...figuration.java => BeanConfiguration.java} | 2 +- .../ddd/layers/domain/OrderProvider.java | 3 +- .../ddd/layers/domain/OrderUnitTest.java | 32 +++++++++------ .../service/DomainOrderServiceUnitTest.java | 20 +++++----- 15 files changed, 127 insertions(+), 73 deletions(-) create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java create mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java delete mode 100644 ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java rename ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/{DomainConfiguration.java => BeanConfiguration.java} (95%) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java b/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java index 35fb1958e2..1a57311df8 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java @@ -5,9 +5,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.PropertySource; @SpringBootApplication -@PropertySource(value={"classpath:ddd-layers.properties"}) +@PropertySource(value = { "classpath:ddd-layers.properties" }) public class DomainLayerApplication { - public static void main(String[] args) { + public static void main(final String[] args) { SpringApplication.run(DomainLayerApplication.class, args); } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java index 19aa0493fa..18f1514d05 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java @@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import java.util.UUID; + @RestController @RequestMapping("/orders") public class OrderController { @@ -33,8 +35,8 @@ public class OrderController { } @DeleteMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - void deleteProduct(@PathVariable final ObjectId id, @RequestParam final String name) { - orderService.deleteProduct(id, name); + void deleteProduct(@PathVariable final ObjectId id, @RequestParam final UUID productId) { + orderService.deleteProduct(id, productId); } @PostMapping("/{id}/complete") diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java index 26d6d379c5..198feaf0d2 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java @@ -10,7 +10,7 @@ public class CreateOrderRequest { @NotNull private Product product; @JsonCreator - public CreateOrderRequest(@JsonProperty("product") @NotNull Product product) { + public CreateOrderRequest(@JsonProperty("product") @NotNull final Product product) { this.product = product; } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java index d57f297bde..04e5b89e6a 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java @@ -5,7 +5,7 @@ import org.bson.types.ObjectId; public class CreateOrderResponse { private final String id; - public CreateOrderResponse(String id) { + public CreateOrderResponse(final String id) { this.id = id; } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java new file mode 100644 index 0000000000..ca0dff4a69 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java @@ -0,0 +1,7 @@ +package com.baeldung.ddd.layers.domain; + +class DomainException extends RuntimeException { + DomainException(final String message) { + super(message); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java index c41d856d33..99ad09b2e3 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -1,22 +1,22 @@ package com.baeldung.ddd.layers.domain; -import com.baeldung.ddd.layers.domain.exception.DomainException; import org.bson.types.ObjectId; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.UUID; public class Order { private final ObjectId id; private OrderStatus status; - private List products; + private List orderItems; private BigDecimal price; public Order(final ObjectId id, final Product product) { this.id = id; - this.products = new ArrayList<>(Collections.singletonList(product)); + this.orderItems = new ArrayList<>(Collections.singletonList(new OrderItem(product))); this.status = OrderStatus.CREATED; this.price = product.getPrice(); } @@ -26,29 +26,30 @@ public class Order { this.status = OrderStatus.COMPLETED; } - public void addProduct(final Product product) { + public void addOrder(final Product product) { validateState(); validateProduct(product); - products.add(product); + orderItems.add(new OrderItem(product)); price = price.add(product.getPrice()); } - public void removeProduct(final String name) { + public void removeOrder(final UUID id) { validateState(); - final Product product = getProduct(name); - products.remove(product); + final OrderItem orderItem = getOrderItem(id); + orderItems.remove(orderItem); - price = price.subtract(product.getPrice()); + price = price.subtract(orderItem.getPrice()); } - private Product getProduct(String name) { - return products + private OrderItem getOrderItem(final UUID id) { + return orderItems .stream() - .filter(product -> product - .getName() - .equals(name)) + .filter(orderItem -> orderItem + .getProduct() + .getId() + .equals(id)) .findFirst() - .orElseThrow(() -> new DomainException("Product with " + name + " doesn't exist.")); + .orElseThrow(() -> new DomainException("Product with " + id + " doesn't exist.")); } private void validateState() { @@ -71,11 +72,11 @@ public class Order { return status; } - public List getProducts() { - return Collections.unmodifiableList(products); - } - public BigDecimal getPrice() { return price; } + + public List getOrderItems() { + return orderItems; + } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java new file mode 100644 index 0000000000..06b8bd69f4 --- /dev/null +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java @@ -0,0 +1,33 @@ +package com.baeldung.ddd.layers.domain; + +import java.math.BigDecimal; +import java.util.Objects; + +public class OrderItem { + private final Product product; + + public OrderItem(final Product product) { + this.product = product; + } + + public BigDecimal getPrice() { + return product.getPrice(); + } + + public Product getProduct() { + return product; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrderItem orderItem = (OrderItem) o; + return Objects.equals(product, orderItem.product); + } + + @Override + public int hashCode() { + return Objects.hash(product); + } +} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java index 286585d84a..31928fc0fd 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java @@ -5,13 +5,16 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.math.BigDecimal; import java.util.Objects; +import java.util.UUID; public class Product { + private final UUID id; private final BigDecimal price; private final String name; @JsonCreator - public Product(@JsonProperty("price") final BigDecimal price, @JsonProperty("name") final String name) { + public Product(@JsonProperty("id") final UUID id, @JsonProperty("price") final BigDecimal price, @JsonProperty("name") final String name) { + this.id = id; this.price = price; this.name = name; } @@ -24,20 +27,20 @@ public class Product { return name; } + public UUID getId() { + return id; + } + @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - final Product product = (Product) o; - return Objects.equals(price, product.price) && Objects.equals(name, product.name); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Product product = (Product) o; + return Objects.equals(id, product.id) && Objects.equals(price, product.price) && Objects.equals(name, product.name); } @Override public int hashCode() { - return Objects.hash(price, name); + return Objects.hash(id, price, name); } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java deleted file mode 100644 index 05d25cc800..0000000000 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/exception/DomainException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.ddd.layers.domain.exception; - -public class DomainException extends RuntimeException { - public DomainException(final String message) { - super(message); - } -} diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java index 6ccef2e842..ceaf7de863 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java @@ -5,11 +5,13 @@ import com.baeldung.ddd.layers.domain.Product; import com.baeldung.ddd.layers.domain.repository.OrderRepository; import org.bson.types.ObjectId; +import java.util.UUID; + public class DomainOrderService implements OrderService { private final OrderRepository orderRepository; - public DomainOrderService(OrderRepository orderRepository) { + public DomainOrderService(final OrderRepository orderRepository) { this.orderRepository = orderRepository; } @@ -22,15 +24,15 @@ public class DomainOrderService implements OrderService { } @Override - public void addProduct(ObjectId id, Product product) { + public void addProduct(final ObjectId id, final Product product) { final Order order = getOrder(id); - order.addProduct(product); + order.addOrder(product); orderRepository.save(order); } @Override - public void completeOrder(ObjectId id) { + public void completeOrder(final ObjectId id) { final Order order = getOrder(id); order.complete(); @@ -38,9 +40,9 @@ public class DomainOrderService implements OrderService { } @Override - public void deleteProduct(ObjectId id, String name) { + public void deleteProduct(final ObjectId id, final UUID productId) { final Order order = getOrder(id); - order.removeProduct(name); + order.removeOrder(productId); orderRepository.save(order); } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java index b00d5b286a..ed3ffe5ed3 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java @@ -3,6 +3,8 @@ package com.baeldung.ddd.layers.domain.service; import com.baeldung.ddd.layers.domain.Product; import org.bson.types.ObjectId; +import java.util.UUID; + public interface OrderService { ObjectId createOrder(final Product product); @@ -10,5 +12,5 @@ public interface OrderService { void completeOrder(ObjectId id); - void deleteProduct(ObjectId id, String name); + void deleteProduct(ObjectId id, UUID productId); } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java similarity index 95% rename from ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java rename to ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java index 8e97b4ca01..68429f1fb8 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/DomainConfiguration.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java @@ -10,7 +10,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackageClasses = DomainLayerApplication.class) -public class DomainConfiguration { +public class BeanConfiguration { @Bean OrderService orderService(final OrderRepository orderRepository) { diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java index 8b86992ad5..5133ece1b8 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java @@ -3,10 +3,11 @@ package com.baeldung.ddd.layers.domain; import org.bson.types.ObjectId; import java.math.BigDecimal; +import java.util.UUID; public class OrderProvider { public static Order getCreatedOrder() { - return new Order(ObjectId.get(), new Product(BigDecimal.TEN, "productName")); + return new Order(ObjectId.get(), new Product(UUID.randomUUID(), BigDecimal.TEN, "productName")); } public static Order getCompletedOrder() { diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java index 0996383610..48c55769ab 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java @@ -1,13 +1,11 @@ package com.baeldung.ddd.layers.domain; -import com.baeldung.ddd.layers.domain.exception.DomainException; -import org.bson.types.ObjectId; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; import java.math.BigDecimal; -import java.util.Arrays; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -25,22 +23,26 @@ class OrderUnitTest { @Test void shouldAddProduct_thenUpdatePrice() { final Order order = OrderProvider.getCreatedOrder(); - final int orderOriginalProductSize = order.getProducts().size(); + final int orderOriginalProductSize = order + .getOrderItems() + .size(); final BigDecimal orderOriginalPrice = order.getPrice(); - final Product productToAdd = new Product(new BigDecimal("20"), "secondProduct"); + final Product productToAdd = new Product(UUID.randomUUID(), new BigDecimal("20"), "secondProduct"); - order.addProduct(productToAdd); + order.addOrder(productToAdd); - assertEquals(orderOriginalProductSize + 1, order.getProducts().size()); + assertEquals(orderOriginalProductSize + 1, order + .getOrderItems() + .size()); assertEquals(orderOriginalPrice.add(productToAdd.getPrice()), order.getPrice()); } @Test - void shouldAddProduct_thenThrowException(){ + void shouldAddProduct_thenThrowException() { final Order order = OrderProvider.getCompletedOrder(); - final Product productToAdd = new Product(new BigDecimal("20"), "secondProduct"); + final Product productToAdd = new Product(UUID.randomUUID(), new BigDecimal("20"), "secondProduct"); - final Executable executable = () -> order.addProduct(productToAdd); + final Executable executable = () -> order.addOrder(productToAdd); Assertions.assertThrows(DomainException.class, executable); } @@ -49,9 +51,15 @@ class OrderUnitTest { void shouldRemoveProduct_thenUpdatePrice() { final Order order = OrderProvider.getCreatedOrder(); - order.removeProduct(order.getProducts().get(0).getName()); + order.removeOrder(order + .getOrderItems() + .get(0) + .getProduct() + .getId()); - assertEquals(0, order.getProducts().size()); + assertEquals(0, order + .getOrderItems() + .size()); assertEquals(BigDecimal.ZERO, order.getPrice()); } } \ No newline at end of file diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java index 3ac40a867e..572afada00 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.api.function.Executable; import java.math.BigDecimal; import java.util.Optional; +import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -30,7 +31,7 @@ class DomainOrderServiceUnitTest { @Test void shouldCreateOrder_thenSaveIt() { - final Product product = new Product(BigDecimal.TEN, "productName"); + final Product product = new Product(UUID.randomUUID(), BigDecimal.TEN, "productName"); final ObjectId id = tested.createOrder(product); @@ -41,18 +42,18 @@ class DomainOrderServiceUnitTest { @Test void shouldAddProduct_thenSaveOrder() { final Order order = spy(OrderProvider.getCreatedOrder()); - final Product product = new Product(BigDecimal.TEN, "test"); + final Product product = new Product(UUID.randomUUID(), BigDecimal.TEN, "test"); when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); tested.addProduct(order.getId(), product); verify(orderRepository).save(order); - verify(order).addProduct(product); + verify(order).addOrder(product); } @Test void shouldAddProduct_thenThrowException() { - final Product product = new Product(BigDecimal.TEN, "test"); + final Product product = new Product(UUID.randomUUID(), BigDecimal.TEN, "test"); final ObjectId id = ObjectId.get(); when(orderRepository.findById(id)).thenReturn(Optional.empty()); @@ -76,15 +77,16 @@ class DomainOrderServiceUnitTest { @Test void shouldDeleteProduct_thenSaveOrder() { final Order order = spy(OrderProvider.getCreatedOrder()); - final String productName = order - .getProducts() + final UUID productId = order + .getOrderItems() .get(0) - .getName(); + .getProduct() + .getId(); when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); - tested.deleteProduct(order.getId(), productName); + tested.deleteProduct(order.getId(), productId); verify(orderRepository).save(order); - verify(order).removeProduct(productName); + verify(order).removeOrder(productId); } } \ No newline at end of file From 9f8c01aca93fbb37de64fbde5b2490a00e5cc76e Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 21:27:07 +0100 Subject: [PATCH 19/99] BAEL-2275: Change orderitem to be built based on product --- .../com/baeldung/ddd/layers/domain/Order.java | 3 +-- .../baeldung/ddd/layers/domain/OrderItem.java | 21 +++++++++++-------- .../ddd/layers/domain/OrderUnitTest.java | 8 +++---- .../service/DomainOrderServiceUnitTest.java | 4 ++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java index 99ad09b2e3..369f860bae 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -45,8 +45,7 @@ public class Order { return orderItems .stream() .filter(orderItem -> orderItem - .getProduct() - .getId() + .getProductId() .equals(id)) .findFirst() .orElseThrow(() -> new DomainException("Product with " + id + " doesn't exist.")); diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java index 06b8bd69f4..703a512ea2 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java @@ -2,20 +2,23 @@ package com.baeldung.ddd.layers.domain; import java.math.BigDecimal; import java.util.Objects; +import java.util.UUID; public class OrderItem { - private final Product product; + private final UUID productId; + private final BigDecimal price; public OrderItem(final Product product) { - this.product = product; + this.productId = product.getId(); + this.price = product.getPrice(); + } + + public UUID getProductId() { + return productId; } public BigDecimal getPrice() { - return product.getPrice(); - } - - public Product getProduct() { - return product; + return price; } @Override @@ -23,11 +26,11 @@ public class OrderItem { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; OrderItem orderItem = (OrderItem) o; - return Objects.equals(product, orderItem.product); + return Objects.equals(productId, orderItem.productId) && Objects.equals(price, orderItem.price); } @Override public int hashCode() { - return Objects.hash(product); + return Objects.hash(productId, price); } } diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java index 48c55769ab..086624bf77 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java @@ -50,12 +50,12 @@ class OrderUnitTest { @Test void shouldRemoveProduct_thenUpdatePrice() { final Order order = OrderProvider.getCreatedOrder(); - - order.removeOrder(order + final UUID productId = order .getOrderItems() .get(0) - .getProduct() - .getId()); + .getProductId(); + + order.removeOrder(productId); assertEquals(0, order .getOrderItems() diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java index 572afada00..a9e967229d 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java @@ -80,8 +80,8 @@ class DomainOrderServiceUnitTest { final UUID productId = order .getOrderItems() .get(0) - .getProduct() - .getId(); + .getProductId(); + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); tested.deleteProduct(order.getId(), productId); From 65c6c80504627dbdab1569407644e3463cc6b053 Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 20 Nov 2019 22:20:02 +0000 Subject: [PATCH 20/99] aaa --- .../com/baeldung/algorithms/prim/Edge.java | 37 +++++++ .../com/baeldung/algorithms/prim/Prim.java | 74 +++++++++++++ .../com/baeldung/algorithms/prim/Vertex.java | 101 ++++++++++++++++++ .../baeldung/algorithms/prim/PrimTest.java | 55 ++++++++++ 4 files changed, 267 insertions(+) create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java create mode 100644 algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java create mode 100644 algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java new file mode 100644 index 0000000000..3720536df7 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java @@ -0,0 +1,37 @@ +package com.baeldung.algorithms.prim; + +public class Edge { + + private int weight; + private boolean isIncluded = false; + private boolean isPrinted = false; + + public Edge (int weight){ + this.weight = weight; + } + + public int getWeight() { + return weight; + } + + public void setWeight(int weight) { + this.weight = weight; + } + + public boolean isIncluded() { + return isIncluded; + } + + public void setIncluded(boolean included) { + isIncluded = included; + } + + public boolean isPrinted() { + return isPrinted; + } + + public void setPrinted(boolean printed) { + isPrinted = printed; + } +} + diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java new file mode 100644 index 0000000000..944ad4e66c --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -0,0 +1,74 @@ +package com.baeldung.algorithms.prim; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Prim { + + private List graph; + + public Prim(List graph){ + this.graph = graph; + } + + public void run(){ + if (graph.size() > 0){ + graph.get(0).setVisited(true); + } + while (isDisconnected()){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = graph.get(0); + for (Vertex vertex : graph){ + if (vertex.isVisited()){ + Pair candidate = vertex.nextMinimum(); + if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + nextMinimum = candidate.getValue(); + nextVertex = candidate.getKey(); + } + } + } + nextMinimum.setIncluded(true); + nextVertex.setVisited(true); + } + } + + private boolean isDisconnected(){ + for (Vertex vertex : graph){ + if (!vertex.isVisited()){ + return true; + } + } + return false; + } + + public String originalGraphToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.originalToString()); + } + return sb.toString(); + } + + public void resetPrintHistory(){ + for (Vertex vertex : graph){ + Iterator it = vertex.getEdges().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + ((Edge)pair.getValue()).setPrinted(false); + } + } + } + + public String minimumSpanningTreeToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.includedToString()); + } + return sb.toString(); + } + +} + diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java new file mode 100644 index 0000000000..0bb2454a1f --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -0,0 +1,101 @@ +package com.baeldung.algorithms.prim; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Vertex { + + private String label = null; + private Map edges = new HashMap<>(); + private boolean isVisited = false; + + public Vertex(String label){ + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Map getEdges() { + return edges; + } + + public void addEdge(Vertex vertex, Edge edge){ + this.edges.put(vertex, edge); + } + + public boolean isVisited() { + return isVisited; + } + + public void setVisited(boolean visited) { + isVisited = visited; + } + + public Pair nextMinimum(){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = this; + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (!((Vertex)pair.getKey()).isVisited()){ + if (!((Edge)pair.getValue()).isIncluded()) { + if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { + nextMinimum = (Edge) pair.getValue(); + nextVertex = (Vertex) pair.getKey(); + } + } + } + } + return new Pair<>(nextVertex, nextMinimum); + } + + public String originalToString(){ + StringBuilder sb = new StringBuilder(); + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (!((Edge)pair.getValue()).isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(((Edge) pair.getValue()).getWeight()); + sb.append(" --- "); + sb.append(((Vertex) pair.getKey()).getLabel()); + sb.append("\n"); + ((Edge) pair.getValue()).setPrinted(true); + } + } + return sb.toString(); + } + + public String includedToString(){ + StringBuilder sb = new StringBuilder(); + if (isVisited()) { + Iterator it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = (Map.Entry) it.next(); + if (((Edge) pair.getValue()).isIncluded()) { + if (!((Edge)pair.getValue()).isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(((Edge) pair.getValue()).getWeight()); + sb.append(" --- "); + sb.append(((Vertex) pair.getKey()).getLabel()); + sb.append("\n"); + ((Edge) pair.getValue()).setPrinted(true); + } + } + } + } + return sb.toString(); + } +} + diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java new file mode 100644 index 0000000000..45a80e4900 --- /dev/null +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java @@ -0,0 +1,55 @@ +package com.baeldung.algorithms.prim; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class PrimTest { + + @Test + public void givenAGraph_whenPrimRuns_thenPrintMST() { + Prim prim = new Prim(createGraph()); + System.out.println(prim.originalGraphToString()); + System.out.println("----------------"); + prim.run(); + System.out.println(); + prim.resetPrintHistory(); + System.out.println(prim.minimumSpanningTreeToString()); + } + + public static List createGraph(){ + List graph = new ArrayList<>(); + Vertex a = new Vertex("A"); + Vertex b = new Vertex("B"); + Vertex c = new Vertex("C"); + Vertex d = new Vertex("D"); + Vertex e = new Vertex("E"); + Edge ab = new Edge(2); + a.addEdge(b, ab); + b.addEdge(a, ab); + Edge ac = new Edge(3); + a.addEdge(c, ac); + c.addEdge(a, ac); + Edge bc = new Edge(2); + b.addEdge(c, bc); + c.addEdge(b, bc); + Edge be = new Edge(5); + b.addEdge(e, be); + e.addEdge(b, be); + Edge cd = new Edge(1); + c.addEdge(d, cd); + d.addEdge(c, cd); + Edge ce = new Edge(1); + c.addEdge(e, ce); + e.addEdge(c, ce); + graph.add(a); + graph.add(b); + graph.add(c); + graph.add(d); + graph.add(e); + return graph; + } + +} + From 3a573ab48a9456ccdbbf6fbac836d63d82fe5cd4 Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 20 Nov 2019 22:27:17 +0000 Subject: [PATCH 21/99] fix --- .../algorithms/prim/{PrimTest.java => PrimUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/{PrimTest.java => PrimUnitTest.java} (98%) diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java similarity index 98% rename from algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java index 45a80e4900..548fe2c877 100644 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimTest.java +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java @@ -5,7 +5,7 @@ import java.util.List; import org.junit.Test; -public class PrimTest { +public class PrimUnitTest { @Test public void givenAGraph_whenPrimRuns_thenPrintMST() { From fb0cbcb09e4fcfbc0c6bc2686fd5e28a21ecdbaf Mon Sep 17 00:00:00 2001 From: pazis Date: Sun, 24 Nov 2019 18:40:13 +0000 Subject: [PATCH 22/99] addEdge fix --- .../com/baeldung/algorithms/prim/Edge.java | 3 +- .../com/baeldung/algorithms/prim/Prim.java | 43 ++++++++++--------- .../com/baeldung/algorithms/prim/Vertex.java | 28 ++++++------ .../algorithms/prim/PrimUnitTest.java | 3 +- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java index 3720536df7..52ec4ef534 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Edge.java @@ -6,7 +6,7 @@ public class Edge { private boolean isIncluded = false; private boolean isPrinted = false; - public Edge (int weight){ + public Edge(int weight) { this.weight = weight; } @@ -34,4 +34,3 @@ public class Edge { isPrinted = printed; } } - diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java index 944ad4e66c..ec97e34341 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -10,21 +10,23 @@ public class Prim { private List graph; - public Prim(List graph){ + public Prim(List graph) { this.graph = graph; } - public void run(){ - if (graph.size() > 0){ - graph.get(0).setVisited(true); + public void run() { + if (graph.size() > 0) { + graph.get(0) + .setVisited(true); } - while (isDisconnected()){ + while (isDisconnected()) { Edge nextMinimum = new Edge(Integer.MAX_VALUE); Vertex nextVertex = graph.get(0); - for (Vertex vertex : graph){ - if (vertex.isVisited()){ + for (Vertex vertex : graph) { + if (vertex.isVisited()) { Pair candidate = vertex.nextMinimum(); - if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + if (candidate.getValue() + .getWeight() < nextMinimum.getWeight()) { nextMinimum = candidate.getValue(); nextVertex = candidate.getKey(); } @@ -35,40 +37,41 @@ public class Prim { } } - private boolean isDisconnected(){ - for (Vertex vertex : graph){ - if (!vertex.isVisited()){ + private boolean isDisconnected() { + for (Vertex vertex : graph) { + if (!vertex.isVisited()) { return true; } } return false; } - public String originalGraphToString(){ + public String originalGraphToString() { StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph){ + for (Vertex vertex : graph) { sb.append(vertex.originalToString()); } return sb.toString(); } - public void resetPrintHistory(){ - for (Vertex vertex : graph){ - Iterator it = vertex.getEdges().entrySet().iterator(); + public void resetPrintHistory() { + for (Vertex vertex : graph) { + Iterator it = vertex.getEdges() + .entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - ((Edge)pair.getValue()).setPrinted(false); + ((Edge) pair.getValue()).setPrinted(false); } } } - public String minimumSpanningTreeToString(){ + public String minimumSpanningTreeToString() { StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph){ + for (Vertex vertex : graph) { sb.append(vertex.includedToString()); } return sb.toString(); } } - diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java index 0bb2454a1f..e2b7d90638 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -12,7 +12,7 @@ public class Vertex { private Map edges = new HashMap<>(); private boolean isVisited = false; - public Vertex(String label){ + public Vertex(String label) { this.label = label; } @@ -28,7 +28,7 @@ public class Vertex { return edges; } - public void addEdge(Vertex vertex, Edge edge){ + public void addEdge(Vertex vertex, Edge edge) { this.edges.put(vertex, edge); } @@ -40,14 +40,15 @@ public class Vertex { isVisited = visited; } - public Pair nextMinimum(){ + public Pair nextMinimum() { Edge nextMinimum = new Edge(Integer.MAX_VALUE); Vertex nextVertex = this; - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (!((Vertex)pair.getKey()).isVisited()){ - if (!((Edge)pair.getValue()).isIncluded()) { + if (!((Vertex) pair.getKey()).isVisited()) { + if (!((Edge) pair.getValue()).isIncluded()) { if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { nextMinimum = (Edge) pair.getValue(); nextVertex = (Vertex) pair.getKey(); @@ -58,12 +59,13 @@ public class Vertex { return new Pair<>(nextVertex, nextMinimum); } - public String originalToString(){ + public String originalToString() { StringBuilder sb = new StringBuilder(); - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); - if (!((Edge)pair.getValue()).isPrinted()) { + if (!((Edge) pair.getValue()).isPrinted()) { sb.append(getLabel()); sb.append(" --- "); sb.append(((Edge) pair.getValue()).getWeight()); @@ -76,14 +78,15 @@ public class Vertex { return sb.toString(); } - public String includedToString(){ + public String includedToString() { StringBuilder sb = new StringBuilder(); if (isVisited()) { - Iterator it = edges.entrySet().iterator(); + Iterator it = edges.entrySet() + .iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry) it.next(); if (((Edge) pair.getValue()).isIncluded()) { - if (!((Edge)pair.getValue()).isPrinted()) { + if (!((Edge) pair.getValue()).isPrinted()) { sb.append(getLabel()); sb.append(" --- "); sb.append(((Edge) pair.getValue()).getWeight()); @@ -98,4 +101,3 @@ public class Vertex { return sb.toString(); } } - diff --git a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java index 548fe2c877..41e53fc9f2 100644 --- a/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java +++ b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/prim/PrimUnitTest.java @@ -18,7 +18,7 @@ public class PrimUnitTest { System.out.println(prim.minimumSpanningTreeToString()); } - public static List createGraph(){ + public static List createGraph() { List graph = new ArrayList<>(); Vertex a = new Vertex("A"); Vertex b = new Vertex("B"); @@ -52,4 +52,3 @@ public class PrimUnitTest { } } - From e384c430a07e7aaeca83f7ec1f7a5aecd5a01c4b Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Mon, 25 Nov 2019 13:28:54 +0200 Subject: [PATCH 23/99] BAEL-3456 - Springfox --- springfox/pom.xml | 97 +++++++++++++++++++ .../springfox/SpringfoxApplication.java | 65 +++++++++++++ .../springfox/controller/UserController.java | 42 ++++++++ .../com/baeldung/springfox/model/User.java | 68 +++++++++++++ .../plugin/EmailAnnotationPlugin.java | 39 ++++++++ .../springfox/repository/UserRepository.java | 11 +++ .../repository/UserRestRepository.java | 11 +++ .../src/main/resources/application.properties | 3 + 8 files changed, 336 insertions(+) create mode 100644 springfox/pom.xml create mode 100644 springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java create mode 100644 springfox/src/main/java/com/baeldung/springfox/controller/UserController.java create mode 100644 springfox/src/main/java/com/baeldung/springfox/model/User.java create mode 100644 springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java create mode 100644 springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java create mode 100644 springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java create mode 100644 springfox/src/main/resources/application.properties diff --git a/springfox/pom.xml b/springfox/pom.xml new file mode 100644 index 0000000000..cbea0baa39 --- /dev/null +++ b/springfox/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + com.baeldung.web + springfox + springfox + SpringFox + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + + jcenter + jcenter + https://jcenter.bintray.com/ + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + + + + + + io.springfox + springfox-swagger2 + 3.0.0-SNAPSHOT + + + io.springfox + springfox-swagger-ui + 3.0.0-SNAPSHOT + + + io.springfox + springfox-data-rest + 3.0.0-SNAPSHOT + + + io.springfox + springfox-bean-validators + 3.0.0-SNAPSHOT + + + + + + com.google.guava + guava + ${guava.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + com.baeldung.springfox.SpringfoxApplication + 27.0.1-jre + + diff --git a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java new file mode 100644 index 0000000000..20f560f9ef --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java @@ -0,0 +1,65 @@ +package com.baeldung.springfox; + +import static springfox.documentation.builders.PathSelectors.regex; + +import java.util.Collections; +import java.util.function.Predicate; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import com.baeldung.springfox.plugin.EmailAnnotationPlugin; +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + + +@SpringBootApplication +@EnableSwagger2WebMvc +@EntityScan("com.baeldung.springfox.model") +@ComponentScan("com.baeldung.springfox.controller") +@EnableJpaRepositories("com.baeldung.springfox.repository") +@Import({SpringDataRestConfiguration.class, BeanValidatorPluginsConfiguration.class}) +public class SpringfoxApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringfoxApplication.class, args); + } + + @Bean + public Docket springfoxAppInfo() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("baeldung-springfox-api") + .select() + .paths(paths()) + .build() + .apiInfo(apiInfo()); + } + + private Predicate paths() { + return regex("/users.*").or(regex("/api.*")); + } + + private ApiInfo apiInfo() { + return new ApiInfo( + "Springfox API specification", + "User REST and Spring Data APIs", + "", + "", + null, + "License of API", "API license URL", Collections.emptyList()); + } + + @Bean + public EmailAnnotationPlugin emailPlugin() { + return new EmailAnnotationPlugin(); + } + +} diff --git a/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java b/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java new file mode 100644 index 0000000000..6a827bb757 --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java @@ -0,0 +1,42 @@ +package com.baeldung.springfox.controller; + +import static org.springframework.web.bind.annotation.RequestMethod.GET; +import static org.springframework.web.bind.annotation.RequestMethod.POST; + +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.baeldung.springfox.model.User; +import com.baeldung.springfox.repository.UserRepository; + +@Controller +@RequestMapping(value = "/api/user", produces = MediaType.APPLICATION_JSON_VALUE) +public class UserController { + + @Autowired + private UserRepository userRepository; + + @RequestMapping(method = POST) + @ResponseBody + public ResponseEntity createUser(@RequestBody User user) { + userRepository.save(user); + return new ResponseEntity<>(user, HttpStatus.OK); + } + + @RequestMapping(method = GET) + @ResponseBody + public ResponseEntity getUser(@RequestParam Long id) { + Optional user = userRepository.findById(id); + return new ResponseEntity<>(user.get(), HttpStatus.OK); + } + +} diff --git a/springfox/src/main/java/com/baeldung/springfox/model/User.java b/springfox/src/main/java/com/baeldung/springfox/model/User.java new file mode 100644 index 0000000000..90de0deea5 --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/model/User.java @@ -0,0 +1,68 @@ +package com.baeldung.springfox.model; + +import javax.persistence.Id; +import javax.validation.constraints.Email; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.persistence.Entity; + +@Entity +public class User{ + + @Id + private Long id; + + @NotNull(message = "First Name cannot be null") + private String firstName; + + private String lastName; + + @Min(value = 15, message = "Age should not be less than 15") + @Max(value = 65, message = "Age should not be greater than 65") + private int age; + + @Email(regexp=".@.\\..*", message = "Email should be valid") + private String email; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + } diff --git a/springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java b/springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java new file mode 100644 index 0000000000..2e5e57aec5 --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java @@ -0,0 +1,39 @@ +package com.baeldung.springfox.plugin; + +import static springfox.bean.validators.plugins.Validators.annotationFromBean; + +import java.util.Optional; + +import javax.validation.constraints.Email; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import springfox.bean.validators.plugins.Validators; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.schema.ModelPropertyBuilderPlugin; +import springfox.documentation.spi.schema.contexts.ModelPropertyContext; + +@Component +@Order(Validators.BEAN_VALIDATOR_PLUGIN_ORDER) +public class EmailAnnotationPlugin implements ModelPropertyBuilderPlugin { + + @Override + public boolean supports(DocumentationType delimiter) { + return true; + } + + /** + * read Email annotation + */ + @Override + public void apply(ModelPropertyContext context) { + Optional email = annotationFromBean(context, Email.class); + if (email.isPresent()) { + context.getBuilder().pattern(email.get().regexp()); + context.getBuilder().example("email@email.com"); + } + } + +} + diff --git a/springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java b/springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java new file mode 100644 index 0000000000..16303bc6d0 --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.springfox.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import com.baeldung.springfox.model.User; + +@Repository +public interface UserRepository extends CrudRepository { + +} diff --git a/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java b/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java new file mode 100644 index 0000000000..9edce50af4 --- /dev/null +++ b/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.springfox.repository; + +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.rest.core.annotation.RepositoryRestResource; + +import com.baeldung.springfox.model.User; + +@RepositoryRestResource(collectionResourceRel = "users", path = "users") +public interface UserRestRepository extends CrudRepository { + +} diff --git a/springfox/src/main/resources/application.properties b/springfox/src/main/resources/application.properties new file mode 100644 index 0000000000..3b4076297b --- /dev/null +++ b/springfox/src/main/resources/application.properties @@ -0,0 +1,3 @@ +### Spring Boot default error handling configurations +#server.error.whitelabel.enabled=false +#server.error.include-stacktrace=always From 944b3308c5f4bb4377785667cab42dc37b5c4b8e Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Mon, 25 Nov 2019 13:33:22 +0200 Subject: [PATCH 24/99] BAEL-3456 - pom.xml identation --- springfox/pom.xml | 158 +++++++++++++++++++++++----------------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/springfox/pom.xml b/springfox/pom.xml index cbea0baa39..f6b5c37911 100644 --- a/springfox/pom.xml +++ b/springfox/pom.xml @@ -1,97 +1,97 @@ - 4.0.0 - com.baeldung.web - springfox - springfox - SpringFox - war + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.baeldung.web + springfox + springfox + SpringFox + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - + - jcenter - jcenter - https://jcenter.bintray.com/ - - - jcenter-snapshots - jcenter - http://oss.jfrog.org/artifactory/oss-snapshot-local/ - + jcenter + jcenter + https://jcenter.bintray.com/ + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - - - - - - io.springfox - springfox-swagger2 - 3.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-web - io.springfox - springfox-swagger-ui - 3.0.0-SNAPSHOT + org.springframework.boot + spring-boot-starter-data-rest - io.springfox - springfox-data-rest - 3.0.0-SNAPSHOT + org.springframework.boot + spring-boot-starter-data-jpa - io.springfox - springfox-bean-validators - 3.0.0-SNAPSHOT + com.h2database + h2 - - - - com.google.guava - guava - ${guava.version} - - + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + io.springfox + springfox-swagger2 + 3.0.0-SNAPSHOT + + + io.springfox + springfox-swagger-ui + 3.0.0-SNAPSHOT + + + io.springfox + springfox-data-rest + 3.0.0-SNAPSHOT + + + io.springfox + springfox-bean-validators + 3.0.0-SNAPSHOT + - - com.baeldung.springfox.SpringfoxApplication - 27.0.1-jre - + + + + com.google.guava + guava + ${guava.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + com.baeldung.springfox.SpringfoxApplication + 27.0.1-jre + From 52cd4d4da3e79775c0ff0f95ff981d3da303cbd5 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Mon, 25 Nov 2019 13:44:13 +0200 Subject: [PATCH 25/99] BAEL-3456 - pom.xml code identation with spaces --- springfox/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/springfox/pom.xml b/springfox/pom.xml index f6b5c37911..cbe29e6989 100644 --- a/springfox/pom.xml +++ b/springfox/pom.xml @@ -10,7 +10,7 @@ war - parent-boot-2 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT ../parent-boot-2 @@ -20,7 +20,7 @@ - jcenter + jcenter jcenter https://jcenter.bintray.com/ From 6e47fcec40ecda99d8d48ba24d2d0d294645cd8a Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Mon, 25 Nov 2019 15:34:18 +0200 Subject: [PATCH 26/99] Updated pom.xml --- springfox/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/springfox/pom.xml b/springfox/pom.xml index cbe29e6989..da4066d382 100644 --- a/springfox/pom.xml +++ b/springfox/pom.xml @@ -1,8 +1,8 @@ - 4.0.0 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 com.baeldung.web springfox springfox From 5a000e10728c478e8cb9f75fe26291f4861ea91b Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Mon, 25 Nov 2019 15:37:02 +0200 Subject: [PATCH 27/99] updated pom --- springfox/pom.xml | 166 +++++++++++++++++++++++----------------------- 1 file changed, 82 insertions(+), 84 deletions(-) diff --git a/springfox/pom.xml b/springfox/pom.xml index da4066d382..a47f27cde7 100644 --- a/springfox/pom.xml +++ b/springfox/pom.xml @@ -1,97 +1,95 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.web - springfox - springfox - SpringFox - war + com.baeldung.web + springfox + springfox + SpringFox + war - + parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - - + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + jcenter - jcenter - https://jcenter.bintray.com/ - - - jcenter-snapshots - jcenter - http://oss.jfrog.org/artifactory/oss-snapshot-local/ - - + jcenter + https://jcenter.bintray.com/ + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + + - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + - + - - io.springfox - springfox-swagger2 - 3.0.0-SNAPSHOT - - - io.springfox - springfox-swagger-ui - 3.0.0-SNAPSHOT - - - io.springfox - springfox-data-rest - 3.0.0-SNAPSHOT - - - io.springfox - springfox-bean-validators - 3.0.0-SNAPSHOT - + + io.springfox + springfox-swagger2 + 3.0.0-SNAPSHOT + + + io.springfox + springfox-swagger-ui + 3.0.0-SNAPSHOT + + + io.springfox + springfox-data-rest + 3.0.0-SNAPSHOT + + + io.springfox + springfox-bean-validators + 3.0.0-SNAPSHOT + - + + + com.google.guava + guava + ${guava.version} + + - - com.google.guava - guava - ${guava.version} - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - com.baeldung.springfox.SpringfoxApplication - 27.0.1-jre - + + com.baeldung.springfox.SpringfoxApplication + 27.0.1-jre + From 0d936e59d8cfa575ee163e4f440d5ead8d16621f Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Mon, 25 Nov 2019 16:13:35 +0200 Subject: [PATCH 28/99] Updated springfox module in the pom.xml --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 23b44fb285..f719d3b067 100644 --- a/pom.xml +++ b/pom.xml @@ -611,6 +611,7 @@ tensorflow-java spf4j + springfox spring-boot-configuration spring-boot-flowable spring-boot-mvc-2 @@ -1380,6 +1381,7 @@ rxjava-libraries oauth2-framework-impl spf4j + springfox spring-boot-performance spring-boot-properties From a81467e234fbb4a7045524d34fb6a5549ec0c4fd Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Mon, 25 Nov 2019 21:57:06 +0100 Subject: [PATCH 29/99] BAEL-2275: Return immutable list when getting order items --- ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java index 369f860bae..6306138100 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -76,6 +76,6 @@ public class Order { } public List getOrderItems() { - return orderItems; + return Collections.unmodifiableList(orderItems); } } From 342ac1b42372d78d8afec86a7f2067a96b95033c Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Wed, 27 Nov 2019 20:35:28 +0100 Subject: [PATCH 30/99] [ BAEL-2275 ]: Move controller to controller package --- .../layers/application/{ => controller}/OrderController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename ddd/src/main/java/com/baeldung/ddd/layers/application/{ => controller}/OrderController.java (96%) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java similarity index 96% rename from ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java rename to ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java index 18f1514d05..e4642799ac 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/OrderController.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.application; +package com.baeldung.ddd.layers.application.controller; import com.baeldung.ddd.layers.application.request.AddProductRequest; import com.baeldung.ddd.layers.application.request.CreateOrderRequest; From 390311b21eea981fcf98dacf129c70ebd8c59e4c Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Thu, 28 Nov 2019 17:14:05 +0200 Subject: [PATCH 31/99] Springfox - PR review fix --- .../springfox/SpringfoxApplication.java | 21 ++++++++----------- .../springfox/controller/UserController.java | 15 ++++++------- .../com/baeldung/springfox/model/User.java | 10 --------- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java index 20f560f9ef..364dcf61cd 100644 --- a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java +++ b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java @@ -12,7 +12,9 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + import com.baeldung.springfox.plugin.EmailAnnotationPlugin; + import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; @@ -36,11 +38,11 @@ public class SpringfoxApplication { @Bean public Docket springfoxAppInfo() { return new Docket(DocumentationType.SWAGGER_2) - .groupName("baeldung-springfox-api") - .select() - .paths(paths()) - .build() - .apiInfo(apiInfo()); + .groupName("baeldung-springfox-api") + .select() + .paths(paths()) + .build() + .apiInfo(apiInfo()); } private Predicate paths() { @@ -48,13 +50,8 @@ public class SpringfoxApplication { } private ApiInfo apiInfo() { - return new ApiInfo( - "Springfox API specification", - "User REST and Spring Data APIs", - "", - "", - null, - "License of API", "API license URL", Collections.emptyList()); + return new ApiInfo("Springfox API specification", "User REST and Spring Data APIs", + "", "", null, "License of API", "API license URL", Collections.emptyList()); } @Bean diff --git a/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java b/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java index 6a827bb757..d70cc3e7a5 100644 --- a/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java +++ b/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java @@ -1,8 +1,5 @@ package com.baeldung.springfox.controller; -import static org.springframework.web.bind.annotation.RequestMethod.GET; -import static org.springframework.web.bind.annotation.RequestMethod.POST; - import java.util.Optional; import org.springframework.beans.factory.annotation.Autowired; @@ -10,6 +7,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +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.RequestParam; @@ -25,16 +24,14 @@ public class UserController { @Autowired private UserRepository userRepository; - @RequestMapping(method = POST) - @ResponseBody - public ResponseEntity createUser(@RequestBody User user) { + @PostMapping + public @ResponseBody ResponseEntity createUser(@RequestBody User user) { userRepository.save(user); return new ResponseEntity<>(user, HttpStatus.OK); } - @RequestMapping(method = GET) - @ResponseBody - public ResponseEntity getUser(@RequestParam Long id) { + @GetMapping + public @ResponseBody ResponseEntity getUser(@RequestParam Long id) { Optional user = userRepository.findById(id); return new ResponseEntity<>(user.get(), HttpStatus.OK); } diff --git a/springfox/src/main/java/com/baeldung/springfox/model/User.java b/springfox/src/main/java/com/baeldung/springfox/model/User.java index 90de0deea5..3f94b8b3c8 100644 --- a/springfox/src/main/java/com/baeldung/springfox/model/User.java +++ b/springfox/src/main/java/com/baeldung/springfox/model/User.java @@ -16,8 +16,6 @@ public class User{ @NotNull(message = "First Name cannot be null") private String firstName; - private String lastName; - @Min(value = 15, message = "Age should not be less than 15") @Max(value = 65, message = "Age should not be greater than 65") private int age; @@ -41,14 +39,6 @@ public class User{ this.firstName = firstName; } - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - public String getEmail() { return email; } From bd8f8ff718f7458b46fd267bf415eef856e4f1ad Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Fri, 29 Nov 2019 10:50:28 +0200 Subject: [PATCH 32/99] updated pom.xml --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 65e3c96704..4966706383 100644 --- a/pom.xml +++ b/pom.xml @@ -622,7 +622,6 @@ tensorflow-java spf4j springfox - spring-boot-configuration spring-boot-config-jpa-error spring-boot-flowable spring-boot-mvc-2 From 656ee0c2119a647b4b88bcb6edbf03b1841c1689 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Fri, 29 Nov 2019 23:38:39 +0200 Subject: [PATCH 33/99] Springfox - pom.xml updated, removed UserRestRepository --- springfox/pom.xml | 3 +-- .../springfox/repository/UserRestRepository.java | 11 ----------- 2 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java diff --git a/springfox/pom.xml b/springfox/pom.xml index a47f27cde7..c620e49a3d 100644 --- a/springfox/pom.xml +++ b/springfox/pom.xml @@ -17,12 +17,12 @@ - jcenter jcenter https://jcenter.bintray.com/ + jcenter-snapshots jcenter @@ -49,7 +49,6 @@ - io.springfox springfox-swagger2 diff --git a/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java b/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java deleted file mode 100644 index 9edce50af4..0000000000 --- a/springfox/src/main/java/com/baeldung/springfox/repository/UserRestRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.springfox.repository; - -import org.springframework.data.repository.CrudRepository; -import org.springframework.data.rest.core.annotation.RepositoryRestResource; - -import com.baeldung.springfox.model.User; - -@RepositoryRestResource(collectionResourceRel = "users", path = "users") -public interface UserRestRepository extends CrudRepository { - -} From 7e1581abcd16d0c8b7086844fdb19980012450b3 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 30 Nov 2019 23:11:02 +0100 Subject: [PATCH 34/99] [ BAEL-2275 ] : Use UUID instead of ObjectId. --- .../application/controller/OrderController.java | 11 +++++------ .../application/response/CreateOrderResponse.java | 8 ++++---- .../java/com/baeldung/ddd/layers/domain/Order.java | 11 ++++++----- .../com/baeldung/ddd/layers/domain/OrderItem.java | 7 +++++-- .../layers/domain/repository/OrderRepository.java | 4 ++-- .../layers/domain/service/DomainOrderService.java | 13 ++++++------- .../ddd/layers/domain/service/OrderService.java | 9 ++++----- .../repository/MongoDbOrderRepository.java | 4 ++-- .../repository/SpringDataOrderRepository.java | 5 +++-- .../baeldung/ddd/layers/domain/OrderProvider.java | 4 +--- .../domain/service/DomainOrderServiceUnitTest.java | 7 +++---- 11 files changed, 41 insertions(+), 42 deletions(-) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java index e4642799ac..6dc8e4c215 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java @@ -4,7 +4,6 @@ import com.baeldung.ddd.layers.application.request.AddProductRequest; import com.baeldung.ddd.layers.application.request.CreateOrderRequest; import com.baeldung.ddd.layers.application.response.CreateOrderResponse; import com.baeldung.ddd.layers.domain.service.OrderService; -import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -24,23 +23,23 @@ public class OrderController { @PostMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) CreateOrderResponse createOrder(@RequestBody final CreateOrderRequest createOrderRequest) { - final ObjectId id = orderService.createOrder(createOrderRequest.getProduct()); + final UUID id = orderService.createOrder(createOrderRequest.getProduct()); - return new CreateOrderResponse(id.toString()); + return new CreateOrderResponse(id); } @PostMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - void addProduct(@PathVariable final ObjectId id, @RequestBody final AddProductRequest addProductRequest) { + void addProduct(@PathVariable final UUID id, @RequestBody final AddProductRequest addProductRequest) { orderService.addProduct(id, addProductRequest.getProduct()); } @DeleteMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) - void deleteProduct(@PathVariable final ObjectId id, @RequestParam final UUID productId) { + void deleteProduct(@PathVariable final UUID id, @RequestParam final UUID productId) { orderService.deleteProduct(id, productId); } @PostMapping("/{id}/complete") - void completeOrder(@PathVariable final ObjectId id) { + void completeOrder(@PathVariable final UUID id) { orderService.completeOrder(id); } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java index 04e5b89e6a..14cbc978e5 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java @@ -1,15 +1,15 @@ package com.baeldung.ddd.layers.application.response; -import org.bson.types.ObjectId; +import java.util.UUID; public class CreateOrderResponse { - private final String id; + private final UUID id; - public CreateOrderResponse(final String id) { + public CreateOrderResponse(final UUID id) { this.id = id; } - public String getId() { + public UUID getId() { return id; } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java index 6306138100..4af8d13f8a 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java @@ -1,7 +1,5 @@ package com.baeldung.ddd.layers.domain; -import org.bson.types.ObjectId; - import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; @@ -9,12 +7,12 @@ import java.util.List; import java.util.UUID; public class Order { - private final ObjectId id; + private UUID id; private OrderStatus status; private List orderItems; private BigDecimal price; - public Order(final ObjectId id, final Product product) { + public Order(final UUID id, final Product product) { this.id = id; this.orderItems = new ArrayList<>(Collections.singletonList(new OrderItem(product))); this.status = OrderStatus.CREATED; @@ -63,7 +61,7 @@ public class Order { } } - public ObjectId getId() { + public UUID getId() { return id; } @@ -78,4 +76,7 @@ public class Order { public List getOrderItems() { return Collections.unmodifiableList(orderItems); } + + private Order() { + } } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java index 703a512ea2..4ad26a0a3d 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java @@ -5,8 +5,8 @@ import java.util.Objects; import java.util.UUID; public class OrderItem { - private final UUID productId; - private final BigDecimal price; + private UUID productId; + private BigDecimal price; public OrderItem(final Product product) { this.productId = product.getId(); @@ -21,6 +21,9 @@ public class OrderItem { return price; } + private OrderItem() { + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java index 45b0c42782..659aa39609 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java @@ -1,12 +1,12 @@ package com.baeldung.ddd.layers.domain.repository; import com.baeldung.ddd.layers.domain.Order; -import org.bson.types.ObjectId; import java.util.Optional; +import java.util.UUID; public interface OrderRepository { - Optional findById(ObjectId id); + Optional findById(UUID id); void save(Order order); } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java index ceaf7de863..e7793ee08d 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java @@ -3,7 +3,6 @@ package com.baeldung.ddd.layers.domain.service; import com.baeldung.ddd.layers.domain.Order; import com.baeldung.ddd.layers.domain.Product; import com.baeldung.ddd.layers.domain.repository.OrderRepository; -import org.bson.types.ObjectId; import java.util.UUID; @@ -16,15 +15,15 @@ public class DomainOrderService implements OrderService { } @Override - public ObjectId createOrder(final Product product) { - final Order order = new Order(ObjectId.get(), product); + public UUID createOrder(final Product product) { + final Order order = new Order(UUID.randomUUID(), product); orderRepository.save(order); return order.getId(); } @Override - public void addProduct(final ObjectId id, final Product product) { + public void addProduct(final UUID id, final Product product) { final Order order = getOrder(id); order.addOrder(product); @@ -32,7 +31,7 @@ public class DomainOrderService implements OrderService { } @Override - public void completeOrder(final ObjectId id) { + public void completeOrder(final UUID id) { final Order order = getOrder(id); order.complete(); @@ -40,14 +39,14 @@ public class DomainOrderService implements OrderService { } @Override - public void deleteProduct(final ObjectId id, final UUID productId) { + public void deleteProduct(final UUID id, final UUID productId) { final Order order = getOrder(id); order.removeOrder(productId); orderRepository.save(order); } - private Order getOrder(ObjectId id) { + private Order getOrder(UUID id) { return orderRepository .findById(id) .orElseThrow(() -> new RuntimeException("Order with given id doesn't exist")); diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java index ed3ffe5ed3..48caf467aa 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java @@ -1,16 +1,15 @@ package com.baeldung.ddd.layers.domain.service; import com.baeldung.ddd.layers.domain.Product; -import org.bson.types.ObjectId; import java.util.UUID; public interface OrderService { - ObjectId createOrder(final Product product); + UUID createOrder(Product product); - void addProduct(ObjectId id, Product product); + void addProduct(UUID id, Product product); - void completeOrder(ObjectId id); + void completeOrder(UUID id); - void deleteProduct(ObjectId id, UUID productId); + void deleteProduct(UUID id, UUID productId); } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java index 5ec166738a..e7409e05db 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java @@ -2,11 +2,11 @@ package com.baeldung.ddd.layers.infrastracture.repository; import com.baeldung.ddd.layers.domain.Order; import com.baeldung.ddd.layers.domain.repository.OrderRepository; -import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Optional; +import java.util.UUID; @Component public class MongoDbOrderRepository implements OrderRepository { @@ -19,7 +19,7 @@ public class MongoDbOrderRepository implements OrderRepository { } @Override - public Optional findById(final ObjectId id) { + public Optional findById(final UUID id) { return orderRepository.findById(id); } diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java index 0cbbcb3827..d4fac2e454 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java @@ -1,10 +1,11 @@ package com.baeldung.ddd.layers.infrastracture.repository; import com.baeldung.ddd.layers.domain.Order; -import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; +import java.util.UUID; + @Repository -public interface SpringDataOrderRepository extends MongoRepository { +public interface SpringDataOrderRepository extends MongoRepository { } diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java index 5133ece1b8..1708aee942 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java @@ -1,13 +1,11 @@ package com.baeldung.ddd.layers.domain; -import org.bson.types.ObjectId; - import java.math.BigDecimal; import java.util.UUID; public class OrderProvider { public static Order getCreatedOrder() { - return new Order(ObjectId.get(), new Product(UUID.randomUUID(), BigDecimal.TEN, "productName")); + return new Order(UUID.randomUUID(), new Product(UUID.randomUUID(), BigDecimal.TEN, "productName")); } public static Order getCompletedOrder() { diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java index a9e967229d..87a2c1beb0 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java +++ b/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java @@ -4,7 +4,6 @@ import com.baeldung.ddd.layers.domain.Order; import com.baeldung.ddd.layers.domain.OrderProvider; import com.baeldung.ddd.layers.domain.Product; import com.baeldung.ddd.layers.domain.repository.OrderRepository; -import org.bson.types.ObjectId; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; @@ -33,7 +32,7 @@ class DomainOrderServiceUnitTest { void shouldCreateOrder_thenSaveIt() { final Product product = new Product(UUID.randomUUID(), BigDecimal.TEN, "productName"); - final ObjectId id = tested.createOrder(product); + final UUID id = tested.createOrder(product); verify(orderRepository).save(any(Order.class)); assertNotNull(id); @@ -54,7 +53,7 @@ class DomainOrderServiceUnitTest { @Test void shouldAddProduct_thenThrowException() { final Product product = new Product(UUID.randomUUID(), BigDecimal.TEN, "test"); - final ObjectId id = ObjectId.get(); + final UUID id = UUID.randomUUID(); when(orderRepository.findById(id)).thenReturn(Optional.empty()); final Executable executable = () -> tested.addProduct(id, product); @@ -81,7 +80,7 @@ class DomainOrderServiceUnitTest { .getOrderItems() .get(0) .getProductId(); - + when(orderRepository.findById(order.getId())).thenReturn(Optional.of(order)); tested.deleteProduct(order.getId(), productId); From f32815f5fc59cfff9f801b50d300dca3b756377f Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 30 Nov 2019 23:15:39 +0100 Subject: [PATCH 35/99] [ BAEL - 2275 ] : Remove UTF from APPLICATION_JSON --- .../ddd/layers/application/controller/OrderController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java index 6dc8e4c215..e3909013b7 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java +++ b/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java @@ -21,19 +21,19 @@ public class OrderController { this.orderService = orderService; } - @PostMapping(produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) CreateOrderResponse createOrder(@RequestBody final CreateOrderRequest createOrderRequest) { final UUID id = orderService.createOrder(createOrderRequest.getProduct()); return new CreateOrderResponse(id); } - @PostMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + @PostMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_VALUE) void addProduct(@PathVariable final UUID id, @RequestBody final AddProductRequest addProductRequest) { orderService.addProduct(id, addProductRequest.getProduct()); } - @DeleteMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) + @DeleteMapping(value = "/{id}/products", consumes = MediaType.APPLICATION_JSON_VALUE) void deleteProduct(@PathVariable final UUID id, @RequestParam final UUID productId) { orderService.deleteProduct(id, productId); } From 2c63519c2abceaef92a2f6f96b5380bd1a93fa08 Mon Sep 17 00:00:00 2001 From: Kamlesh Kumar Date: Sun, 1 Dec 2019 13:25:55 +0530 Subject: [PATCH 36/99] BAEL-3525: System.exit() vs Runtime.getRuntime().halt() --- .../exitvshalt/JvmExitAndHaltDemo.java | 34 +++++++++++++++++++ .../exitvshalt/JvmExitDemoUnitTest.java | 14 ++++++++ .../exitvshalt/JvmHaltDemoUnitTest.java | 14 ++++++++ 3 files changed, 62 insertions(+) create mode 100644 core-java-modules/core-java-jvm/src/main/java/com/baeldung/exitvshalt/JvmExitAndHaltDemo.java create mode 100644 core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmExitDemoUnitTest.java create mode 100644 core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmHaltDemoUnitTest.java diff --git a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/exitvshalt/JvmExitAndHaltDemo.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/exitvshalt/JvmExitAndHaltDemo.java new file mode 100644 index 0000000000..6d572455fb --- /dev/null +++ b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/exitvshalt/JvmExitAndHaltDemo.java @@ -0,0 +1,34 @@ +package com.baeldung.exitvshalt; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JvmExitAndHaltDemo { + + private static Logger LOGGER = LoggerFactory.getLogger(JvmExitAndHaltDemo.class); + + static { + Runtime.getRuntime() + .addShutdownHook(new Thread(() -> { + LOGGER.info("Shutdown hook initiated."); + })); + } + + public void processAndExit() { + process(); + LOGGER.info("Calling System.exit()."); + System.exit(0); + } + + public void processAndHalt() { + process(); + LOGGER.info("Calling Runtime.getRuntime().halt()."); + Runtime.getRuntime() + .halt(0); + } + + private void process() { + LOGGER.info("Process started."); + } + +} diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmExitDemoUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmExitDemoUnitTest.java new file mode 100644 index 0000000000..0c50651af0 --- /dev/null +++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmExitDemoUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.exitvshalt; + +import org.junit.Test; + +public class JvmExitDemoUnitTest { + + JvmExitAndHaltDemo jvmExitAndHaltDemo = new JvmExitAndHaltDemo(); + + @Test + public void givenProcessComplete_whenExitCalled_thenTriggerShutdownHook() { + jvmExitAndHaltDemo.processAndExit(); + } + +} diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmHaltDemoUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmHaltDemoUnitTest.java new file mode 100644 index 0000000000..9f08e95c6a --- /dev/null +++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/exitvshalt/JvmHaltDemoUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.exitvshalt; + +import org.junit.Test; + +public class JvmHaltDemoUnitTest { + + JvmExitAndHaltDemo jvmExitAndHaltDemo = new JvmExitAndHaltDemo(); + + @Test + public void givenProcessComplete_whenHaltCalled_thenDoNotTriggerShutdownHook() { + jvmExitAndHaltDemo.processAndHalt(); + } + +} From 6f8dbcd997a8e66febd3e483f00ad99d89e97271 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Sun, 1 Dec 2019 13:08:53 +0200 Subject: [PATCH 37/99] Springfox - PR review fixes --- .../springfox/SpringfoxApplication.java | 10 +++++-- .../com/baeldung/springfox/model/User.java | 26 +++++++++---------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java index 364dcf61cd..aaf732a8bb 100644 --- a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java +++ b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java @@ -50,8 +50,14 @@ public class SpringfoxApplication { } private ApiInfo apiInfo() { - return new ApiInfo("Springfox API specification", "User REST and Spring Data APIs", - "", "", null, "License of API", "API license URL", Collections.emptyList()); + return new ApiInfo("Springfox API specification", + "User REST and Spring Data APIs", + "", + "", + null, + "License of API", + "API license URL", + Collections.emptyList()); } @Bean diff --git a/springfox/src/main/java/com/baeldung/springfox/model/User.java b/springfox/src/main/java/com/baeldung/springfox/model/User.java index 3f94b8b3c8..20e74016f3 100644 --- a/springfox/src/main/java/com/baeldung/springfox/model/User.java +++ b/springfox/src/main/java/com/baeldung/springfox/model/User.java @@ -8,41 +8,41 @@ import javax.validation.constraints.NotNull; import javax.persistence.Entity; @Entity -public class User{ - +public class User { + @Id private Long id; - + @NotNull(message = "First Name cannot be null") private String firstName; - + @Min(value = 15, message = "Age should not be less than 15") @Max(value = 65, message = "Age should not be greater than 65") private int age; - + @Email(regexp=".@.\\..*", message = "Email should be valid") private String email; - + public Long getId() { return id; } - + public void setId(Long id) { this.id = id; } - + public String getFirstName() { return firstName; } - + public void setFirstName(String firstName) { this.firstName = firstName; } - + public String getEmail() { return email; } - + public void setEmail(String email) { this.email = email; } @@ -54,5 +54,5 @@ public class User{ public void setAge(int age) { this.age = age; } - - } + +} From 00b6c9fe8ac8e92ff51d7b6c6688e299ea2f76fd Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Sun, 1 Dec 2019 18:00:55 +0200 Subject: [PATCH 38/99] PR fix --- .../main/java/com/baeldung/springfox/SpringfoxApplication.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java index aaf732a8bb..03f20c5d0a 100644 --- a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java +++ b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java @@ -50,7 +50,8 @@ public class SpringfoxApplication { } private ApiInfo apiInfo() { - return new ApiInfo("Springfox API specification", + return new ApiInfo( + "Springfox API specification", "User REST and Spring Data APIs", "", "", From 83e61152610909070bfff15c3ca87fc9ce989e70 Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Sun, 1 Dec 2019 23:17:25 +0330 Subject: [PATCH 39/99] Added the sample codes --- .../baeldung/hook/ShutdownHookUnitTest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java new file mode 100644 index 0000000000..0059cb1faa --- /dev/null +++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.hook; + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class ShutdownHookUnitTest { + + @Test + public void givenAHook_WhenShutsDown_ThenHookShouldBeExecuted() { + Thread printingHook = new Thread(() -> System.out.println("In the middle of a shutdown")); + Runtime.getRuntime().addShutdownHook(printingHook); + } + + @Test + public void addingAHook_WhenThreadAlreadyStarted_ThenThrowsAnException() { + Thread longRunningHook = new Thread(() -> { + try { + Thread.sleep(300); + } catch (InterruptedException ignored) {} + }); + longRunningHook.start(); + + assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(longRunningHook)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Hook already running"); + } + + @Test + public void addingAHook_WhenAlreadyExists_ThenAnExceptionWouldBeThrown() { + Thread unfortunateHook = new Thread(() -> {}); + Runtime.getRuntime().addShutdownHook(unfortunateHook); + + assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(unfortunateHook)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Hook previously registered"); + } + + @Test + public void removeAHook_WhenItIsAlreadyRegistered_ThenWouldDeRegisterTheHook() { + Thread willNotRun = new Thread(() -> System.out.println("Won't run!")); + Runtime.getRuntime().addShutdownHook(willNotRun); + + assertThat(Runtime.getRuntime().removeShutdownHook(willNotRun)).isTrue(); + } +} From 7bf66f3be08389f0a31550009007c99662dd8507 Mon Sep 17 00:00:00 2001 From: pazis Date: Thu, 5 Dec 2019 14:05:20 +0000 Subject: [PATCH 40/99] iterator fix --- .../com/baeldung/algorithms/prim/Prim.java | 150 ++++++------- .../com/baeldung/algorithms/prim/Vertex.java | 209 +++++++++--------- 2 files changed, 179 insertions(+), 180 deletions(-) diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java index ec97e34341..365dca6b62 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Prim.java @@ -1,77 +1,73 @@ -package com.baeldung.algorithms.prim; - -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.commons.math3.util.Pair; - -public class Prim { - - private List graph; - - public Prim(List graph) { - this.graph = graph; - } - - public void run() { - if (graph.size() > 0) { - graph.get(0) - .setVisited(true); - } - while (isDisconnected()) { - Edge nextMinimum = new Edge(Integer.MAX_VALUE); - Vertex nextVertex = graph.get(0); - for (Vertex vertex : graph) { - if (vertex.isVisited()) { - Pair candidate = vertex.nextMinimum(); - if (candidate.getValue() - .getWeight() < nextMinimum.getWeight()) { - nextMinimum = candidate.getValue(); - nextVertex = candidate.getKey(); - } - } - } - nextMinimum.setIncluded(true); - nextVertex.setVisited(true); - } - } - - private boolean isDisconnected() { - for (Vertex vertex : graph) { - if (!vertex.isVisited()) { - return true; - } - } - return false; - } - - public String originalGraphToString() { - StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph) { - sb.append(vertex.originalToString()); - } - return sb.toString(); - } - - public void resetPrintHistory() { - for (Vertex vertex : graph) { - Iterator it = vertex.getEdges() - .entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - ((Edge) pair.getValue()).setPrinted(false); - } - } - } - - public String minimumSpanningTreeToString() { - StringBuilder sb = new StringBuilder(); - for (Vertex vertex : graph) { - sb.append(vertex.includedToString()); - } - return sb.toString(); - } - -} +package com.baeldung.algorithms.prim; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Prim { + + private List graph; + + public Prim(List graph){ + this.graph = graph; + } + + public void run(){ + if (graph.size() > 0){ + graph.get(0).setVisited(true); + } + while (isDisconnected()){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = graph.get(0); + for (Vertex vertex : graph){ + if (vertex.isVisited()){ + Pair candidate = vertex.nextMinimum(); + if (candidate.getValue().getWeight() < nextMinimum.getWeight()){ + nextMinimum = candidate.getValue(); + nextVertex = candidate.getKey(); + } + } + } + nextMinimum.setIncluded(true); + nextVertex.setVisited(true); + } + } + + private boolean isDisconnected(){ + for (Vertex vertex : graph){ + if (!vertex.isVisited()){ + return true; + } + } + return false; + } + + public String originalGraphToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.originalToString()); + } + return sb.toString(); + } + + public void resetPrintHistory(){ + for (Vertex vertex : graph){ + Iterator> it = vertex.getEdges().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + pair.getValue().setPrinted(false); + } + } + } + + public String minimumSpanningTreeToString(){ + StringBuilder sb = new StringBuilder(); + for (Vertex vertex : graph){ + sb.append(vertex.includedToString()); + } + return sb.toString(); + } + +} diff --git a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java index e2b7d90638..982d9331bc 100644 --- a/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java +++ b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/prim/Vertex.java @@ -1,103 +1,106 @@ -package com.baeldung.algorithms.prim; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.math3.util.Pair; - -public class Vertex { - - private String label = null; - private Map edges = new HashMap<>(); - private boolean isVisited = false; - - public Vertex(String label) { - this.label = label; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public Map getEdges() { - return edges; - } - - public void addEdge(Vertex vertex, Edge edge) { - this.edges.put(vertex, edge); - } - - public boolean isVisited() { - return isVisited; - } - - public void setVisited(boolean visited) { - isVisited = visited; - } - - public Pair nextMinimum() { - Edge nextMinimum = new Edge(Integer.MAX_VALUE); - Vertex nextVertex = this; - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (!((Vertex) pair.getKey()).isVisited()) { - if (!((Edge) pair.getValue()).isIncluded()) { - if (((Edge) pair.getValue()).getWeight() < nextMinimum.getWeight()) { - nextMinimum = (Edge) pair.getValue(); - nextVertex = (Vertex) pair.getKey(); - } - } - } - } - return new Pair<>(nextVertex, nextMinimum); - } - - public String originalToString() { - StringBuilder sb = new StringBuilder(); - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (!((Edge) pair.getValue()).isPrinted()) { - sb.append(getLabel()); - sb.append(" --- "); - sb.append(((Edge) pair.getValue()).getWeight()); - sb.append(" --- "); - sb.append(((Vertex) pair.getKey()).getLabel()); - sb.append("\n"); - ((Edge) pair.getValue()).setPrinted(true); - } - } - return sb.toString(); - } - - public String includedToString() { - StringBuilder sb = new StringBuilder(); - if (isVisited()) { - Iterator it = edges.entrySet() - .iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - if (((Edge) pair.getValue()).isIncluded()) { - if (!((Edge) pair.getValue()).isPrinted()) { - sb.append(getLabel()); - sb.append(" --- "); - sb.append(((Edge) pair.getValue()).getWeight()); - sb.append(" --- "); - sb.append(((Vertex) pair.getKey()).getLabel()); - sb.append("\n"); - ((Edge) pair.getValue()).setPrinted(true); - } - } - } - } - return sb.toString(); - } -} +package com.baeldung.algorithms.prim; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.apache.commons.math3.util.Pair; + +public class Vertex { + + private String label = null; + private Map edges = new HashMap<>(); + private boolean isVisited = false; + + public Vertex(String label){ + this.label = label; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Map getEdges() { + return edges; + } + + public void addEdge(Vertex vertex, Edge edge){ + if (this.edges.containsKey(vertex)){ + if (edge.getWeight() < this.edges.get(vertex).getWeight()){ + this.edges.replace(vertex, edge); + } + } else { + this.edges.put(vertex, edge); + } + } + + public boolean isVisited() { + return isVisited; + } + + public void setVisited(boolean visited) { + isVisited = visited; + } + + public Pair nextMinimum(){ + Edge nextMinimum = new Edge(Integer.MAX_VALUE); + Vertex nextVertex = this; + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (!pair.getKey().isVisited()){ + if (!pair.getValue().isIncluded()) { + if (pair.getValue().getWeight() < nextMinimum.getWeight()) { + nextMinimum = pair.getValue(); + nextVertex = pair.getKey(); + } + } + } + } + return new Pair<>(nextVertex, nextMinimum); + } + + public String originalToString(){ + StringBuilder sb = new StringBuilder(); + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (!pair.getValue().isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(pair.getValue().getWeight()); + sb.append(" --- "); + sb.append(pair.getKey().getLabel()); + sb.append("\n"); + pair.getValue().setPrinted(true); + } + } + return sb.toString(); + } + + public String includedToString(){ + StringBuilder sb = new StringBuilder(); + if (isVisited()) { + Iterator> it = edges.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry pair = it.next(); + if (pair.getValue().isIncluded()) { + if (!pair.getValue().isPrinted()) { + sb.append(getLabel()); + sb.append(" --- "); + sb.append(pair.getValue().getWeight()); + sb.append(" --- "); + sb.append(pair.getKey().getLabel()); + sb.append("\n"); + pair.getValue().setPrinted(true); + } + } + } + } + return sb.toString(); + } +} From e51f7abf5d287f287f59a47c880cf195fd2544de Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Thu, 5 Dec 2019 09:42:34 -0500 Subject: [PATCH 41/99] BAEL-3559: Added purpose-built endpoint for testing multipart uploads with HttpClient. --- .../HttpClientMultipartLiveTest.java | 10 +++--- .../MultipartFileUploadStubController.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java index 9912e73c2b..1752c27286 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -34,7 +34,7 @@ public class HttpClientMultipartLiveTest { // No longer available // private static final String SERVER = "http://echo.200please.com"; - private static final String SERVER = "http://posttestserver.com/post.php"; + private static final String SERVER = "http://localhost:8080/spring-mvc-java/stub/multipart"; private static final String TEXTFILENAME = "temp.txt"; private static final String IMAGEFILENAME = "image.jpg"; private static final String ZIPFILENAME = "zipFile.zip"; @@ -84,7 +84,7 @@ public class HttpClientMultipartLiveTest { // final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addPart("upfile", fileBody); + builder.addPart("file", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); final HttpEntity entity = builder.build(); @@ -112,7 +112,7 @@ public class HttpClientMultipartLiveTest { final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, TEXTFILENAME); + builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); final HttpEntity entity = builder.build(); post.setEntity(entity); @@ -141,7 +141,7 @@ public class HttpClientMultipartLiveTest { final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); + builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); builder.addBinaryBody("upstream", inputStream, ContentType.create("application/zip"), ZIPFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); @@ -165,7 +165,7 @@ public class HttpClientMultipartLiveTest { final byte[] bytes = "binary code".getBytes(); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); + builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); post.setEntity(entity); diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java new file mode 100644 index 0000000000..cac1ece5df --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java @@ -0,0 +1,33 @@ +package com.baeldung.web.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +@Controller +public class MultipartFileUploadStubController { + + private static final Logger logger = LoggerFactory.getLogger(MultipartFileUploadStubController.class); + + @PostMapping("/stub/multipart") + @ResponseStatus(HttpStatus.OK) + public void uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + logger.info("Uploaded file: " + format(file)); + logger.info(" - text: [" + format(text) + "]"); + logger.info(" - text1: [" + format(text1) + "]"); + logger.info(" - text2: [" + format(text2) + "]"); + logger.info(" - upstream: [" + format(upstream) + "]"); + } + + private static String format(MultipartFile file) { + return file == null ? "" : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; + } + + private static String format(String str) { + return str == null ? "" : str; + } +} From 26f4ea1cd106d2335e176ee65bc1c72c4acd3521 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sat, 7 Dec 2019 09:08:35 -0500 Subject: [PATCH 42/99] BAEL-3559: Change server response to mimic an echo server --- .../MultipartFileUploadStubController.java | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java index cac1ece5df..28c35e8603 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java @@ -1,33 +1,58 @@ package com.baeldung.web.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.multipart.MultipartFile; @Controller public class MultipartFileUploadStubController { - - private static final Logger logger = LoggerFactory.getLogger(MultipartFileUploadStubController.class); @PostMapping("/stub/multipart") - @ResponseStatus(HttpStatus.OK) - public void uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { - logger.info("Uploaded file: " + format(file)); - logger.info(" - text: [" + format(text) + "]"); - logger.info(" - text1: [" + format(text1) + "]"); - logger.info(" - text2: [" + format(text2) + "]"); - logger.info(" - upstream: [" + format(upstream) + "]"); + public ResponseEntity uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + UploadResultResource result = new UploadResultResource(file, text, text1, text2, upstream); + return new ResponseEntity<>(result, HttpStatus.OK); } - private static String format(MultipartFile file) { - return file == null ? "" : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; - } - - private static String format(String str) { - return str == null ? "" : str; + public static class UploadResultResource { + + private final String file; + private final String text; + private final String text1; + private final String text2; + private final String upstream; + + public UploadResultResource(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + this.file = format(file); + this.text = text; + this.text1 = text1; + this.text2 = text2; + this.upstream = format(upstream); + } + + private static String format(MultipartFile file) { + return file == null ? null : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; + } + + public String getFile() { + return file; + } + + public String getText() { + return text; + } + + public String getText1() { + return text1; + } + + public String getText2() { + return text2; + } + + public String getUpstream() { + return upstream; + } } } From 35711d3639667a6d80625cc52c7914a276c00677 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Sat, 7 Dec 2019 18:12:55 +0200 Subject: [PATCH 43/99] [BAEL-19059] - Move new articles to java-dates-operations module --- core-java-modules/core-java-date-operations/README.md | 5 +++++ core-java-modules/core-java-date-operations/pom.xml | 1 + .../baeldung/offsetdatetime}/ConvertToOffsetDateTime.java | 2 +- .../AddSubtractDaysSkippingWeekendsUtils.java | 2 +- .../date/comparison/DateComparisonUtilsUnitTest.java | 6 +++--- .../java/com/baeldung/datetime/CalendarUtilsUnitTest.java | 7 ++----- .../java/com/baeldung/datetime/DateUtilsUnitTest.java | 6 ++---- .../offsetdatetime}/ConvertToOffsetDateTimeUnitTest.java | 8 ++++---- .../AddSubtractDaysSkippingWeekendsUtilsUnitTest.java | 3 ++- java-dates-2/README.md | 2 -- 10 files changed, 21 insertions(+), 21 deletions(-) rename {java-dates-2/src/main/java/com/baeldung/date/conversion => core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime}/ConvertToOffsetDateTime.java (92%) rename core-java-modules/core-java-date-operations/src/main/java/com/baeldung/{datetime => skipweekends}/AddSubtractDaysSkippingWeekendsUtils.java (96%) rename {java-dates-2/src/test/java/com/baeldung/date/conversion => core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime}/ConvertToOffsetDateTimeUnitTest.java (95%) rename core-java-modules/core-java-date-operations/src/test/java/com/baeldung/{datetime => skipweekends}/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java (89%) delete mode 100644 java-dates-2/README.md diff --git a/core-java-modules/core-java-date-operations/README.md b/core-java-modules/core-java-date-operations/README.md index 98616a32c3..24bb493dce 100644 --- a/core-java-modules/core-java-date-operations/README.md +++ b/core-java-modules/core-java-date-operations/README.md @@ -1,3 +1,8 @@ +## Core Date Operations +This module contains articles about date operations in Java. + ### Relevant Articles: - [Get the Current Date Prior to Java 8](https://www.baeldung.com/java-get-the-current-date-legacy) - [Skipping Weekends While Adding Days to LocalDate in Java 8](https://www.baeldung.com/java-localdate-add-days-skip-weekends) +- [Checking If Two Java Dates Are on the Same Day](https://www.baeldung.com/java-check-two-dates-on-same-day) +- [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) diff --git a/core-java-modules/core-java-date-operations/pom.xml b/core-java-modules/core-java-date-operations/pom.xml index 251d3f85a2..1614fa3cd7 100644 --- a/core-java-modules/core-java-date-operations/pom.xml +++ b/core-java-modules/core-java-date-operations/pom.xml @@ -5,6 +5,7 @@ 4.0.0 core-java-date-operations ${project.parent.version} + core-java-date-operations jar diff --git a/java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java similarity index 92% rename from java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java rename to core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java index 34914962f9..defd0a335e 100644 --- a/java-dates-2/src/main/java/com/baeldung/date/conversion/ConvertToOffsetDateTime.java +++ b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTime.java @@ -1,4 +1,4 @@ -package com.baeldung.date.conversion; +package com.baeldung.offsetdatetime; import java.time.OffsetDateTime; import java.time.ZoneOffset; diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java similarity index 96% rename from core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java rename to core-java-modules/core-java-date-operations/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java index bf32fdb79a..94adfa0c9d 100644 --- a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java +++ b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtils.java @@ -1,4 +1,4 @@ -package com.baeldung.datetime; +package com.baeldung.skipweekends; import java.time.DayOfWeek; import java.time.LocalDate; diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java index f02d97d73c..db55aadcca 100644 --- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/date/comparison/DateComparisonUtilsUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.date.comparison; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import org.junit.Test; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; -import org.junit.Test; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class DateComparisonUtilsUnitTest { diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java index 0060162ffb..8c9ed695d7 100644 --- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/CalendarUtilsUnitTest.java @@ -1,15 +1,12 @@ package com.baeldung.datetime; -import static org.junit.Assert.assertEquals; - import org.junit.Test; -import com.baeldung.datetime.CalendarUtils; -import com.baeldung.datetime.DateUtils; - import java.text.ParseException; import java.util.Date; +import static org.junit.Assert.assertEquals; + public class CalendarUtilsUnitTest { @Test diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java index 62a0fc0b4b..8711455265 100644 --- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/DateUtilsUnitTest.java @@ -1,14 +1,12 @@ package com.baeldung.datetime; -import static org.junit.Assert.assertEquals; - import org.junit.Test; -import com.baeldung.datetime.DateUtils; - import java.text.ParseException; import java.util.Date; +import static org.junit.Assert.assertEquals; + public class DateUtilsUnitTest { @Test diff --git a/java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java similarity index 95% rename from java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java rename to core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java index c927da00c8..a6fd6c03c2 100644 --- a/java-dates-2/src/test/java/com/baeldung/date/conversion/ConvertToOffsetDateTimeUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/offsetdatetime/ConvertToOffsetDateTimeUnitTest.java @@ -1,12 +1,12 @@ -package com.baeldung.date.conversion; +package com.baeldung.offsetdatetime; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import org.junit.Test; import java.time.OffsetDateTime; import java.util.Date; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class ConvertToOffsetDateTimeUnitTest { diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java similarity index 89% rename from core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java rename to core-java-modules/core-java-date-operations/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java index d60a0f4015..76bd9f4558 100644 --- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/skipweekends/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java @@ -1,7 +1,8 @@ -package com.baeldung.datetime; +package com.baeldung.skipweekends; import static org.junit.Assert.assertEquals; +import com.baeldung.skipweekends.AddSubtractDaysSkippingWeekendsUtils; import org.junit.Test; import java.time.LocalDate; diff --git a/java-dates-2/README.md b/java-dates-2/README.md deleted file mode 100644 index 6e88c1628b..0000000000 --- a/java-dates-2/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [Converting Java Date to OffsetDateTime](https://www.baeldung.com/java-convert-date-to-offsetdatetime) From 0efb132504dd3685da3958643be9e5fb9d4be210 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 7 Dec 2019 17:40:17 +0100 Subject: [PATCH 44/99] BAEL-2275: Fill the test. Rename package. --- .../DomainLayerApplication.java | 2 +- .../controller/OrderController.java | 10 ++-- .../request/AddProductRequest.java | 4 +- .../request/CreateOrderRequest.java | 4 +- .../response/CreateOrderResponse.java | 2 +- .../domain/DomainException.java | 2 +- .../domain/Order.java | 2 +- .../domain/OrderItem.java | 2 +- .../domain/OrderStatus.java | 2 +- .../domain/Product.java | 2 +- .../domain/repository/OrderRepository.java | 4 +- .../domain/service/DomainOrderService.java | 8 +-- .../domain/service/OrderService.java | 4 +- .../configuration/BeanConfiguration.java | 10 ++-- .../configuration/MongoDBConfiguration.java | 4 +- .../repository/MongoDbOrderRepository.java | 6 +-- .../repository/SpringDataOrderRepository.java | 4 +- .../MongoDbOrderRepositoryUnitTest.java | 25 --------- .../domain/OrderProvider.java | 2 +- .../domain/OrderUnitTest.java | 2 +- .../service/DomainOrderServiceUnitTest.java | 10 ++-- .../MongoDbOrderRepositoryUnitTest.java | 51 +++++++++++++++++++ 22 files changed, 94 insertions(+), 68 deletions(-) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/DomainLayerApplication.java (91%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/application/controller/OrderController.java (79%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/application/request/AddProductRequest.java (78%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/application/request/CreateOrderRequest.java (79%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/application/response/CreateOrderResponse.java (77%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/DomainException.java (72%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/Order.java (97%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/OrderItem.java (94%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/OrderStatus.java (52%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/Product.java (95%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/repository/OrderRepository.java (58%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/service/DomainOrderService.java (83%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/service/OrderService.java (67%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/infrastracture/configuration/BeanConfiguration.java (55%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/infrastracture/configuration/MongoDBConfiguration.java (55%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/infrastracture/repository/MongoDbOrderRepository.java (77%) rename ddd/src/main/java/com/baeldung/{ddd/layers => dddhexagonalspring}/infrastracture/repository/SpringDataOrderRepository.java (66%) delete mode 100644 ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java rename ddd/src/test/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/OrderProvider.java (89%) rename ddd/src/test/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/OrderUnitTest.java (97%) rename ddd/src/test/java/com/baeldung/{ddd/layers => dddhexagonalspring}/domain/service/DomainOrderServiceUnitTest.java (90%) create mode 100644 ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java similarity index 91% rename from ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java index 1a57311df8..988f96042b 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/DomainLayerApplication.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/DomainLayerApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers; +package com.baeldung.dddhexagonalspring; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/controller/OrderController.java similarity index 79% rename from ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/application/controller/OrderController.java index e3909013b7..80ba36d01b 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/controller/OrderController.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/controller/OrderController.java @@ -1,9 +1,9 @@ -package com.baeldung.ddd.layers.application.controller; +package com.baeldung.dddhexagonalspring.application.controller; -import com.baeldung.ddd.layers.application.request.AddProductRequest; -import com.baeldung.ddd.layers.application.request.CreateOrderRequest; -import com.baeldung.ddd.layers.application.response.CreateOrderResponse; -import com.baeldung.ddd.layers.domain.service.OrderService; +import com.baeldung.dddhexagonalspring.application.request.AddProductRequest; +import com.baeldung.dddhexagonalspring.application.request.CreateOrderRequest; +import com.baeldung.dddhexagonalspring.application.response.CreateOrderResponse; +import com.baeldung.dddhexagonalspring.domain.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java similarity index 78% rename from ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java index 18a09e3636..ec107d635b 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/AddProductRequest.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/AddProductRequest.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.application.request; +package com.baeldung.dddhexagonalspring.application.request; -import com.baeldung.ddd.layers.domain.Product; +import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java similarity index 79% rename from ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java index 198feaf0d2..8c51fbe479 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/request/CreateOrderRequest.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/request/CreateOrderRequest.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.application.request; +package com.baeldung.dddhexagonalspring.application.request; -import com.baeldung.ddd.layers.domain.Product; +import com.baeldung.dddhexagonalspring.domain.Product; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java similarity index 77% rename from ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java index 14cbc978e5..72ee1134c3 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/application/response/CreateOrderResponse.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/application/response/CreateOrderResponse.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.application.response; +package com.baeldung.dddhexagonalspring.application.response; import java.util.UUID; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java similarity index 72% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java index ca0dff4a69..7baef7bab6 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/DomainException.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/DomainException.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; class DomainException extends RuntimeException { DomainException(final String message) { diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java similarity index 97% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java index 4af8d13f8a..7d40007411 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Order.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Order.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; import java.math.BigDecimal; import java.util.ArrayList; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java similarity index 94% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java index 4ad26a0a3d..9debb02680 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderItem.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderItem.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; import java.math.BigDecimal; import java.util.Objects; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java similarity index 52% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java index f5d32374be..2ee5df3ab7 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/OrderStatus.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/OrderStatus.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; public enum OrderStatus { CREATED, COMPLETED diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java similarity index 95% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java index 31928fc0fd..e05b4afe62 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/Product.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/Product.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java similarity index 58% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java index 659aa39609..14b34e13f3 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/repository/OrderRepository.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/repository/OrderRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.domain.repository; +package com.baeldung.dddhexagonalspring.domain.repository; -import com.baeldung.ddd.layers.domain.Order; +import com.baeldung.dddhexagonalspring.domain.Order; import java.util.Optional; import java.util.UUID; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java similarity index 83% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java index e7793ee08d..4fb2377745 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/DomainOrderService.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderService.java @@ -1,8 +1,8 @@ -package com.baeldung.ddd.layers.domain.service; +package com.baeldung.dddhexagonalspring.domain.service; -import com.baeldung.ddd.layers.domain.Order; -import com.baeldung.ddd.layers.domain.Product; -import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import com.baeldung.dddhexagonalspring.domain.Order; +import com.baeldung.dddhexagonalspring.domain.Product; +import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository; import java.util.UUID; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java similarity index 67% rename from ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java index 48caf467aa..37297d74c4 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/domain/service/OrderService.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/domain/service/OrderService.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.domain.service; +package com.baeldung.dddhexagonalspring.domain.service; -import com.baeldung.ddd.layers.domain.Product; +import com.baeldung.dddhexagonalspring.domain.Product; import java.util.UUID; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java similarity index 55% rename from ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java index 68429f1fb8..4be5d84ba7 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/BeanConfiguration.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/BeanConfiguration.java @@ -1,9 +1,9 @@ -package com.baeldung.ddd.layers.infrastracture.configuration; +package com.baeldung.dddhexagonalspring.infrastracture.configuration; -import com.baeldung.ddd.layers.DomainLayerApplication; -import com.baeldung.ddd.layers.domain.repository.OrderRepository; -import com.baeldung.ddd.layers.domain.service.DomainOrderService; -import com.baeldung.ddd.layers.domain.service.OrderService; +import com.baeldung.dddhexagonalspring.DomainLayerApplication; +import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository; +import com.baeldung.dddhexagonalspring.domain.service.DomainOrderService; +import com.baeldung.dddhexagonalspring.domain.service.OrderService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java similarity index 55% rename from ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java index 5341b9fe95..fd76b2eb0e 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/configuration/MongoDBConfiguration.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/configuration/MongoDBConfiguration.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.infrastracture.configuration; +package com.baeldung.dddhexagonalspring.infrastracture.configuration; -import com.baeldung.ddd.layers.infrastracture.repository.SpringDataOrderRepository; +import com.baeldung.dddhexagonalspring.infrastracture.repository.SpringDataOrderRepository; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; @EnableMongoRepositories(basePackageClasses = SpringDataOrderRepository.class) diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepository.java similarity index 77% rename from ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepository.java index e7409e05db..3123ef3e2f 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepository.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepository.java @@ -1,7 +1,7 @@ -package com.baeldung.ddd.layers.infrastracture.repository; +package com.baeldung.dddhexagonalspring.infrastracture.repository; -import com.baeldung.ddd.layers.domain.Order; -import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import com.baeldung.dddhexagonalspring.domain.Order; +import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/SpringDataOrderRepository.java similarity index 66% rename from ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java rename to ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/SpringDataOrderRepository.java index d4fac2e454..0279a5ce4a 100644 --- a/ddd/src/main/java/com/baeldung/ddd/layers/infrastracture/repository/SpringDataOrderRepository.java +++ b/ddd/src/main/java/com/baeldung/dddhexagonalspring/infrastracture/repository/SpringDataOrderRepository.java @@ -1,6 +1,6 @@ -package com.baeldung.ddd.layers.infrastracture.repository; +package com.baeldung.dddhexagonalspring.infrastracture.repository; -import com.baeldung.ddd.layers.domain.Order; +import com.baeldung.dddhexagonalspring.domain.Order; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java b/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java deleted file mode 100644 index 1b4eac06be..0000000000 --- a/ddd/src/test/java/com/baeldung/ddd/layers/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.ddd.layers.infrastracture.repository; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class MongoDbOrderRepositoryUnitTest { - - private SpringDataOrderRepository springDataOrderRepository; - private MongoDbOrderRepository tested; - - @BeforeEach - void setUp(){ - - } - - @Test - void findById() { - } - - @Test - void save() { - } -} \ No newline at end of file diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java similarity index 89% rename from ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java rename to ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java index 1708aee942..c534713ca3 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderProvider.java +++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; import java.math.BigDecimal; import java.util.UUID; diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java similarity index 97% rename from ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java rename to ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java index 086624bf77..eceed999d8 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/OrderUnitTest.java +++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/OrderUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.ddd.layers.domain; +package com.baeldung.dddhexagonalspring.domain; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java similarity index 90% rename from ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java rename to ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java index 87a2c1beb0..797068a30a 100644 --- a/ddd/src/test/java/com/baeldung/ddd/layers/domain/service/DomainOrderServiceUnitTest.java +++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/domain/service/DomainOrderServiceUnitTest.java @@ -1,9 +1,9 @@ -package com.baeldung.ddd.layers.domain.service; +package com.baeldung.dddhexagonalspring.domain.service; -import com.baeldung.ddd.layers.domain.Order; -import com.baeldung.ddd.layers.domain.OrderProvider; -import com.baeldung.ddd.layers.domain.Product; -import com.baeldung.ddd.layers.domain.repository.OrderRepository; +import com.baeldung.dddhexagonalspring.domain.Order; +import com.baeldung.dddhexagonalspring.domain.OrderProvider; +import com.baeldung.dddhexagonalspring.domain.Product; +import com.baeldung.dddhexagonalspring.domain.repository.OrderRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; diff --git a/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java new file mode 100644 index 0000000000..8f7e8260a3 --- /dev/null +++ b/ddd/src/test/java/com/baeldung/dddhexagonalspring/infrastracture/repository/MongoDbOrderRepositoryUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.dddhexagonalspring.infrastracture.repository; + +import com.baeldung.dddhexagonalspring.domain.Order; +import com.baeldung.dddhexagonalspring.domain.Product; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class MongoDbOrderRepositoryUnitTest { + + private SpringDataOrderRepository springDataOrderRepository; + private MongoDbOrderRepository tested; + + @BeforeEach + void setUp(){ + springDataOrderRepository = mock(SpringDataOrderRepository.class); + + tested = new MongoDbOrderRepository(springDataOrderRepository); + } + + @Test + void shouldFindById_thenReturnOrder() { + final UUID id = UUID.randomUUID(); + final Order order = createOrder(id); + when(springDataOrderRepository.findById(id)).thenReturn(Optional.of(order)); + + final Optional result = tested.findById(id); + + assertEquals(order, result.get()); + } + + @Test + void shouldSaveOrder_viaSpringDataOrderRepository() { + final UUID id = UUID.randomUUID(); + final Order order = createOrder(id); + + tested.save(order); + + verify(springDataOrderRepository).save(order); + } + + private Order createOrder(UUID id) { + return new Order(id, new Product(UUID.randomUUID(), BigDecimal.TEN, "product")); + } +} \ No newline at end of file From 58837c6350718b5b768b1855471a980ab4554439 Mon Sep 17 00:00:00 2001 From: Mona Mohamadinia Date: Sat, 7 Dec 2019 22:32:13 +0330 Subject: [PATCH 45/99] Refactoring to a better package name --- .../baeldung/{hook => shutdownhook}/ShutdownHookUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-jvm/src/test/java/com/baeldung/{hook => shutdownhook}/ShutdownHookUnitTest.java (97%) diff --git a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/shutdownhook/ShutdownHookUnitTest.java similarity index 97% rename from core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java rename to core-java-modules/core-java-jvm/src/test/java/com/baeldung/shutdownhook/ShutdownHookUnitTest.java index 0059cb1faa..0f97a2eb09 100644 --- a/core-java-modules/core-java-jvm/src/test/java/com/baeldung/hook/ShutdownHookUnitTest.java +++ b/core-java-modules/core-java-jvm/src/test/java/com/baeldung/shutdownhook/ShutdownHookUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.hook; +package com.baeldung.shutdownhook; import org.junit.Test; From b00e9f81ae19f536118c924472a3e33c28269516 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 7 Dec 2019 21:50:20 +0100 Subject: [PATCH 46/99] BAEL-2275: Move docker directory to test resources. Add README.md for it. --- ddd/docker/.env | 1 - .../resources/com/baeldung/dddhexagonalspring/README.md | 7 +++++++ .../com/baeldung/dddhexagonalspring}/docker-compose.yml | 2 +- .../com/baeldung/dddhexagonalspring}/mongo-init.js | 0 4 files changed, 8 insertions(+), 2 deletions(-) delete mode 100644 ddd/docker/.env create mode 100644 ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md rename ddd/{docker => src/test/resources/com/baeldung/dddhexagonalspring}/docker-compose.yml (88%) rename ddd/{docker => src/test/resources/com/baeldung/dddhexagonalspring}/mongo-init.js (100%) diff --git a/ddd/docker/.env b/ddd/docker/.env deleted file mode 100644 index 99f7e8b8d4..0000000000 --- a/ddd/docker/.env +++ /dev/null @@ -1 +0,0 @@ -ORDER_DOCKER_MONGODB_PORT=27017 \ No newline at end of file diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md new file mode 100644 index 0000000000..e8cf5c8e37 --- /dev/null +++ b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md @@ -0,0 +1,7 @@ +## Setup DDD Hexagonal Spring Application + +To run this project, follow these steps: + +* Launch the Spring Boot Application (DomainLayerApplication). +* Run the application database by executing `docker-compose up` in this directory. +* By default, application will connect to this database (configuration in *ddd-layers.properties*) \ No newline at end of file diff --git a/ddd/docker/docker-compose.yml b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml similarity index 88% rename from ddd/docker/docker-compose.yml rename to ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml index eb27e56061..d85ddf4a0e 100644 --- a/ddd/docker/docker-compose.yml +++ b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/docker-compose.yml @@ -5,7 +5,7 @@ services: image: mongo:3.4.13 restart: always ports: - - ${ORDER_DOCKER_MONGODB_PORT}:27017 + - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin diff --git a/ddd/docker/mongo-init.js b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js similarity index 100% rename from ddd/docker/mongo-init.js rename to ddd/src/test/resources/com/baeldung/dddhexagonalspring/mongo-init.js From 53075a11dce6a4fbe68278529e09285beb3fde8e Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 8 Dec 2019 11:11:46 +0100 Subject: [PATCH 47/99] BAEL-2275: Fix order in README --- .../test/resources/com/baeldung/dddhexagonalspring/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md index e8cf5c8e37..e0337498fc 100644 --- a/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md +++ b/ddd/src/test/resources/com/baeldung/dddhexagonalspring/README.md @@ -2,6 +2,6 @@ To run this project, follow these steps: -* Launch the Spring Boot Application (DomainLayerApplication). * Run the application database by executing `docker-compose up` in this directory. +* Launch the Spring Boot Application (DomainLayerApplication). * By default, application will connect to this database (configuration in *ddd-layers.properties*) \ No newline at end of file From 28c88367086d25cd07622e22ca6bcb4137740f39 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 8 Dec 2019 10:28:27 +0000 Subject: [PATCH 48/99] Code samples for Java Switch Statement --- core-java-modules/core-java-13/pom.xml | 58 ++++++++++++++ .../SwitchExpressionsUnitTest.java | 76 +++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 core-java-modules/core-java-13/pom.xml create mode 100644 core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java diff --git a/core-java-modules/core-java-13/pom.xml b/core-java-modules/core-java-13/pom.xml new file mode 100644 index 0000000000..1f215ae6b0 --- /dev/null +++ b/core-java-modules/core-java-13/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + com.baeldung + core-java-13 + 0.1.0-SNAPSHOT + core-java-13 + jar + http://maven.apache.org + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source.version} + ${maven.compiler.target.version} + 13 + --enable-preview + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + --enable-preview + + + + + + + 13 + 13 + 3.6.1 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java new file mode 100644 index 0000000000..00f42813b4 --- /dev/null +++ b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java @@ -0,0 +1,76 @@ +package com.baeldung.switchExpression; + +import static java.time.Month.AUGUST; +import static java.time.Month.JUNE; + +import static org.junit.Assert.assertEquals; + +import java.time.Month; +import java.util.function.Function; + +import org.junit.Test; + +public class SwitchExpressionsUnitTest { + + @Test + @SuppressWarnings ("preview") + public void switchExpression() { + + var month = JUNE; + + var result = switch (month) { + case JANUARY, JUNE, JULY -> 3; + case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1; + case MARCH, MAY, APRIL -> 2; + default -> 0; + }; + + assertEquals(result, 3); + } + + @Test + @SuppressWarnings ("preview") + public void switchExpressionWithYieldKeyword() { + var month = AUGUST; + + var result = switch (month) { + case JANUARY, JUNE, JULY -> 3; + case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1; + case MARCH, MAY, APRIL, AUGUST -> { + int monthLength = month.toString().length(); + yield monthLength * 4; + } + default -> 0; + }; + + assertEquals(24, result); + } + + @Test + @SuppressWarnings ("preview") + public void switchStatementWithReturnInsideBlock() { + + Function func = (month) -> { + switch (month) { + case JANUARY, JUNE, JULY -> { return 3; } + default -> { return 0; } + } + }; + + assertEquals(Integer.valueOf(3), func.apply(Month.JANUARY)); + } + + @Test + @SuppressWarnings ("preview") + public void switchExpressionWithAllCasesCovered() { + var month = AUGUST; + + var result = switch (month) { + case JANUARY, JUNE, JULY -> 3; + case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1; + case MARCH, MAY, APRIL, AUGUST -> 2; + }; + + assertEquals(result, 2); + } +} From 323aed64b60eaac371a541b47def7a36d6b4456e Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 8 Dec 2019 10:34:46 +0000 Subject: [PATCH 49/99] Removing unnecessary files --- java-strings-3/pom.xml | 161 ------------------ .../StringDiffBenchmarkUnitTest.java | 73 -------- .../stringdiff/StringDiffUnitTest.java | 39 ----- 3 files changed, 273 deletions(-) delete mode 100644 java-strings-3/pom.xml delete mode 100644 java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java delete mode 100644 java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java diff --git a/java-strings-3/pom.xml b/java-strings-3/pom.xml deleted file mode 100644 index 4589780c15..0000000000 --- a/java-strings-3/pom.xml +++ /dev/null @@ -1,161 +0,0 @@ - - 4.0.0 - java-strings-3 - 0.1.0-SNAPSHOT - jar - java-strings-3 - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh-core.version} - - - com.ibm.icu - icu4j - ${icu4j.version} - - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-io - commons-io - ${commons-io.version} - - - commons-codec - commons-codec - ${commons-codec.version} - - - junit - junit - ${junit.version} - test - - - org.hamcrest - hamcrest-library - ${org.hamcrest.version} - test - - - org.assertj - assertj-core - ${assertj.version} - test - - - org.bitbucket.cowwoc - diff-match-patch - 1.2 - test - - - - - org.passay - passay - ${passay.version} - - - org.apache.commons - commons-text - ${commons-text.version} - - - com.vdurmont - emoji-java - ${emoji-java.version} - - - org.ahocorasick - ahocorasick - ${ahocorasick.version} - - - javax.validation - validation-api - ${validation-api.version} - - - org.hibernate.validator - hibernate-validator - ${hibernate-validator.version} - - - javax.el - javax.el-api - ${javax.el-api.version} - - - org.glassfish.web - javax.el - ${javax.el.version} - - - - - java-strings-3 - - - src/main/resources - true - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - -parameters - - - - - - - 3.8.1 - 1.10 - 1.3.1 - - 3.6.1 - 4.0.0 - 0.4.0 - 61.1 - 28.0-jre - 1.4 - 2.0.0.Final - 6.0.2.Final - 3.0.0 - 2.2.6 - - - \ No newline at end of file diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java deleted file mode 100644 index 20e87a1f4e..0000000000 --- a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.baeldung.stringdiff; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -@State(Scope.Benchmark) -public class StringDiffBenchmarkUnitTest { - - private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); - - private List inputs = randomizeInputs(10000); - - public static void main(String[] args) throws RunnerException { - Options opts = new OptionsBuilder().include(".*") - .warmupIterations(1) - .measurementIterations(50) - .jvmArgs("-Xms2g", "-Xmx2g") - .shouldDoGC(true) - .forks(1) - .build(); - - new Runner(opts).run(); - } - - @Benchmark - public int diffMatchPatch() { - for (int i = 0; i < inputs.size() - 1; i++) { - diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); - } - return inputs.size(); - } - - @Benchmark - public int stringUtils() { - for (int i = 0; i < inputs.size() - 1; i++) { - StringUtils.difference(inputs.get(i), inputs.get(i + 1)); - } - return inputs.size(); - } - - /** - * Creates a list of a given size, containing 30 character long strings, - * each starting with a static prefix of 10 characters and followed by - * a random 20 character suffix - * - * @return a {@link List} of randomised strings - */ - private List randomizeInputs(int size) { - String staticPart = "ABCDEF1234"; - List inputs = new ArrayList<>(); - for (int i = 0; i < size; i++) { - inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20)); - } - return inputs; - } -} diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java deleted file mode 100644 index 94b7deb64d..0000000000 --- a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.stringdiff; - -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; - -import org.apache.commons.lang3.StringUtils; -import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; -import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Operation; -import org.junit.Test; - -public class StringDiffUnitTest { - - private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); - - // Test samples - private final String text1 = "ABCDELMN"; - private final String text2 = "ABCFGLMN"; - - @Test - public void givenTwoStrings_whenDiffMatchPatch_thenReturnCorrectDiff() { - assertThat(diffMatchPatch.diffMain(text1, text2, false), containsInAnyOrder( - new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), - new DiffMatchPatch.Diff(Operation.DELETE, "DE"), - new DiffMatchPatch.Diff(Operation.INSERT, "FG"), - new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); - assertThat(diffMatchPatch.diffMain(text2, text1, false), containsInAnyOrder( - new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), - new DiffMatchPatch.Diff(Operation.INSERT, "DE"), - new DiffMatchPatch.Diff(Operation.DELETE, "FG"), - new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); - } - - @Test - public void givenTwoStrings_whenStringUtilsDifference_thenReturnCorrectDiff() { - assertThat(StringUtils.difference(text1, text2), is("FGLMN")); - assertThat(StringUtils.difference(text2, text1), is("DELMN")); - } -} From 9f9362d458025c9fd88342e574fc044d1aaef2a2 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sun, 8 Dec 2019 10:42:40 +0000 Subject: [PATCH 50/99] [BAEL-18367] Moving articles from rest-spring-** pt 4 --- pom.xml | 4 +- spring-rest-http/README.md | 14 + spring-rest-http/pom.xml | 52 ++++ .../java/com/baeldung/config/MvcConfig.java | 51 ++++ .../controllers/DeferredResultController.java | 0 .../BarMappingExamplesController.java | 0 .../BazzNewMappingsExampleController.java | 0 .../FooMappingExamplesController.java | 0 .../controller/status/ExampleController.java | 0 .../controller/status/ForbiddenException.java | 0 .../main/java/com/baeldung/web/dto/Bazz.java | 22 ++ .../main/java/com/baeldung/web/dto/Foo.java | 45 ++++ ...BazzNewMappingsExampleIntegrationTest.java | 0 .../ResponseHeaderLiveTest.java | 0 .../SpringUriBuilderIntegrationTest.java | 0 .../ExampleControllerIntegrationTest.java | 0 spring-rest-simple/README.md | 4 +- spring-rest/.gitignore | 13 - spring-rest/README.md | 17 -- spring-rest/pom.xml | 254 ------------------ .../baeldung/controllers/ViewController.java | 14 - .../src/main/resources/application.properties | 2 - .../com/baeldung/produceimage/data.txt | 1 - .../com/baeldung/produceimage/image.jpg | Bin 6170 -> 0 bytes .../baeldung/produceimage/images/favicon.ico | Bin 15086 -> 0 bytes spring-rest/src/main/resources/logback.xml | 23 -- .../pacts/test_consumer-test_provider.json | 61 ----- spring-rest/src/test/resources/.gitignore | 13 - .../cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 | 24 -- .../cache/2d9345a30d2cc31bb3091d70a8ef6c18.1 | 39 --- .../cache/4b217e04ba52215f3a6b64d28f6729c6.0 | 13 - .../cache/4b217e04ba52215f3a6b64d28f6729c6.1 | 7 - spring-rest/src/test/resources/cache/journal | 75 ------ spring-rest/src/test/resources/test.txt | 1 - spring-resttemplate/README.md | 3 + 35 files changed, 190 insertions(+), 562 deletions(-) create mode 100644 spring-rest-http/README.md create mode 100644 spring-rest-http/pom.xml create mode 100644 spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java rename {spring-rest => spring-rest-http}/src/main/java/com/baeldung/controllers/DeferredResultController.java (100%) rename {spring-rest-simple => spring-rest-http}/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java (100%) rename {spring-rest-simple => spring-rest-http}/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java (100%) rename {spring-rest-simple => spring-rest-http}/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java (100%) rename {spring-rest-simple => spring-rest-http}/src/main/java/com/baeldung/web/controller/status/ExampleController.java (100%) rename {spring-rest-simple => spring-rest-http}/src/main/java/com/baeldung/web/controller/status/ForbiddenException.java (100%) create mode 100644 spring-rest-http/src/main/java/com/baeldung/web/dto/Bazz.java create mode 100644 spring-rest-http/src/main/java/com/baeldung/web/dto/Foo.java rename {spring-rest-simple => spring-rest-http}/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java (100%) rename {spring-rest => spring-rest-http}/src/test/java/com/baeldung/responseheaders/ResponseHeaderLiveTest.java (100%) rename {spring-rest => spring-rest-http}/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java (100%) rename {spring-rest-simple => spring-rest-http}/src/test/java/com/baeldung/web/controller/status/ExampleControllerIntegrationTest.java (100%) delete mode 100644 spring-rest/.gitignore delete mode 100644 spring-rest/README.md delete mode 100644 spring-rest/pom.xml delete mode 100644 spring-rest/src/main/java/com/baeldung/controllers/ViewController.java delete mode 100644 spring-rest/src/main/resources/application.properties delete mode 100644 spring-rest/src/main/resources/com/baeldung/produceimage/data.txt delete mode 100644 spring-rest/src/main/resources/com/baeldung/produceimage/image.jpg delete mode 100644 spring-rest/src/main/resources/com/baeldung/produceimage/images/favicon.ico delete mode 100644 spring-rest/src/main/resources/logback.xml delete mode 100644 spring-rest/src/main/resources/pacts/test_consumer-test_provider.json delete mode 100644 spring-rest/src/test/resources/.gitignore delete mode 100644 spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 delete mode 100644 spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.1 delete mode 100644 spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 delete mode 100644 spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.1 delete mode 100644 spring-rest/src/test/resources/cache/journal delete mode 100644 spring-rest/src/test/resources/test.txt diff --git a/pom.xml b/pom.xml index f29fe4f248..db7ec25a5c 100644 --- a/pom.xml +++ b/pom.xml @@ -805,7 +805,7 @@ spring-reactive-kotlin spring-reactor spring-remoting - spring-rest + spring-rest-http spring-rest-angular spring-rest-compress spring-rest-testing @@ -1411,7 +1411,7 @@ spring-reactive-kotlin spring-reactor spring-remoting - spring-rest + spring-rest-http spring-rest-angular spring-rest-compress spring-rest-testing diff --git a/spring-rest-http/README.md b/spring-rest-http/README.md new file mode 100644 index 0000000000..51f5ed4000 --- /dev/null +++ b/spring-rest-http/README.md @@ -0,0 +1,14 @@ +## Spring REST HTTP + +This module contains articles about HTTP in REST APIs with Spring + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) - The tests contained for this article rely on the sample application within the [spring-resttemplate](/spring-resttemplate) module +- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) +- [Spring @RequestMapping](https://www.baeldung.com/spring-requestmapping) +- [Guide to DeferredResult in Spring](https://www.baeldung.com/spring-deferred-result) \ No newline at end of file diff --git a/spring-rest-http/pom.xml b/spring-rest-http/pom.xml new file mode 100644 index 0000000000..c5c6b8d44c --- /dev/null +++ b/spring-rest-http/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + spring-rest-http + 0.1-SNAPSHOT + spring-rest-http + war + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework + spring-oxm + + + com.thoughtworks.xstream + xstream + ${xstream.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-devtools + + + org.springframework.boot + spring-boot-starter-test + + + + + + + 1.4.9 + + + diff --git a/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java b/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java new file mode 100644 index 0000000000..ea2c536757 --- /dev/null +++ b/spring-rest-http/src/main/java/com/baeldung/config/MvcConfig.java @@ -0,0 +1,51 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; + +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; + +import org.springframework.oxm.xstream.XStreamMarshaller; +import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.text.SimpleDateFormat; +import java.util.List; + +/* + * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml + */ +@Configuration +@EnableWebMvc +@ComponentScan({ "com.baeldung.web", "com.baeldung.requestmapping" }) +public class MvcConfig implements WebMvcConfigurer { + + public MvcConfig() { + super(); + } + + // + + @Override + public void configureMessageConverters(final List> messageConverters) { + final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + builder.indentOutput(true) + .dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); + + } + + + @Override + public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { + configurer.defaultContentType(MediaType.APPLICATION_JSON); + } + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**"); + } +} diff --git a/spring-rest/src/main/java/com/baeldung/controllers/DeferredResultController.java b/spring-rest-http/src/main/java/com/baeldung/controllers/DeferredResultController.java similarity index 100% rename from spring-rest/src/main/java/com/baeldung/controllers/DeferredResultController.java rename to spring-rest-http/src/main/java/com/baeldung/controllers/DeferredResultController.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java b/spring-rest-http/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java similarity index 100% rename from spring-rest-simple/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java rename to spring-rest-http/src/main/java/com/baeldung/requestmapping/BarMappingExamplesController.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java b/spring-rest-http/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java similarity index 100% rename from spring-rest-simple/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java rename to spring-rest-http/src/main/java/com/baeldung/requestmapping/BazzNewMappingsExampleController.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java b/spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java similarity index 100% rename from spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java rename to spring-rest-http/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/status/ExampleController.java b/spring-rest-http/src/main/java/com/baeldung/web/controller/status/ExampleController.java similarity index 100% rename from spring-rest-simple/src/main/java/com/baeldung/web/controller/status/ExampleController.java rename to spring-rest-http/src/main/java/com/baeldung/web/controller/status/ExampleController.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/status/ForbiddenException.java b/spring-rest-http/src/main/java/com/baeldung/web/controller/status/ForbiddenException.java similarity index 100% rename from spring-rest-simple/src/main/java/com/baeldung/web/controller/status/ForbiddenException.java rename to spring-rest-http/src/main/java/com/baeldung/web/controller/status/ForbiddenException.java diff --git a/spring-rest-http/src/main/java/com/baeldung/web/dto/Bazz.java b/spring-rest-http/src/main/java/com/baeldung/web/dto/Bazz.java new file mode 100644 index 0000000000..861b4009b5 --- /dev/null +++ b/spring-rest-http/src/main/java/com/baeldung/web/dto/Bazz.java @@ -0,0 +1,22 @@ +package com.baeldung.web.dto; + +public class Bazz { + + + public String id; + public String name; + + public Bazz(String id){ + this.id = id; + } + public Bazz(String id, String name) { + this.id = id; + this.name = name; + } + + @Override + public String toString() { + return "Bazz [id=" + id + ", name=" + name + "]"; + } + +} diff --git a/spring-rest-http/src/main/java/com/baeldung/web/dto/Foo.java b/spring-rest-http/src/main/java/com/baeldung/web/dto/Foo.java new file mode 100644 index 0000000000..5a54539927 --- /dev/null +++ b/spring-rest-http/src/main/java/com/baeldung/web/dto/Foo.java @@ -0,0 +1,45 @@ +package com.baeldung.web.dto; + +import com.thoughtworks.xstream.annotations.XStreamAlias; + +@XStreamAlias("Foo") +public class Foo { + private long id; + private String name; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + public Foo(final long id, final String name) { + super(); + + this.id = id; + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java b/spring-rest-http/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java similarity index 100% rename from spring-rest-simple/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java rename to spring-rest-http/src/test/java/com/baeldung/requestmapping/BazzNewMappingsExampleIntegrationTest.java diff --git a/spring-rest/src/test/java/com/baeldung/responseheaders/ResponseHeaderLiveTest.java b/spring-rest-http/src/test/java/com/baeldung/responseheaders/ResponseHeaderLiveTest.java similarity index 100% rename from spring-rest/src/test/java/com/baeldung/responseheaders/ResponseHeaderLiveTest.java rename to spring-rest-http/src/test/java/com/baeldung/responseheaders/ResponseHeaderLiveTest.java diff --git a/spring-rest/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java b/spring-rest-http/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java similarity index 100% rename from spring-rest/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java rename to spring-rest-http/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/controller/status/ExampleControllerIntegrationTest.java b/spring-rest-http/src/test/java/com/baeldung/web/controller/status/ExampleControllerIntegrationTest.java similarity index 100% rename from spring-rest-simple/src/test/java/com/baeldung/web/controller/status/ExampleControllerIntegrationTest.java rename to spring-rest-http/src/test/java/com/baeldung/web/controller/status/ExampleControllerIntegrationTest.java diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md index 5e92865cfa..1ceb83b7a7 100644 --- a/spring-rest-simple/README.md +++ b/spring-rest-simple/README.md @@ -4,12 +4,10 @@ This module contains articles about REST APIs in Spring ## Relevant articles: -- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) -- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Spring RequestMapping](https://www.baeldung.com/spring-requestmapping) - [Spring and Apache FileUpload](https://www.baeldung.com/spring-apache-file-upload) - [Test a REST API with curl](https://www.baeldung.com/curl-rest) - [Best Practices for REST API Error Handling](https://www.baeldung.com/rest-api-error-handling-best-practices) +- [Binary Data Formats in a Spring REST API](https://www.baeldung.com/spring-rest-api-with-binary-data-formats) ### NOTE: diff --git a/spring-rest/.gitignore b/spring-rest/.gitignore deleted file mode 100644 index 2661c0de1e..0000000000 --- a/spring-rest/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/spring-boot-runtime/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/spring-rest/README.md b/spring-rest/README.md deleted file mode 100644 index 3ea9361169..0000000000 --- a/spring-rest/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## Spring REST - -This module contains articles about REST APIs with Spring - -### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles: -- [Spring @RequestMapping](https://www.baeldung.com/spring-requestmapping) -- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Binary Data Formats in a Spring REST API](https://www.baeldung.com/spring-rest-api-with-binary-data-formats) -- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) -- [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) -- [HTTP PUT vs HTTP PATCH in a REST API](https://www.baeldung.com/http-put-patch-difference-spring) -- [Guide to DeferredResult in Spring](https://www.baeldung.com/spring-deferred-result) -- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) -- [Download an Image or a File with Spring MVC](https://www.baeldung.com/spring-controller-return-image-file) diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml deleted file mode 100644 index 0c3e5f399f..0000000000 --- a/spring-rest/pom.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - 4.0.0 - spring-rest - 0.1-SNAPSHOT - spring-rest - war - - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-devtools - - - org.springframework.boot - spring-boot-starter-test - - - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - org.springframework - spring-webmvc - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - - - javax.servlet - javax.servlet-api - provided - - - - javax.servlet - jstl - runtime - - - - - com.fasterxml.jackson.core - jackson-databind - - - - com.fasterxml.jackson.dataformat - jackson-dataformat-xml - - - - - com.google.guava - guava - ${guava.version} - - - org.apache.commons - commons-lang3 - - - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - org.springframework - spring-test - - - - - com.google.protobuf - protobuf-java - ${protobuf-java.version} - - - com.googlecode.protobuf-java-format - protobuf-java-format - ${protobuf-java-format.version} - - - com.esotericsoftware - kryo - ${kryo.version} - - - com.jayway.jsonpath - json-path - - - - - commons-io - commons-io - ${commons-io.version} - - - - io.rest-assured - rest-assured - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - - - - spring-rest - - - src/main/resources - true - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-war-plugin - - - - - - - - live - - - - org.codehaus.cargo - cargo-maven2-plugin - - - start-server - pre-integration-test - - start - - - - stop-server - post-integration-test - - stop - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - none - - - **/*LiveTest.java - - - cargo - - - - - - - - - - - - - 1.3.2 - 4.0.0 - 1.4 - 3.1.0 - - - 20.0 - - - 1.6.0 - 3.0.4 - - false - - 2.2.0 - 3.5.11 - 3.1.0 - 4.5.2 - com.baeldung.sampleapp.config.MainApplication - - - diff --git a/spring-rest/src/main/java/com/baeldung/controllers/ViewController.java b/spring-rest/src/main/java/com/baeldung/controllers/ViewController.java deleted file mode 100644 index 8eab0ce6da..0000000000 --- a/spring-rest/src/main/java/com/baeldung/controllers/ViewController.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.controllers; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; - -@Controller -public class ViewController { - - @GetMapping("/") - public String welcome() { - return "index"; - } - -} diff --git a/spring-rest/src/main/resources/application.properties b/spring-rest/src/main/resources/application.properties deleted file mode 100644 index dd7e4e2f2d..0000000000 --- a/spring-rest/src/main/resources/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -server.port= 8082 -server.servlet.context-path=/spring-rest \ No newline at end of file diff --git a/spring-rest/src/main/resources/com/baeldung/produceimage/data.txt b/spring-rest/src/main/resources/com/baeldung/produceimage/data.txt deleted file mode 100644 index 3cd18170c0..0000000000 --- a/spring-rest/src/main/resources/com/baeldung/produceimage/data.txt +++ /dev/null @@ -1 +0,0 @@ -This is a sample file containing text data \ No newline at end of file diff --git a/spring-rest/src/main/resources/com/baeldung/produceimage/image.jpg b/spring-rest/src/main/resources/com/baeldung/produceimage/image.jpg deleted file mode 100644 index 0262656a33a02978a6c4a4754856801a839fd597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6170 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 diff --git a/spring-rest/src/main/resources/com/baeldung/produceimage/images/favicon.ico b/spring-rest/src/main/resources/com/baeldung/produceimage/images/favicon.ico deleted file mode 100644 index 64105ac11c6186e380a724416ceb77ab5c263fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 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 diff --git a/spring-rest/src/main/resources/logback.xml b/spring-rest/src/main/resources/logback.xml deleted file mode 100644 index 9f48d36486..0000000000 --- a/spring-rest/src/main/resources/logback.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json b/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json deleted file mode 100644 index c8082798f4..0000000000 --- a/spring-rest/src/main/resources/pacts/test_consumer-test_provider.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "provider": { - "name": "test_provider" - }, - "consumer": { - "name": "test_consumer" - }, - "interactions": [ - { - "description": "GET REQUEST", - "request": { - "method": "GET", - "path": "/pact" - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/json" - }, - "body": { - "condition": true, - "name": "tom" - } - }, - "providerStates": [ - { - "name": "test GET" - } - ] - }, - { - "description": "POST REQUEST", - "request": { - "method": "POST", - "path": "/pact", - "headers": { - "Content-Type": "application/json" - }, - "body": { - "name": "Michael" - } - }, - "response": { - "status": 201 - }, - "providerStates": [ - { - "name": "test POST" - } - ] - } - ], - "metadata": { - "pact-specification": { - "version": "3.0.0" - }, - "pact-jvm": { - "version": "3.5.0" - } - } -} \ No newline at end of file diff --git a/spring-rest/src/test/resources/.gitignore b/spring-rest/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/spring-rest/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.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/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 deleted file mode 100644 index e6cfcabe71..0000000000 --- a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 +++ /dev/null @@ -1,24 +0,0 @@ -https://publicobject.com/helloworld.txt -GET -0 -HTTP/1.1 200 OK -10 -Content-Type: text/plain -Content-Length: 1759 -Connection: keep-alive -Accept-Ranges: bytes -Server: nginx/1.10.0 (Ubuntu) -Date: Sat, 08 Dec 2018 13:02:07 GMT -Last-Modified: Tue, 27 May 2014 02:35:47 GMT -ETag: "5383fa03-6df" -OkHttp-Sent-Millis: 1489054646765 -OkHttp-Received-Millis: 1489054646966 - -TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 -4 -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 -0 -TLSv1.2 diff --git a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.1 b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.1 deleted file mode 100644 index 83db2312f0..0000000000 --- a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.1 +++ /dev/null @@ -1,39 +0,0 @@ - - \\ // - \\ .ooo. // - .@@@@@@@@@. - :@@@@@@@@@@@@@: - :@@. '@@@@@' .@@: - @@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@ - - :@@ :@@@@@@@@@@@@@@@@@. @@: - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@ '@@@@@@@@@@@@@@@@@, @@@ - @@@@@@@@@@@@@@@@@ - '@@@@@@@@@@@@@@@' - @@@@ @@@@ - @@@@ @@@@ - @@@@ @@@@ - '@@' '@@' - - :@@@. - .@@@@@@@: +@@ `@@ @@` @@ @@ - .@@@@'@@@@: +@@ `@@ @@` @@ @@ - @@@ @@@ +@@ `@@ @@` @@ @@ - .@@ @@: +@@ @@@ `@@ @@` @@@@@@ @@@@@@ @@;@@@@@ - @@@ @@@ +@@ @@@ `@@ @@` @@@@@@ @@@@@@ @@@@@@@@@ - @@@ @@@ +@@ @@@ `@@@@@@@@@@` @@ @@ @@@ :@@ - @@@ @@@ +@@@@@ `@@@@@@@@@@` @@ @@ @@# @@+ - @@@ @@@ +@@@@@+ `@@ @@` @@ @@ @@: @@# - @@: .@@` +@@@+@@ `@@ @@` @@ @@ @@# @@+ - @@@. .@@@ +@@ @@@ `@@ @@` @@ @@ @@@ ,@@ - @@@@@@@@@ +@@ @@@ `@@ @@` @@@@ @@@@ @@@@#@@@@ - @@@@@@@ +@@ #@@ `@@ @@` @@@@: @@@@: @@'@@@@@ - @@: - @@: - @@: diff --git a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 deleted file mode 100644 index 85fc22d658..0000000000 --- a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 +++ /dev/null @@ -1,13 +0,0 @@ -http://publicobject.com/helloworld.txt -GET -0 -HTTP/1.1 301 Moved Permanently -8 -Server: nginx/1.10.0 (Ubuntu) -Date: Sat, 08 Dec 2018 13:02:04 GMT -Content-Type: text/html -Content-Length: 194 -Connection: keep-alive -Location: https://publicobject.com/helloworld.txt -OkHttp-Sent-Millis: 1544274128028 -OkHttp-Received-Millis: 1544274128386 diff --git a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.1 b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.1 deleted file mode 100644 index acf72eabe3..0000000000 --- a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.1 +++ /dev/null @@ -1,7 +0,0 @@ - -301 Moved Permanently - -

301 Moved Permanently

-
nginx/1.10.0 (Ubuntu)
- - diff --git a/spring-rest/src/test/resources/cache/journal b/spring-rest/src/test/resources/cache/journal deleted file mode 100644 index a139399103..0000000000 --- a/spring-rest/src/test/resources/cache/journal +++ /dev/null @@ -1,75 +0,0 @@ -libcore.io.DiskLruCache -1 -201105 -2 - -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 -CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 -CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 -CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 -READ 4b217e04ba52215f3a6b64d28f6729c6 -DIRTY 4b217e04ba52215f3a6b64d28f6729c6 -CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 -READ 2d9345a30d2cc31bb3091d70a8ef6c18 -DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 -CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 diff --git a/spring-rest/src/test/resources/test.txt b/spring-rest/src/test/resources/test.txt deleted file mode 100644 index 95d09f2b10..0000000000 --- a/spring-rest/src/test/resources/test.txt +++ /dev/null @@ -1 +0,0 @@ -hello world \ No newline at end of file diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index aee02416f4..eef85792ce 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -17,6 +17,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Uploading MultipartFile with Spring RestTemplate](https://www.baeldung.com/spring-rest-template-multipart-upload) - [Get and Post Lists of Objects with RestTemplate](https://www.baeldung.com/spring-rest-template-list) - [Copy of RestTemplate Post Request with JSON](https://www.baeldung.com/spring-resttemplate-post-json-test) +- [HTTP PUT vs HTTP PATCH in a REST API](https://www.baeldung.com/http-put-patch-difference-spring) +- [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) +- [Download an Image or a File with Spring MVC](https://www.baeldung.com/spring-controller-return-image-file) ### NOTE: From 205c7f3904bc184d551c8011444f3b768dda0857 Mon Sep 17 00:00:00 2001 From: Roger Yates <587230+rojyates@users.noreply.github.com> Date: Sun, 8 Dec 2019 22:45:47 +1000 Subject: [PATCH 51/99] BAEL-3515 proxy and security settings examples --- maven-all/maven/proxy/settings.xml | 43 +++++++++++++++++++ .../security/redirect/settings-security.xml | 6 +++ .../maven/security/settings-security.xml | 7 +++ 3 files changed, 56 insertions(+) create mode 100644 maven-all/maven/proxy/settings.xml create mode 100644 maven-all/maven/security/redirect/settings-security.xml create mode 100644 maven-all/maven/security/settings-security.xml diff --git a/maven-all/maven/proxy/settings.xml b/maven-all/maven/proxy/settings.xml new file mode 100644 index 0000000000..55a850a6bc --- /dev/null +++ b/maven-all/maven/proxy/settings.xml @@ -0,0 +1,43 @@ + + + + + + + BaeldungProxy_Encrypted + true + http + proxy.baeldung.com + 80 + baeldung + {U2iMf+7aJXQHRquuQq6MX+n7GOeh97zB9/4e7kkEQYs=} + internal.baeldung.com|localhost|127.*|[::1] + + + + BaeldungProxy_Authenticated + true + http + proxy.baeldung.com + 80 + baeldung + changeme + internal.baeldung.com|localhost|127.*|[::1] + + + + BaeldungProxy + proxy.baeldung.com + 80 + internal.baeldung.com|localhost|127.*|[::1] + + + + + \ No newline at end of file diff --git a/maven-all/maven/security/redirect/settings-security.xml b/maven-all/maven/security/redirect/settings-security.xml new file mode 100644 index 0000000000..37e91bd1a4 --- /dev/null +++ b/maven-all/maven/security/redirect/settings-security.xml @@ -0,0 +1,6 @@ + + + R:\config\settings-security.xml + diff --git a/maven-all/maven/security/settings-security.xml b/maven-all/maven/security/settings-security.xml new file mode 100644 index 0000000000..3ac258e8a5 --- /dev/null +++ b/maven-all/maven/security/settings-security.xml @@ -0,0 +1,7 @@ + + + {QFMlh/6WjF8H9po9UD\}0Nv18e527jqWb6mUgIB798n4=} + From 86c2f144b99167f4d5b37191eaf50ce5a111015e Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Sun, 8 Dec 2019 15:45:41 +0200 Subject: [PATCH 52/99] Springfox improvement code moved to spring-boot-mvc module --- spring-boot-mvc/pom.xml | 32 ++++++- .../configuration/SpringFoxConfig.java | 17 +++- .../baeldung/swagger2boot}/model/User.java | 2 +- .../plugin/EmailAnnotationPlugin.java | 2 +- .../repository/UserRepository.java | 4 +- springfox/pom.xml | 94 ------------------- .../springfox/SpringfoxApplication.java | 69 -------------- .../springfox/controller/UserController.java | 39 -------- .../src/main/resources/application.properties | 3 - 9 files changed, 48 insertions(+), 214 deletions(-) rename {springfox/src/main/java/com/baeldung/springfox => spring-boot-mvc/src/main/java/com/baeldung/swagger2boot}/model/User.java (96%) rename {springfox/src/main/java/com/baeldung/springfox => spring-boot-mvc/src/main/java/com/baeldung/swagger2boot}/plugin/EmailAnnotationPlugin.java (96%) rename {springfox/src/main/java/com/baeldung/springfox => spring-boot-mvc/src/main/java/com/baeldung/swagger2boot}/repository/UserRepository.java (68%) delete mode 100644 springfox/pom.xml delete mode 100644 springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java delete mode 100644 springfox/src/main/java/com/baeldung/springfox/controller/UserController.java delete mode 100644 springfox/src/main/resources/application.properties diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml index a414ed7bb2..a825a167ad 100644 --- a/spring-boot-mvc/pom.xml +++ b/spring-boot-mvc/pom.xml @@ -14,6 +14,15 @@ 0.0.1-SNAPSHOT ../parent-boot-2
+ + + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + + @@ -34,7 +43,14 @@ org.springframework.boot spring-boot-starter-thymeleaf
- + + org.springframework.boot + spring-boot-starter-data-jpa + + + com.h2database + h2 + @@ -82,6 +98,18 @@ springfox-swagger-ui ${spring.fox.version} + + + io.springfox + springfox-data-rest + ${spring.fox.version} + + + + io.springfox + springfox-bean-validators + ${spring.fox.version} + org.apache.tomcat.embed @@ -117,7 +145,7 @@ - 2.9.2 + 3.0.0-SNAPSHOT 1.10.0 2.3.7 diff --git a/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java index 68e2c55deb..434a8d77cb 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/configuration/SpringFoxConfig.java @@ -1,22 +1,29 @@ package com.baeldung.swagger2boot.configuration; +import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import com.baeldung.swagger2boot.plugin.EmailAnnotationPlugin; + +import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger.web.*; -import springfox.documentation.swagger2.annotations.EnableSwagger2; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; import java.util.Collections; @Configuration -@EnableSwagger2 -@ComponentScan("com.baeldung.swaggerboot.controller") +@EnableSwagger2WebMvc +@Import({SpringDataRestConfiguration.class, BeanValidatorPluginsConfiguration.class}) public class SpringFoxConfig { private ApiInfo apiInfo() { @@ -65,4 +72,8 @@ public class SpringFoxConfig { .build(); } + @Bean + public EmailAnnotationPlugin emailPlugin() { + return new EmailAnnotationPlugin(); + } } diff --git a/springfox/src/main/java/com/baeldung/springfox/model/User.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/model/User.java similarity index 96% rename from springfox/src/main/java/com/baeldung/springfox/model/User.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/model/User.java index 20e74016f3..b724031536 100644 --- a/springfox/src/main/java/com/baeldung/springfox/model/User.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/model/User.java @@ -1,4 +1,4 @@ -package com.baeldung.springfox.model; +package com.baeldung.swagger2boot.model; import javax.persistence.Id; import javax.validation.constraints.Email; diff --git a/springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/plugin/EmailAnnotationPlugin.java similarity index 96% rename from springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/plugin/EmailAnnotationPlugin.java index 2e5e57aec5..22ca144fb4 100644 --- a/springfox/src/main/java/com/baeldung/springfox/plugin/EmailAnnotationPlugin.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/plugin/EmailAnnotationPlugin.java @@ -1,4 +1,4 @@ -package com.baeldung.springfox.plugin; +package com.baeldung.swagger2boot.plugin; import static springfox.bean.validators.plugins.Validators.annotationFromBean; diff --git a/springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/repository/UserRepository.java similarity index 68% rename from springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java rename to spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/repository/UserRepository.java index 16303bc6d0..0cbffa06d4 100644 --- a/springfox/src/main/java/com/baeldung/springfox/repository/UserRepository.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/swagger2boot/repository/UserRepository.java @@ -1,9 +1,9 @@ -package com.baeldung.springfox.repository; +package com.baeldung.swagger2boot.repository; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; -import com.baeldung.springfox.model.User; +import com.baeldung.swagger2boot.model.User; @Repository public interface UserRepository extends CrudRepository { diff --git a/springfox/pom.xml b/springfox/pom.xml deleted file mode 100644 index c620e49a3d..0000000000 --- a/springfox/pom.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - 4.0.0 - com.baeldung.web - springfox - springfox - SpringFox - war - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - jcenter - jcenter - https://jcenter.bintray.com/ - - - - jcenter-snapshots - jcenter - http://oss.jfrog.org/artifactory/oss-snapshot-local/ - - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-data-rest - - - org.springframework.boot - spring-boot-starter-data-jpa - - - com.h2database - h2 - - - - - io.springfox - springfox-swagger2 - 3.0.0-SNAPSHOT - - - io.springfox - springfox-swagger-ui - 3.0.0-SNAPSHOT - - - io.springfox - springfox-data-rest - 3.0.0-SNAPSHOT - - - io.springfox - springfox-bean-validators - 3.0.0-SNAPSHOT - - - - - com.google.guava - guava - ${guava.version} - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - com.baeldung.springfox.SpringfoxApplication - 27.0.1-jre - - diff --git a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java b/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java deleted file mode 100644 index 03f20c5d0a..0000000000 --- a/springfox/src/main/java/com/baeldung/springfox/SpringfoxApplication.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.springfox; - -import static springfox.documentation.builders.PathSelectors.regex; - -import java.util.Collections; -import java.util.function.Predicate; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -import com.baeldung.springfox.plugin.EmailAnnotationPlugin; - -import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.data.rest.configuration.SpringDataRestConfiguration; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; - - -@SpringBootApplication -@EnableSwagger2WebMvc -@EntityScan("com.baeldung.springfox.model") -@ComponentScan("com.baeldung.springfox.controller") -@EnableJpaRepositories("com.baeldung.springfox.repository") -@Import({SpringDataRestConfiguration.class, BeanValidatorPluginsConfiguration.class}) -public class SpringfoxApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringfoxApplication.class, args); - } - - @Bean - public Docket springfoxAppInfo() { - return new Docket(DocumentationType.SWAGGER_2) - .groupName("baeldung-springfox-api") - .select() - .paths(paths()) - .build() - .apiInfo(apiInfo()); - } - - private Predicate paths() { - return regex("/users.*").or(regex("/api.*")); - } - - private ApiInfo apiInfo() { - return new ApiInfo( - "Springfox API specification", - "User REST and Spring Data APIs", - "", - "", - null, - "License of API", - "API license URL", - Collections.emptyList()); - } - - @Bean - public EmailAnnotationPlugin emailPlugin() { - return new EmailAnnotationPlugin(); - } - -} diff --git a/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java b/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java deleted file mode 100644 index d70cc3e7a5..0000000000 --- a/springfox/src/main/java/com/baeldung/springfox/controller/UserController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.springfox.controller; - -import java.util.Optional; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -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.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; - -import com.baeldung.springfox.model.User; -import com.baeldung.springfox.repository.UserRepository; - -@Controller -@RequestMapping(value = "/api/user", produces = MediaType.APPLICATION_JSON_VALUE) -public class UserController { - - @Autowired - private UserRepository userRepository; - - @PostMapping - public @ResponseBody ResponseEntity createUser(@RequestBody User user) { - userRepository.save(user); - return new ResponseEntity<>(user, HttpStatus.OK); - } - - @GetMapping - public @ResponseBody ResponseEntity getUser(@RequestParam Long id) { - Optional user = userRepository.findById(id); - return new ResponseEntity<>(user.get(), HttpStatus.OK); - } - -} diff --git a/springfox/src/main/resources/application.properties b/springfox/src/main/resources/application.properties deleted file mode 100644 index 3b4076297b..0000000000 --- a/springfox/src/main/resources/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -### Spring Boot default error handling configurations -#server.error.whitelabel.enabled=false -#server.error.include-stacktrace=always From d9bbc12b0f99996f6f5339a8bc3924fd8554a459 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 8 Dec 2019 15:47:14 +0200 Subject: [PATCH 53/99] springfox module removed --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4966706383..05999f0926 100644 --- a/pom.xml +++ b/pom.xml @@ -621,7 +621,6 @@ tensorflow-java spf4j - springfox spring-boot-config-jpa-error spring-boot-flowable spring-boot-mvc-2 @@ -1249,7 +1248,6 @@ rxjava-libraries oauth2-framework-impl spf4j - springfox spring-boot-performance spring-boot-properties From d8d424adb3986d9532717e10f905df3f1644794f Mon Sep 17 00:00:00 2001 From: mikr Date: Sun, 8 Dec 2019 19:22:06 +0100 Subject: [PATCH 54/99] http://jira.baeldung.com/browse/BAEL-3586 --- .../ExceptionAssertionUnitTest.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java index 1b1c70d824..ee2f696408 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java @@ -1,23 +1,32 @@ package com.baeldung.assertexception; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; public class ExceptionAssertionUnitTest { @Test public void whenExceptionThrown_thenAssertionSucceeds() { - String test = null; - assertThrows(NullPointerException.class, () -> { - test.length(); + Exception exception = assertThrows(NumberFormatException.class, () -> { + Integer.parseInt("1a"); }); + + String expectedMessage = "For input string"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.contains(expectedMessage)); } @Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { - String test = null; - assertThrows(RuntimeException.class, () -> { - test.length(); + Exception exception = assertThrows(RuntimeException.class, () -> { + Integer.parseInt("1a"); }); + + String expectedMessage = "For input string"; + String actualMessage = exception.getMessage(); + + assertTrue(actualMessage.contains(expectedMessage)); } } \ No newline at end of file From e08dfcc38b4af11e2b50dc9bf068f0be7b647785 Mon Sep 17 00:00:00 2001 From: psevestre Date: Sun, 8 Dec 2019 17:39:07 -0300 Subject: [PATCH 55/99] [BAEL-3562] AWS S3 with Java - Reactive Support (#8309) * [BAEL-3164] Add spring-boot-jdbi module * [BAEL-3164] Remove extra files * [BAEL-3164] Update springboot main dependency * Reset bad commit * [BAEL-3562] Added basic code * [BAEL-3562] Some refatoring * [BAEL-3562] More refatoring * [BAEL-3562] LiveTests --- aws-reactive/images/rective-upload.png | Bin 0 -> 22760 bytes aws-reactive/images/rective-upload.txt | 29 ++ aws-reactive/images/thread-per-client.png | Bin 0 -> 31850 bytes aws-reactive/images/thread-per-client.txt | 28 ++ aws-reactive/pom.xml | 105 ++++++ .../reactive/s3/DownloadFailedException.java | 32 ++ .../aws/reactive/s3/DownloadResource.java | 144 ++++++++ .../reactive/s3/ReactiveS3Application.java | 13 + .../s3/S3ClientConfigurarionProperties.java | 28 ++ .../reactive/s3/S3ClientConfiguration.java | 65 ++++ .../reactive/s3/UploadFailedException.java | 32 ++ .../aws/reactive/s3/UploadResource.java | 308 ++++++++++++++++++ .../aws/reactive/s3/UploadResult.java | 25 ++ .../src/main/resources/application-minio.yml | 15 + .../src/main/resources/application.yml | 16 + .../s3/ReactiveS3ApplicationLiveTest.java | 85 +++++ .../src/test/resources/testimage1.png | Bin 0 -> 4315 bytes .../src/test/resources/testimage2.png | Bin 0 -> 24921 bytes 18 files changed, 925 insertions(+) create mode 100644 aws-reactive/images/rective-upload.png create mode 100644 aws-reactive/images/rective-upload.txt create mode 100644 aws-reactive/images/thread-per-client.png create mode 100644 aws-reactive/images/thread-per-client.txt create mode 100644 aws-reactive/pom.xml create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java create mode 100644 aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java create mode 100644 aws-reactive/src/main/resources/application-minio.yml create mode 100644 aws-reactive/src/main/resources/application.yml create mode 100644 aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java create mode 100644 aws-reactive/src/test/resources/testimage1.png create mode 100644 aws-reactive/src/test/resources/testimage2.png diff --git a/aws-reactive/images/rective-upload.png b/aws-reactive/images/rective-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe5a7d69c03dad3c07062c3cb654e6f281e95a5 GIT binary patch literal 22760 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 literal 0 HcmV?d00001 diff --git a/aws-reactive/images/rective-upload.txt b/aws-reactive/images/rective-upload.txt new file mode 100644 index 0000000000..fb5177544e --- /dev/null +++ b/aws-reactive/images/rective-upload.txt @@ -0,0 +1,29 @@ +participant "Client 1" as C1 +participant "Client 2" as C2 +participant "Reactive Web App" as RWS +participant "Backend" as S3 +C1 -> RWS: POST +activate C1 +activate RWS +RWS -> S3: Async POST +deactivate RWS +C2 -> RWS: POST +activate C2 +activate RWS +RWS -> S3: Async POST +deactivate RWS +S3 --> RWS: Async Result +activate RWS +RWS -->C2: Result +deactivate RWS +deactivate C2 +// First file EOF +S3 --> RWS: Async Result +activate RWS +RWS -->C1: Result +deactivate RWS +deactivate C1 + + + + diff --git a/aws-reactive/images/thread-per-client.png b/aws-reactive/images/thread-per-client.png new file mode 100644 index 0000000000000000000000000000000000000000..dc75839aa451491fa0071d4dbc09decc348535bf GIT binary patch literal 31850 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 Dzin Controller: POST Data +activate Client 1 +activate Controller +Controller -> Backend: Save Data +activate Backend +note left of Controller #yellow: Controller blocked\nuntil result received +Backend --> Controller: Result +deactivate Backend +Controller --> Client 1: Result +deactivate Client 1 +deactivate Controller +// 2nd Upload +Client 2-> Controller: POST Data +activate Client 2 +activate Controller +Controller -> Backend: Save Data +activate Backend +note left of Controller #yellow: Controller blocket\nuntil result received +Backend --> Controller: Result +deactivate Backend +Controller --> Client 2: Result +deactivate Controller +deactivate Client 2 + diff --git a/aws-reactive/pom.xml b/aws-reactive/pom.xml new file mode 100644 index 0000000000..b3fcb24902 --- /dev/null +++ b/aws-reactive/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + aws-reactive + 0.0.1-SNAPSHOT + aws-reactive + AWS Reactive Sample + + + 1.8 + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.2.1.RELEASE + pom + import + + + + software.amazon.awssdk + bom + 2.10.27 + pom + import + + + + + + + org.springframework.boot + spring-boot-starter-webflux + + + + software.amazon.awssdk + s3 + compile + + + + netty-nio-client + software.amazon.awssdk + compile + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + io.projectreactor + reactor-test + test + + + org.springframework.boot + spring-boot-devtools + runtime + + + org.springframework.boot + spring-boot-configuration-processor + + + org.projectlombok + lombok + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java new file mode 100644 index 0000000000..a88e1ab010 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadFailedException.java @@ -0,0 +1,32 @@ +package com.baeldung.aws.reactive.s3; + +import java.util.Optional; + +import org.springframework.http.HttpStatus; + +import lombok.AllArgsConstructor; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.http.SdkHttpResponse; + +@AllArgsConstructor +public class DownloadFailedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private int statusCode; + private Optional statusText; + + public DownloadFailedException(SdkResponse response) { + + SdkHttpResponse httpResponse = response.sdkHttpResponse(); + if (httpResponse != null) { + this.statusCode = httpResponse.statusCode(); + this.statusText = httpResponse.statusText(); + } else { + this.statusCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.statusText = Optional.of("UNKNOWN"); + } + + } + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java new file mode 100644 index 0000000000..838ada1685 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/DownloadResource.java @@ -0,0 +1,144 @@ +/** + * + */ +package com.baeldung.aws.reactive.s3; + +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.CompletableFuture; + +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.core.io.buffer.DataBufferUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.http.ResponseEntity.BodyBuilder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import software.amazon.awssdk.core.ResponseBytes; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.core.async.AsyncResponseTransformer; +import software.amazon.awssdk.core.async.SdkPublisher; +import software.amazon.awssdk.core.internal.async.ByteArrayAsyncResponseTransformer; +import software.amazon.awssdk.http.SdkHttpResponse; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; + +/** + * @author Philippe + * + */ +@RestController +@RequestMapping("/inbox") +@Slf4j +public class DownloadResource { + + + private final S3AsyncClient s3client; + private final S3ClientConfigurarionProperties s3config; + + public DownloadResource(S3AsyncClient s3client, S3ClientConfigurarionProperties s3config) { + this.s3client = s3client; + this.s3config = s3config; + } + + + @GetMapping(path="/{filekey}") + public Mono>> downloadFile(@PathVariable("filekey") String filekey) { + + GetObjectRequest request = GetObjectRequest.builder() + .bucket(s3config.getBucket()) + .key(filekey) + .build(); + + return Mono.fromFuture(s3client.getObject(request,new FluxResponseProvider())) + .map( (response) -> { + checkResult(response.sdkResponse); + String filename = getMetadataItem(response.sdkResponse,"filename",filekey); + + log.info("[I65] filename={}, length={}",filename, response.sdkResponse.contentLength() ); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_TYPE, response.sdkResponse.contentType()) + .header(HttpHeaders.CONTENT_LENGTH, Long.toString(response.sdkResponse.contentLength())) + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"") + .body(response.flux); + }); + } + + /** + * Lookup a metadata key in a case-insensitive way. + * @param sdkResponse + * @param key + * @param defaultValue + * @return + */ + private String getMetadataItem(GetObjectResponse sdkResponse, String key, String defaultValue) { + for( Entry entry : sdkResponse.metadata().entrySet()) { + if ( entry.getKey().equalsIgnoreCase(key)) { + return entry.getValue(); + } + } + return defaultValue; + } + + + // Helper used to check return codes from an API call + private static void checkResult(GetObjectResponse response) { + SdkHttpResponse sdkResponse = response.sdkHttpResponse(); + if ( sdkResponse != null && sdkResponse.isSuccessful()) { + return; + } + + throw new DownloadFailedException(response); + } + + + static class FluxResponseProvider implements AsyncResponseTransformer { + + private FluxResponse response; + + @Override + public CompletableFuture prepare() { + response = new FluxResponse(); + return response.cf; + } + + @Override + public void onResponse(GetObjectResponse sdkResponse) { + this.response.sdkResponse = sdkResponse; + } + + @Override + public void onStream(SdkPublisher publisher) { + response.flux = Flux.from(publisher); + response.cf.complete(response); + } + + @Override + public void exceptionOccurred(Throwable error) { + response.cf.completeExceptionally(error); + } + + } + + /** + * Holds the API response and stream + * @author Philippe + */ + static class FluxResponse { + + final CompletableFuture cf = new CompletableFuture<>(); + GetObjectResponse sdkResponse; + Flux flux; + } + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java new file mode 100644 index 0000000000..b90c085fc9 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/ReactiveS3Application.java @@ -0,0 +1,13 @@ +package com.baeldung.aws.reactive.s3; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReactiveS3Application { + + public static void main(String[] args) { + SpringApplication.run(ReactiveS3Application.class, args); + } + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java new file mode 100644 index 0000000000..b30bc1e5fa --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfigurarionProperties.java @@ -0,0 +1,28 @@ +package com.baeldung.aws.reactive.s3; + +import java.net.URI; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; +import software.amazon.awssdk.regions.Region; + +@ConfigurationProperties(prefix = "aws.s3") +@Data +public class S3ClientConfigurarionProperties { + + private Region region = Region.US_EAST_1; + private URI endpoint = null; + + private String accessKeyId; + private String secretAccessKey; + + // Bucket name we'll be using as our backend storage + private String bucket; + + // AWS S3 requires that file parts must have at least 5MB, except + // for the last part. This may change for other S3-compatible services, so let't + // define a configuration property for that + private int multipartMinPartSize = 5*1024*1024; + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java new file mode 100644 index 0000000000..906ea088a1 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/S3ClientConfiguration.java @@ -0,0 +1,65 @@ +package com.baeldung.aws.reactive.s3; + +import java.time.Duration; + +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentials; +import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; +import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; +import software.amazon.awssdk.http.async.SdkAsyncHttpClient; +import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.S3AsyncClientBuilder; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.utils.StringUtils; + +@Configuration +@EnableConfigurationProperties(S3ClientConfigurarionProperties.class) +public class S3ClientConfiguration { + + @Bean + public S3AsyncClient s3client(S3ClientConfigurarionProperties s3props, AwsCredentialsProvider credentialsProvider) { + + SdkAsyncHttpClient httpClient = NettyNioAsyncHttpClient.builder() + .writeTimeout(Duration.ZERO) + .maxConcurrency(64) + .build(); + + S3Configuration serviceConfiguration = S3Configuration.builder() + .checksumValidationEnabled(false) + .chunkedEncodingEnabled(true) + .build(); + + S3AsyncClientBuilder b = S3AsyncClient.builder() + .httpClient(httpClient) + .region(s3props.getRegion()) + .credentialsProvider(credentialsProvider) + .serviceConfiguration(serviceConfiguration); + + if (s3props.getEndpoint() != null) { + b = b.endpointOverride(s3props.getEndpoint()); + } + + return b.build(); + } + + @Bean + public AwsCredentialsProvider awsCredentialsProvider(S3ClientConfigurarionProperties s3props) { + + if (StringUtils.isBlank(s3props.getAccessKeyId())) { + // Return default provider + return DefaultCredentialsProvider.create(); + } + else { + // Return custom credentials provider + return () -> { + AwsCredentials creds = AwsBasicCredentials.create(s3props.getAccessKeyId(), s3props.getSecretAccessKey()); + return creds; + }; + } + } +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java new file mode 100644 index 0000000000..0cfebc85d2 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadFailedException.java @@ -0,0 +1,32 @@ +package com.baeldung.aws.reactive.s3; + +import java.util.Optional; + +import org.springframework.http.HttpStatus; + +import lombok.AllArgsConstructor; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.http.SdkHttpResponse; + +@AllArgsConstructor +public class UploadFailedException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + private int statusCode; + private Optional statusText; + + public UploadFailedException(SdkResponse response) { + + SdkHttpResponse httpResponse = response.sdkHttpResponse(); + if (httpResponse != null) { + this.statusCode = httpResponse.statusCode(); + this.statusText = httpResponse.statusText(); + } else { + this.statusCode = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.statusText = Optional.of("UNKNOWN"); + } + + } + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java new file mode 100644 index 0000000000..fa7bf6a471 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResource.java @@ -0,0 +1,308 @@ +/** + * + */ +package com.baeldung.aws.reactive.s3; + +import java.io.File; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +import org.reactivestreams.Publisher; +import org.springframework.core.io.buffer.DataBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.http.codec.multipart.FilePart; +import org.springframework.http.codec.multipart.Part; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import software.amazon.awssdk.core.SdkResponse; +import software.amazon.awssdk.core.async.AsyncRequestBody; +import software.amazon.awssdk.services.s3.S3AsyncClient; +import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; +import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; +import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload; +import software.amazon.awssdk.services.s3.model.CompletedMultipartUpload.Builder; +import software.amazon.awssdk.services.s3.model.CompletedPart; +import software.amazon.awssdk.services.s3.model.CreateMultipartUploadRequest; +import software.amazon.awssdk.services.s3.model.CreateMultipartUploadResponse; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.model.UploadPartRequest; +import software.amazon.awssdk.services.s3.model.UploadPartResponse; + +/** + * @author Philippe + * + */ +@RestController +@RequestMapping("/inbox") +@Slf4j +public class UploadResource { + + private final S3AsyncClient s3client; + private final S3ClientConfigurarionProperties s3config; + + public UploadResource(S3AsyncClient s3client, S3ClientConfigurarionProperties s3config) { + this.s3client = s3client; + this.s3config = s3config; + } + + /** + * Standard file upload. + */ + @PostMapping + public Mono> uploadHandler(@RequestHeader HttpHeaders headers, @RequestBody Flux body) { + + long length = headers.getContentLength(); + if (length < 0) { + throw new UploadFailedException(HttpStatus.BAD_REQUEST.value(), Optional.of("required header missing: Content-Length")); + } + + String fileKey = UUID.randomUUID().toString(); + Map metadata = new HashMap(); + MediaType mediaType = headers.getContentType(); + + if (mediaType == null) { + mediaType = MediaType.APPLICATION_OCTET_STREAM; + } + + log.info("[I95] uploadHandler: mediaType{}, length={}", mediaType, length); + CompletableFuture future = s3client + .putObject(PutObjectRequest.builder() + .bucket(s3config.getBucket()) + .contentLength(length) + .key(fileKey.toString()) + .contentType(mediaType.toString()) + .metadata(metadata) + .build(), + AsyncRequestBody.fromPublisher(body)); + + return Mono.fromFuture(future) + .map((response) -> { + checkResult(response); + return ResponseEntity + .status(HttpStatus.CREATED) + .body(new UploadResult(HttpStatus.CREATED, new String[] {fileKey})); + }); + } + + + /** + * Multipart file upload + * @param bucket + * @param parts + * @param headers + * @return + */ + @RequestMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = {RequestMethod.POST, RequestMethod.PUT}) + public Mono> multipartUploadHandler(@RequestHeader HttpHeaders headers, @RequestBody Flux parts ) { + + return parts + .ofType(FilePart.class) // We'll ignore other data for now + .flatMap((part) -> saveFile(headers, s3config.getBucket(), part)) + .collect(Collectors.toList()) + .map((keys) -> ResponseEntity.status(HttpStatus.CREATED) + .body(new UploadResult(HttpStatus.CREATED,keys))); + } + + + /** + * Save file using a multipart upload. This method does not require any temporary + * storage at the REST service + * @param headers + * @param bucket Bucket name + * @param part Uploaded file + * @return + */ + protected Mono saveFile(HttpHeaders headers,String bucket, FilePart part) { + + // Generate a filekey for this upload + String filekey = UUID.randomUUID().toString(); + + log.info("[I137] saveFile: filekey={}, filename={}", filekey, part.filename()); + + // Gather metadata + Map metadata = new HashMap(); + String filename = part.filename(); + if ( filename == null ) { + filename = filekey; + } + + metadata.put("filename", filename); + + MediaType mt = part.headers().getContentType(); + if ( mt == null ) { + mt = MediaType.APPLICATION_OCTET_STREAM; + } + + // Create multipart upload request + CompletableFuture uploadRequest = s3client + .createMultipartUpload(CreateMultipartUploadRequest.builder() + .contentType(mt.toString()) + .key(filekey) + .metadata(metadata) + .bucket(bucket) + .build()); + + // This variable will hold the upload state that we must keep + // around until all uploads complete + final UploadState uploadState = new UploadState(bucket,filekey); + + return Mono + .fromFuture(uploadRequest) + .flatMapMany((response) -> { + checkResult(response); + uploadState.uploadId = response.uploadId(); + log.info("[I183] uploadId={}", response.uploadId()); + return part.content(); + }) + .bufferUntil((buffer) -> { + uploadState.buffered += buffer.readableByteCount(); + if ( uploadState.buffered >= s3config.getMultipartMinPartSize() ) { + log.info("[I173] bufferUntil: returning true, bufferedBytes={}, partCounter={}, uploadId={}", uploadState.buffered, uploadState.partCounter, uploadState.uploadId); + uploadState.buffered = 0; + return true; + } + else { + return false; + } + }) + .map((buffers) -> concatBuffers(buffers)) + .flatMap((buffer) -> uploadPart(uploadState,buffer)) + .onBackpressureBuffer() + .reduce(uploadState,(state,completedPart) -> { + log.info("[I188] completed: partNumber={}, etag={}", completedPart.partNumber(), completedPart.eTag()); + state.completedParts.put(completedPart.partNumber(), completedPart); + return state; + }) + .flatMap((state) -> completeUpload(state)) + .map((response) -> { + checkResult(response); + return uploadState.filekey; + }); + } + + private static ByteBuffer concatBuffers(List buffers) { + log.info("[I198] creating BytBuffer from {} chunks", buffers.size()); + + int partSize = 0; + for( DataBuffer b : buffers) { + partSize += b.readableByteCount(); + } + + ByteBuffer partData = ByteBuffer.allocate(partSize); + buffers.forEach((buffer) -> { + partData.put(buffer.asByteBuffer()); + }); + + // Reset read pointer to first byte + partData.rewind(); + + log.info("[I208] partData: size={}", partData.capacity()); + return partData; + + } + + /** + * Upload a single file part to the requested bucket + * @param uploadState + * @param buffer + * @return + */ + private Mono uploadPart(UploadState uploadState, ByteBuffer buffer) { + final int partNumber = ++uploadState.partCounter; + log.info("[I218] uploadPart: partNumber={}, contentLength={}",partNumber, buffer.capacity()); + + CompletableFuture request = s3client.uploadPart(UploadPartRequest.builder() + .bucket(uploadState.bucket) + .key(uploadState.filekey) + .partNumber(partNumber) + .uploadId(uploadState.uploadId) + .contentLength((long) buffer.capacity()) + .build(), + AsyncRequestBody.fromPublisher(Mono.just(buffer))); + + return Mono + .fromFuture(request) + .map((uploadPartResult) -> { + checkResult(uploadPartResult); + log.info("[I230] uploadPart complete: part={}, etag={}",partNumber,uploadPartResult.eTag()); + return CompletedPart.builder() + .eTag(uploadPartResult.eTag()) + .partNumber(partNumber) + .build(); + }); + } + + private Mono completeUpload(UploadState state) { + log.info("[I202] completeUpload: bucket={}, filekey={}, completedParts.size={}", state.bucket, state.filekey, state.completedParts.size()); + + CompletedMultipartUpload multipartUpload = CompletedMultipartUpload.builder() + .parts(state.completedParts.values()) + .build(); + + return Mono.fromFuture(s3client.completeMultipartUpload(CompleteMultipartUploadRequest.builder() + .bucket(state.bucket) + .uploadId(state.uploadId) + .multipartUpload(multipartUpload) + .key(state.filekey) + .build())); + } + + + /** + * check result from an API call. + * @param result Result from an API call + */ + private static void checkResult(SdkResponse result) { + if (result.sdkHttpResponse() == null || !result.sdkHttpResponse().isSuccessful()) { + throw new UploadFailedException(result); + } + } + + + /** + * Holds upload state during a multipart upload + */ + static class UploadState { + final String bucket; + final String filekey; + + String uploadId; + int partCounter; + Map completedParts = new HashMap<>(); + int buffered = 0; + + UploadState(String bucket, String filekey) { + this.bucket = bucket; + this.filekey = filekey; + } + } + +} diff --git a/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java new file mode 100644 index 0000000000..642ad426a5 --- /dev/null +++ b/aws-reactive/src/main/java/com/baeldung/aws/reactive/s3/UploadResult.java @@ -0,0 +1,25 @@ +package com.baeldung.aws.reactive.s3; + +import java.util.List; + +import org.springframework.http.HttpStatus; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@AllArgsConstructor +@Builder +public class UploadResult { + HttpStatus status; + String[] keys; + + public UploadResult() {} + + public UploadResult(HttpStatus status, List keys) { + this.status = status; + this.keys = keys == null ? new String[] {}: keys.toArray(new String[] {}); + + } +} diff --git a/aws-reactive/src/main/resources/application-minio.yml b/aws-reactive/src/main/resources/application-minio.yml new file mode 100644 index 0000000000..93bc2ff18b --- /dev/null +++ b/aws-reactive/src/main/resources/application-minio.yml @@ -0,0 +1,15 @@ + +# +# Minio profile +# +aws: + s3: + region: sa-east-1 + endpoint: http://localhost:9000 + accessKeyId: 8KLF8U60JER4AP23H0A6 + secretAccessKey: vX4uM7e7nNGPqjcXycVVhceNR7NQkiMQkR9Hoctf + bucket: bucket1 + + + + diff --git a/aws-reactive/src/main/resources/application.yml b/aws-reactive/src/main/resources/application.yml new file mode 100644 index 0000000000..957ebf82c3 --- /dev/null +++ b/aws-reactive/src/main/resources/application.yml @@ -0,0 +1,16 @@ + +# +# Configurações de acesso ao Minio +# +aws: + s3: + region: sa-east-1 +# When using AWS, the library will use one of the available +# credential sources described in the documentation. +# accessKeyId: **** +# secretAccessKey: **** + bucket: dev1.token.com.br + + + + diff --git a/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java b/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java new file mode 100644 index 0000000000..9e5720225f --- /dev/null +++ b/aws-reactive/src/test/java/com/baeldung/aws/reactive/s3/ReactiveS3ApplicationLiveTest.java @@ -0,0 +1,85 @@ +package com.baeldung.aws.reactive.s3; + +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.core.io.Resource; +import org.springframework.http.ContentDisposition; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.util.ResourceUtils; + +import static org.junit.Assert.*; + +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@ActiveProfiles("minio") +class ReactiveS3ApplicationLiveTest { + + @Autowired + private TestRestTemplate restTemplate; + + @LocalServerPort + private int serverPort; + + + @Test + void whenUploadSingleFile_thenSuccess() throws Exception { + + String url = "http://localhost:" + serverPort + "/inbox"; + byte[] data = Files.readAllBytes(Paths.get("src/test/resources/testimage1.png")); + UploadResult result = restTemplate.postForObject(url, data , UploadResult.class); + + assertEquals("Expected CREATED (202)", result.getStatus(), HttpStatus.CREATED ); + + } + + @Test + void whenUploadMultipleFiles_thenSuccess() throws Exception { + + + MultiValueMap body = new LinkedMultiValueMap<>(); + addFileEntity("f1", body, new File("src/test/resources/testimage1.png")); + addFileEntity("f2", body, new File("src/test/resources/testimage2.png")); + + HttpEntity> requestEntity = new HttpEntity<>(body); + String url = "http://localhost:" + serverPort + "/inbox"; + + ResponseEntity result = restTemplate.postForEntity(url, requestEntity, UploadResult.class); + + assertEquals("Http Code",HttpStatus.CREATED, result.getStatusCode() ); + assertEquals("File keys",2, result.getBody().getKeys().length); + + } + + private void addFileEntity(String name, MultiValueMap body, File file) throws Exception { + + byte[] data = Files.readAllBytes(file.toPath()); + MultiValueMap headers = new LinkedMultiValueMap<>(); + ContentDisposition contentDispositionHeader = ContentDisposition.builder("form-data") + .name(name) + .filename(file.getName()) + .build(); + + headers.add(HttpHeaders.CONTENT_DISPOSITION, contentDispositionHeader.toString()); + + HttpEntity fileEntity = new HttpEntity<>(data, headers); + body.add(name, fileEntity); + } + + +} diff --git a/aws-reactive/src/test/resources/testimage1.png b/aws-reactive/src/test/resources/testimage1.png new file mode 100644 index 0000000000000000000000000000000000000000..c61a9b677f054b5c6bf6e798440d8791ceda6a66 GIT binary patch literal 4315 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 Date: Sun, 8 Dec 2019 21:53:52 +0100 Subject: [PATCH 56/99] BAEL-19868: Use random port in spring-session-mongodb IntegrationTest --- .../SpringSessionMongoDBIntegrationTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spring-session/spring-session-mongodb/src/test/java/com/baeldung/springsessionmongodb/SpringSessionMongoDBIntegrationTest.java b/spring-session/spring-session-mongodb/src/test/java/com/baeldung/springsessionmongodb/SpringSessionMongoDBIntegrationTest.java index 9dc45c5b32..de41019e49 100644 --- a/spring-session/spring-session-mongodb/src/test/java/com/baeldung/springsessionmongodb/SpringSessionMongoDBIntegrationTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/com/baeldung/springsessionmongodb/SpringSessionMongoDBIntegrationTest.java @@ -6,6 +6,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; @@ -16,9 +17,12 @@ import java.util.Base64; @RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) +@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class SpringSessionMongoDBIntegrationTest { + @LocalServerPort + private int port; + @Autowired private MongoOperationsSessionRepository repository; @@ -27,7 +31,7 @@ public class SpringSessionMongoDBIntegrationTest { @Test public void givenEndpointIsCalledTwiceAndResponseIsReturned_whenMongoDBIsQueriedForCount_thenCountMustBeSame() { HttpEntity response = restTemplate - .exchange("http://localhost:" + 8080, HttpMethod.GET, null, String.class); + .exchange("http://localhost:" + port, HttpMethod.GET, null, String.class); HttpHeaders headers = response.getHeaders(); String set_cookie = headers.getFirst(HttpHeaders.SET_COOKIE); From 346a12fb540c6d25d1245c8a856df0b694e3dc9a Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Mon, 9 Dec 2019 13:05:08 +0200 Subject: [PATCH 57/99] [BAEL-16670] - Re-organize spring-cloud-kubernetes Project --- spring-cloud/spring-cloud-kubernetes/README.md | 4 ++-- .../{ => kubernetes-guide}/client-service/.gitignore | 0 .../{ => kubernetes-guide}/client-service/Dockerfile | 0 .../client-service/client-config.yaml | 0 .../client-service/client-service-deployment.yaml | 0 .../{ => kubernetes-guide}/client-service/pom.xml | 1 + .../spring/cloud/kubernetes/client/Application.java | 0 .../spring/cloud/kubernetes/client/ClientConfig.java | 0 .../cloud/kubernetes/client/ClientController.java | 0 .../cloud/kubernetes/client/RibbonConfiguration.java | 0 .../cloud/kubernetes/client/TravelAgencyService.java | 0 .../src/main/resources/application.yaml | 0 .../client-service/src/main/resources/logback.xml | 0 .../test/java/org/baeldung/SpringContextTest.java | 0 .../deployment-travel-client.sh | 0 .../travel-agency-service/Dockerfile | 0 .../travel-agency-service/mongo-deployment.yaml | 0 .../travel-agency-service/pom.xml | 1 + .../travel-agency-service/secret.yaml | 0 .../cloud/kubernetes/travelagency/Application.java | 0 .../controller/TravelAgencyController.java | 0 .../kubernetes/travelagency/model/TravelDeal.java | 0 .../repository/TravelDealRepository.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback-spring.xml | 0 .../src/main/resources/logback.xml | 0 .../kubernetes/travelagency/SpringContextTest.java | 0 .../travel-agency-deployment.yaml | 0 .../demo-backend/.gitignore | 0 .../demo-backend/Dockerfile | 0 .../{ => kubernetes-minikube}/demo-backend/pom.xml | 1 + .../backend/KubernetesBackendApplication.java | 0 .../src/main/resources/application.properties | 0 .../demo-backend/src/main/resources/logback.xml | 0 .../test/java/org/baeldung/SpringContextTest.java | 0 .../demo-frontend/.gitignore | 0 .../demo-frontend/Dockerfile | 0 .../{ => kubernetes-minikube}/demo-frontend/pom.xml | 1 + .../frontend/KubernetesFrontendApplication.java | 0 .../src/main/resources/application.properties | 0 .../demo-frontend/src/main/resources/logback.xml | 0 .../test/java/org/baeldung/SpringContextTest.java | 0 .../object-configurations/backend-deployment.yaml | 0 .../object-configurations/frontend-deployment.yaml | 0 .../liveness-example/Dockerfile | 0 .../liveness-example/pom.xml | 2 +- .../main/java/com/baeldung/liveness/Application.java | 0 .../liveness/health/CustomHealthIndicator.java | 0 .../main/resources/resources/application.properties | 0 .../src/main/resources/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 .../liveness-example-k8s-template.yaml | 0 .../readiness-example-k8s-template.yaml | 0 .../readiness-example/Dockerfile | 0 .../readiness-example/pom.xml | 2 +- .../java/com/baeldung/readiness/Application.java | 0 .../readiness/health/CustomHealthIndicator.java | 0 .../main/resources/resources/application.properties | 0 .../src/main/resources/resources/logback.xml | 0 .../test/java/com/baeldung/SpringContextTest.java | 0 spring-cloud/spring-cloud-kubernetes/pom.xml | 12 ++++++------ 61 files changed, 14 insertions(+), 10 deletions(-) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/.gitignore (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/Dockerfile (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/client-config.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/client-service-deployment.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/pom.xml (98%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/Application.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientConfig.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientController.java (100%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/RibbonConfiguration.java (100%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/TravelAgencyService.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/resources/application.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/main/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/client-service/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/deployment-travel-client.sh (100%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/Dockerfile (100%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/mongo-deployment.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/pom.xml (97%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/secret.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/Application.java (100%) mode change 100755 => 100644 rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/controller/TravelAgencyController.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/model/TravelDeal.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/repository/TravelDealRepository.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/resources/application.properties (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/resources/logback-spring.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/main/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-guide}/travel-agency-service/travel-agency-deployment.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/.gitignore (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/Dockerfile (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/pom.xml (94%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/src/main/resources/application.properties (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/src/main/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-backend/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/.gitignore (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/Dockerfile (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/pom.xml (94%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/src/main/resources/application.properties (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/src/main/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/object-configurations/backend-deployment.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-minikube}/object-configurations/frontend-deployment.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/Dockerfile (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/pom.xml (96%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/src/main/java/com/baeldung/liveness/Application.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/src/main/resources/resources/application.properties (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/src/main/resources/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/liveness-example/src/test/java/com/baeldung/SpringContextTest.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/object-configurations/liveness-example-k8s-template.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/object-configurations/readiness-example-k8s-template.yaml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/Dockerfile (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/pom.xml (96%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/src/main/java/com/baeldung/readiness/Application.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/src/main/resources/resources/application.properties (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/src/main/resources/resources/logback.xml (100%) rename spring-cloud/spring-cloud-kubernetes/{ => kubernetes-selfhealing}/readiness-example/src/test/java/com/baeldung/SpringContextTest.java (100%) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md index b64ad65ef9..328b870a44 100644 --- a/spring-cloud/spring-cloud-kubernetes/README.md +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -1,9 +1,9 @@ ## Spring Cloud Kubernetes -This moudle contains articles about Spring Cloud Kubernetes +This module contains articles about Spring Cloud Kubernetes. ### Relevant Articles: -- [Running Spring Boot Applications With Minikube](https://www.baeldung.com/spring-boot-minikube) +- [Running Spring Boot Applications with Minikube](https://www.baeldung.com/spring-boot-minikube) - [Self-Healing Applications with Kubernetes and Spring Boot](https://www.baeldung.com/spring-boot-kubernetes-self-healing-apps) - [Guide to Spring Cloud Kubernetes](https://www.baeldung.com/spring-cloud-kubernetes) diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/.gitignore b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/.gitignore similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/.gitignore rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/.gitignore diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/Dockerfile similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/client-config.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/client-config.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/client-config.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/client-config.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/client-service-deployment.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/client-service-deployment.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/client-service-deployment.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/client-service-deployment.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml similarity index 98% rename from spring-cloud/spring-cloud-kubernetes/client-service/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml index eb0b0fb580..e5f76d5d9c 100644 --- a/spring-cloud/spring-cloud-kubernetes/client-service/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/pom.xml @@ -10,6 +10,7 @@ com.baeldung.spring.cloud spring-cloud-kubernetes 1.0-SNAPSHOT + ../../../spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/Application.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/Application.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/Application.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/Application.java diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientConfig.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientConfig.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientConfig.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientConfig.java diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientController.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientController.java old mode 100755 new mode 100644 similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientController.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/ClientController.java diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/RibbonConfiguration.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/RibbonConfiguration.java old mode 100755 new mode 100644 similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/RibbonConfiguration.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/RibbonConfiguration.java diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/TravelAgencyService.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/TravelAgencyService.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/TravelAgencyService.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/java/com/baeldung/spring/cloud/kubernetes/client/TravelAgencyService.java diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/resources/application.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/resources/application.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/resources/application.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/resources/application.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/main/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/main/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/main/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/client-service/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/client-service/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/client-service/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/deployment-travel-client.sh b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/deployment-travel-client.sh old mode 100755 new mode 100644 similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/deployment-travel-client.sh rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/deployment-travel-client.sh diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/Dockerfile old mode 100755 new mode 100644 similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/mongo-deployment.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/mongo-deployment.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/mongo-deployment.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/mongo-deployment.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml old mode 100755 new mode 100644 similarity index 97% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml index 32fe0ff277..93734a19a7 --- a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/pom.xml @@ -9,6 +9,7 @@ com.baeldung.spring.cloud spring-cloud-kubernetes 1.0-SNAPSHOT + ../../../spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/secret.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/secret.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/secret.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/secret.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/Application.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/Application.java old mode 100755 new mode 100644 similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/Application.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/Application.java diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/controller/TravelAgencyController.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/controller/TravelAgencyController.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/controller/TravelAgencyController.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/controller/TravelAgencyController.java diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/model/TravelDeal.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/model/TravelDeal.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/model/TravelDeal.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/model/TravelDeal.java diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/repository/TravelDealRepository.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/repository/TravelDealRepository.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/repository/TravelDealRepository.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/java/com/baeldung/spring/cloud/kubernetes/travelagency/repository/TravelDealRepository.java diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/application.properties rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/application.properties diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/logback-spring.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/logback-spring.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/logback-spring.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/logback-spring.xml diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/main/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/main/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/src/test/java/com/baeldung/spring/cloud/kubernetes/travelagency/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/travel-agency-service/travel-agency-deployment.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/travel-agency-deployment.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/travel-agency-service/travel-agency-deployment.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-guide/travel-agency-service/travel-agency-deployment.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/.gitignore b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/.gitignore similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/.gitignore rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/.gitignore diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml similarity index 94% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml index 7c39338557..5bd7d3f5ea 100644 --- a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/pom.xml @@ -9,6 +9,7 @@ com.baeldung.spring.cloud spring-cloud-kubernetes 1.0-SNAPSHOT + ../../../spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/java/com/baeldung/spring/cloud/kubernetes/backend/KubernetesBackendApplication.java diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/resources/application.properties rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/application.properties diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/src/main/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/main/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-backend/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-backend/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/.gitignore b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/.gitignore similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/.gitignore rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/.gitignore diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml similarity index 94% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml index aaba6d0503..9a4924b903 100644 --- a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/pom.xml @@ -9,6 +9,7 @@ com.baeldung.spring.cloud spring-cloud-kubernetes 1.0-SNAPSHOT + ../../../spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/java/com/baeldung/spring/cloud/kubernetes/frontend/KubernetesFrontendApplication.java diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/resources/application.properties rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/application.properties diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/src/main/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/main/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/demo-frontend/src/test/java/org/baeldung/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/backend-deployment.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/object-configurations/backend-deployment.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/backend-deployment.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/frontend-deployment.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/object-configurations/frontend-deployment.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-minikube/object-configurations/frontend-deployment.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/Dockerfile similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml similarity index 96% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml index 4dc25deec0..66d8f096ce 100644 --- a/spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-boot-1 0.0.1-SNAPSHOT - ../../../parent-boot-1 + ../../../../parent-boot-1 diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/java/com/baeldung/liveness/Application.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/java/com/baeldung/liveness/Application.java diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/resources/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/resources/resources/application.properties diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/resources/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/main/resources/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/liveness-example/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/object-configurations/liveness-example-k8s-template.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/object-configurations/liveness-example-k8s-template.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/object-configurations/readiness-example-k8s-template.yaml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/object-configurations/readiness-example-k8s-template.yaml diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/Dockerfile similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/Dockerfile diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml similarity index 96% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml index 5a10161200..fbb9e09d07 100644 --- a/spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/pom.xml @@ -11,7 +11,7 @@ com.baeldung parent-boot-1 0.0.1-SNAPSHOT - ../../../parent-boot-1 + ../../../../parent-boot-1 diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/java/com/baeldung/readiness/Application.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/java/com/baeldung/readiness/Application.java diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/resources/resources/application.properties similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/resources/resources/application.properties diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/resources/resources/logback.xml similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/logback.xml rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/main/resources/resources/logback.xml diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextTest.java b/spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java similarity index 100% rename from spring-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextTest.java rename to spring-cloud/spring-cloud-kubernetes/kubernetes-selfhealing/readiness-example/src/test/java/com/baeldung/SpringContextTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml index 561c44add3..ed4bccbf78 100644 --- a/spring-cloud/spring-cloud-kubernetes/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/pom.xml @@ -16,12 +16,12 @@ - demo-frontend - demo-backend - liveness-example - readiness-example - client-service - travel-agency-service + kubernetes-minikube/demo-frontend + kubernetes-minikube/demo-backend + kubernetes-selfhealing/liveness-example + kubernetes-selfhealing/readiness-example + kubernetes-guide/client-service + kubernetes-guide/travel-agency-service \ No newline at end of file From a5c276576f69adc2542ae6b59e00374b3c59c9aa Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 9 Dec 2019 20:19:45 +0100 Subject: [PATCH 58/99] BAEL-19878: Upgrade spring-cloud-zuul to Spring Boot 2.2.2 and Spring Cloud Hoxton --- spring-cloud/spring-cloud-zuul/pom.xml | 4 ++-- .../spring-zuul-foos-resource/pom.xml | 4 ---- .../web/controller/FooController.java | 19 +++++-------------- .../main/java/com/baeldung/web/dto/Foo.java | 9 +-------- 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml index 1593bc59e9..b1f2e886de 100644 --- a/spring-cloud/spring-cloud-zuul/pom.xml +++ b/spring-cloud/spring-cloud-zuul/pom.xml @@ -73,8 +73,8 @@ UTF-8 UTF-8 - Finchley.SR1 - 2.0.6.RELEASE + Hoxton.RELEASE + 2.2.2.RELEASE diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml index 57e566657b..f5a8c3b613 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/pom.xml @@ -12,10 +12,6 @@ - - org.springframework.boot - spring-boot-starter-web - org.apache.commons commons-lang3 diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/controller/FooController.java b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/controller/FooController.java index 87f237b75c..f8f07342f6 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/controller/FooController.java +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/controller/FooController.java @@ -1,11 +1,9 @@ package com.baeldung.web.controller; import com.baeldung.web.dto.Foo; -import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -13,22 +11,15 @@ import javax.servlet.http.HttpServletResponse; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import static org.apache.commons.lang3.RandomStringUtils.randomNumeric; -@Controller +@RestController public class FooController { - public FooController() { - super(); - } - - // API - read - @RequestMapping(method = RequestMethod.GET, value = "/foos/{id}") - @ResponseBody + @GetMapping("/foos/{id}") public Foo findById(@PathVariable final long id, HttpServletRequest req, HttpServletResponse res) { - // System.out.println(req.getHeaderNames()); - // System.out.println("------" + req.getHeader("Test")); if (req.getHeader("Test") != null) { res.addHeader("Test", req.getHeader("Test")); } + return new Foo(Long.parseLong(randomNumeric(2)), randomAlphabetic(4)); } diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/dto/Foo.java b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/dto/Foo.java index 107f982f98..b25aef266d 100644 --- a/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/dto/Foo.java +++ b/spring-cloud/spring-cloud-zuul/spring-zuul-foos-resource/src/main/java/com/baeldung/web/dto/Foo.java @@ -1,22 +1,15 @@ package com.baeldung.web.dto; public class Foo { + private long id; private String name; - public Foo() { - super(); - } - public Foo(final long id, final String name) { - super(); - this.id = id; this.name = name; } - // - public long getId() { return id; } From 1306e27e8b9679a248cf2240306fe3d426c986a7 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Mon, 9 Dec 2019 21:54:17 -0500 Subject: [PATCH 59/99] BAEL-3290: Basic injection added --- .../baeldung/dependency/ioc/AppConfig.java | 23 +++++++++++++ .../com/baeldung/dependency/ioc/Item.java | 5 +++ .../baeldung/dependency/ioc/ItemImpl1.java | 5 +++ .../com/baeldung/dependency/ioc/Store.java | 23 +++++++++++++ spring-di/src/main/resources/ioc-context.xml | 33 +++++++++++++++++++ .../dependency/ioc/XmlAppConfigTest.java | 24 ++++++++++++++ 6 files changed, 113 insertions(+) create mode 100644 spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java create mode 100644 spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java create mode 100644 spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java create mode 100644 spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java create mode 100644 spring-di/src/main/resources/ioc-context.xml create mode 100644 spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java b/spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java new file mode 100644 index 0000000000..9eb668df6c --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java @@ -0,0 +1,23 @@ +package com.baeldung.dependency.ioc; + +import org.springframework.context.annotation.Bean; + +public class AppConfig { + + @Bean + public Item item1() { + return new ItemImpl1(); + } + + @Bean + public Store storeThroughConstructorInjection() { + return new Store(item1()); + } + + @Bean + public Store storeThroughSetterInjection() { + Store store = new Store(); + store.setItem(item1()); + return store; + } +} diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java b/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java new file mode 100644 index 0000000000..107560514f --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java @@ -0,0 +1,5 @@ +package com.baeldung.dependency.ioc; + +public interface Item { + +} diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java b/spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java new file mode 100644 index 0000000000..877ccecb0a --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java @@ -0,0 +1,5 @@ +package com.baeldung.dependency.ioc; + +public class ItemImpl1 implements Item { + +} diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java b/spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java new file mode 100644 index 0000000000..e4ff03b30e --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java @@ -0,0 +1,23 @@ +package com.baeldung.dependency.ioc; + +import org.springframework.beans.factory.annotation.Autowired; + +public class Store { + + @Autowired + private Item item; + + public Store() {} + + public Store(Item item) { + this.item = item; + } + + public Item getItem() { + return item; + } + + public void setItem(Item item) { + this.item = item; + } +} diff --git a/spring-di/src/main/resources/ioc-context.xml b/spring-di/src/main/resources/ioc-context.xml new file mode 100644 index 0000000000..df1165f557 --- /dev/null +++ b/spring-di/src/main/resources/ioc-context.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java b/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java new file mode 100644 index 0000000000..c13074281f --- /dev/null +++ b/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java @@ -0,0 +1,24 @@ +package com.baeldung.dependency.ioc; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/ioc-context.xml") +public class XmlAppConfigTest { + + @Autowired + @Qualifier("xml-store-by-constructor") + private Store storeByConstructorInjection; + + @Test + public void givenValidXmlConfig_WhenInjectStoreByConstructorInject_ThenBeanIsNotNull() { + assertNotNull(storeByConstructorInjection); + } +} From e56dc9830e2acf3cbe69c2e540ba762d18c5bc5b Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 10 Dec 2019 08:23:01 -0500 Subject: [PATCH 60/99] BAEL-3290: Added test cases to exercise DI configuration --- .../com/baeldung/dependency/ioc/Item.java | 5 -- .../ioc => org/baeldung/store}/AppConfig.java | 2 +- .../main/java/org/baeldung/store/Item.java | 5 ++ .../ioc => org/baeldung/store}/ItemImpl1.java | 2 +- .../ioc => org/baeldung/store}/Store.java | 2 +- spring-di/src/main/resources/ioc-context.xml | 2 +- .../dependency/ioc/XmlAppConfigTest.java | 24 ---------- .../org/baeldung/store/AppConfigUnitTest.java | 36 +++++++++++++++ .../baeldung/store/XmlAppConfigUnitTest.java | 46 +++++++++++++++++++ 9 files changed, 91 insertions(+), 33 deletions(-) delete mode 100644 spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java rename spring-di/src/main/java/{com/baeldung/dependency/ioc => org/baeldung/store}/AppConfig.java (91%) create mode 100644 spring-di/src/main/java/org/baeldung/store/Item.java rename spring-di/src/main/java/{com/baeldung/dependency/ioc => org/baeldung/store}/ItemImpl1.java (54%) rename spring-di/src/main/java/{com/baeldung/dependency/ioc => org/baeldung/store}/Store.java (90%) delete mode 100644 spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java create mode 100644 spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java create mode 100644 spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java b/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java deleted file mode 100644 index 107560514f..0000000000 --- a/spring-di/src/main/java/com/baeldung/dependency/ioc/Item.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.dependency.ioc; - -public interface Item { - -} diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java b/spring-di/src/main/java/org/baeldung/store/AppConfig.java similarity index 91% rename from spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java rename to spring-di/src/main/java/org/baeldung/store/AppConfig.java index 9eb668df6c..80b6733dff 100644 --- a/spring-di/src/main/java/com/baeldung/dependency/ioc/AppConfig.java +++ b/spring-di/src/main/java/org/baeldung/store/AppConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.dependency.ioc; +package org.baeldung.store; import org.springframework.context.annotation.Bean; diff --git a/spring-di/src/main/java/org/baeldung/store/Item.java b/spring-di/src/main/java/org/baeldung/store/Item.java new file mode 100644 index 0000000000..1d7292fc35 --- /dev/null +++ b/spring-di/src/main/java/org/baeldung/store/Item.java @@ -0,0 +1,5 @@ +package org.baeldung.store; + +public interface Item { + +} diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java b/spring-di/src/main/java/org/baeldung/store/ItemImpl1.java similarity index 54% rename from spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java rename to spring-di/src/main/java/org/baeldung/store/ItemImpl1.java index 877ccecb0a..8bda9f24c9 100644 --- a/spring-di/src/main/java/com/baeldung/dependency/ioc/ItemImpl1.java +++ b/spring-di/src/main/java/org/baeldung/store/ItemImpl1.java @@ -1,4 +1,4 @@ -package com.baeldung.dependency.ioc; +package org.baeldung.store; public class ItemImpl1 implements Item { diff --git a/spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java b/spring-di/src/main/java/org/baeldung/store/Store.java similarity index 90% rename from spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java rename to spring-di/src/main/java/org/baeldung/store/Store.java index e4ff03b30e..dcc2c3be48 100644 --- a/spring-di/src/main/java/com/baeldung/dependency/ioc/Store.java +++ b/spring-di/src/main/java/org/baeldung/store/Store.java @@ -1,4 +1,4 @@ -package com.baeldung.dependency.ioc; +package org.baeldung.store; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-di/src/main/resources/ioc-context.xml b/spring-di/src/main/resources/ioc-context.xml index df1165f557..4ea97fe644 100644 --- a/spring-di/src/main/resources/ioc-context.xml +++ b/spring-di/src/main/resources/ioc-context.xml @@ -8,7 +8,7 @@ - + diff --git a/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java b/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java deleted file mode 100644 index c13074281f..0000000000 --- a/spring-di/src/test/java/com/baeldung/dependency/ioc/XmlAppConfigTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.dependency.ioc; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration("classpath:/ioc-context.xml") -public class XmlAppConfigTest { - - @Autowired - @Qualifier("xml-store-by-constructor") - private Store storeByConstructorInjection; - - @Test - public void givenValidXmlConfig_WhenInjectStoreByConstructorInject_ThenBeanIsNotNull() { - assertNotNull(storeByConstructorInjection); - } -} diff --git a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java new file mode 100644 index 0000000000..54c2bc0b34 --- /dev/null +++ b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java @@ -0,0 +1,36 @@ +package org.baeldung.store; + + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = AppConfig.class) +public class AppConfigUnitTest { + + @Autowired + @Qualifier("storeThroughConstructorInjection") + private Store storeByConstructorInjection; + + @Autowired + @Qualifier("storeThroughSetterInjection") + private Store storeBySetterInjection; + + @Test + public void givenValidXmlConfig_WhenInjectStoreByConstructorInjection_ThenBeanIsNotNull() { + assertNotNull(storeByConstructorInjection); + assertNotNull(storeByConstructorInjection.getItem()); + } + + @Test + public void givenValidXmlConfig_WhenInjectStoreBySetterInjection_ThenBeanIsNotNull() { + assertNotNull(storeBySetterInjection); + assertNotNull(storeByConstructorInjection.getItem()); + } +} diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java new file mode 100644 index 0000000000..a032ae8df5 --- /dev/null +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java @@ -0,0 +1,46 @@ +package org.baeldung.store; + + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/ioc-context.xml") +public class XmlAppConfigUnitTest { + + @Autowired + @Qualifier("xml-store-by-constructor") + private Store storeByConstructorInjection; + + @Autowired + @Qualifier("xml-store-by-setter") + private Store storeBySetterInjection; + + @Autowired + @Qualifier("xml-store-by-setter-lazy") + private Store storeBySetterInjectionLazy; + + @Test + public void givenValidXmlConfig_WhenInjectStoreByConstructorInjection_ThenBeanIsNotNull() { + assertNotNull(storeByConstructorInjection); + assertNotNull(storeByConstructorInjection.getItem()); + } + + @Test + public void givenValidXmlConfig_WhenInjectStoreBySetterInjection_ThenBeanIsNotNull() { + assertNotNull(storeBySetterInjection); + assertNotNull(storeByConstructorInjection.getItem()); + } + + @Test + public void givenValidXmlConfig_WhenInjectStoreBySetterInjectionLazy_ThenBeanIsNotNull() { + assertNotNull(storeBySetterInjectionLazy); + assertNotNull(storeByConstructorInjection.getItem()); + } +} From 08fd6c5c4a5d763638ee452be5622064965fa7de Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 10 Dec 2019 08:35:09 -0500 Subject: [PATCH 61/99] BAEL-3290: Added unit test for autowiring by type --- .../main/resources/ioc-context-by-type.xml | 14 ++++++++ spring-di/src/main/resources/ioc-context.xml | 5 +-- .../store/XmlAppConfigByTypeUnitTest.java | 32 +++++++++++++++++++ .../baeldung/store/XmlAppConfigUnitTest.java | 10 ++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 spring-di/src/main/resources/ioc-context-by-type.xml create mode 100644 spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java diff --git a/spring-di/src/main/resources/ioc-context-by-type.xml b/spring-di/src/main/resources/ioc-context-by-type.xml new file mode 100644 index 0000000000..39a21b6917 --- /dev/null +++ b/spring-di/src/main/resources/ioc-context-by-type.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/ioc-context.xml b/spring-di/src/main/resources/ioc-context.xml index 4ea97fe644..47f7da8959 100644 --- a/spring-di/src/main/resources/ioc-context.xml +++ b/spring-di/src/main/resources/ioc-context.xml @@ -18,9 +18,10 @@ - + - + + diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java new file mode 100644 index 0000000000..2dd5f1fcb9 --- /dev/null +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java @@ -0,0 +1,32 @@ +package org.baeldung.store; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Separate unit test class where only one Item object is available for + * autowiring. If the ioc-context.xml were used for autowiring by type, there + * would be multiple qualifying Item objects, causing a failure. + * + * @author Justin Albano + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:/ioc-context-by-type.xml") +public class XmlAppConfigByTypeUnitTest { + + @Autowired + @Qualifier("xml-store-by-autowire-type") + private Store storeByAutowireInjectionByType; + + @Test + public void givenValidXmlConfig_WhenInjectStoreByAutowireInjectionByType_ThenBeanIsNotNull() { + assertNotNull(storeByAutowireInjectionByType); + assertNotNull(storeByAutowireInjectionByType.getItem()); + } +} diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java index a032ae8df5..79fabfd84e 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java @@ -21,6 +21,10 @@ public class XmlAppConfigUnitTest { @Autowired @Qualifier("xml-store-by-setter") private Store storeBySetterInjection; + + @Autowired + @Qualifier("xml-store-by-autowire-name") + private Store storeByAutowireInjectionByName; @Autowired @Qualifier("xml-store-by-setter-lazy") @@ -38,6 +42,12 @@ public class XmlAppConfigUnitTest { assertNotNull(storeByConstructorInjection.getItem()); } + @Test + public void givenValidXmlConfig_WhenInjectStoreByAutowireInjectionByName_ThenBeanIsNotNull() { + assertNotNull(storeByAutowireInjectionByName); + assertNotNull(storeByAutowireInjectionByName.getItem()); + } + @Test public void givenValidXmlConfig_WhenInjectStoreBySetterInjectionLazy_ThenBeanIsNotNull() { assertNotNull(storeBySetterInjectionLazy); From d8dc1cc37f2184b081d367f708f0e3e2f589a249 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 10 Dec 2019 15:48:47 +0000 Subject: [PATCH 62/99] Changing test method names to conform to standard --- .../switchExpression/SwitchExpressionsUnitTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java index 00f42813b4..bb9250f000 100644 --- a/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java +++ b/core-java-modules/core-java-13/src/test/java/com/baeldung/switchExpression/SwitchExpressionsUnitTest.java @@ -14,7 +14,7 @@ public class SwitchExpressionsUnitTest { @Test @SuppressWarnings ("preview") - public void switchExpression() { + public void whenSwitchingOverMonthJune_thenWillReturn3() { var month = JUNE; @@ -30,7 +30,7 @@ public class SwitchExpressionsUnitTest { @Test @SuppressWarnings ("preview") - public void switchExpressionWithYieldKeyword() { + public void whenSwitchingOverMonthAugust_thenWillReturn24() { var month = AUGUST; var result = switch (month) { @@ -48,7 +48,7 @@ public class SwitchExpressionsUnitTest { @Test @SuppressWarnings ("preview") - public void switchStatementWithReturnInsideBlock() { + public void whenSwitchingOverMonthJanuary_thenWillReturn3() { Function func = (month) -> { switch (month) { @@ -62,7 +62,7 @@ public class SwitchExpressionsUnitTest { @Test @SuppressWarnings ("preview") - public void switchExpressionWithAllCasesCovered() { + public void whenSwitchingOverMonthAugust_thenWillReturn2() { var month = AUGUST; var result = switch (month) { From 71d61b945bea04721fb1d2801f8290614cb23718 Mon Sep 17 00:00:00 2001 From: M-Abdelbaset <31687750+M-Abdelbaset@users.noreply.github.com> Date: Tue, 10 Dec 2019 19:13:07 +0200 Subject: [PATCH 63/99] Bael 3395 - spring optional path var (#8341) * initial test cases * changes in @requestMapping * moving code to spring-mvc-basic-2 project * moving Article class --- .../{model => controller/optionalpathvars}/Article.java | 2 +- .../optionalpathvars/ArticleViewerController.java | 4 +--- .../ArticleViewerWithMapParamController.java | 4 +--- .../ArticleViewerWithOptionalParamController.java | 6 ++---- .../ArticleViewerWithRequiredAttributeController.java | 6 ++---- .../ArticleViewerWithTwoSeparateMethodsController.java | 4 +--- ...cleViewerControllerWithOptionalParamIntegrationTest.java | 2 -- ...iewerControllerWithRequiredAttributeIntegrationTest.java | 2 -- .../ArticleViewerWithMapParamIntegrationTest.java | 2 -- .../ArticleViewerWithTwoSeparateMethodsIntegrationTest.java | 2 -- 10 files changed, 8 insertions(+), 26 deletions(-) rename spring-mvc-basics-2/src/main/java/com/baeldung/{model => controller/optionalpathvars}/Article.java (87%) diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/model/Article.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/Article.java similarity index 87% rename from spring-mvc-basics-2/src/main/java/com/baeldung/model/Article.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/Article.java index 141bd17db7..f6675295ed 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/model/Article.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/Article.java @@ -1,4 +1,4 @@ -package com.baeldung.model; +package com.baeldung.controller.optionalpathvars; public class Article { diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerController.java index 62c2502242..14b16e148b 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerController.java @@ -1,13 +1,11 @@ package com.baeldung.controller.optionalpathvars; -import static com.baeldung.model.Article.DEFAULT_ARTICLE; +import static com.baeldung.controller.optionalpathvars.Article.DEFAULT_ARTICLE; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.model.Article; - @RestController public class ArticleViewerController { diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamController.java index d16cf4115c..50744b6067 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamController.java @@ -1,6 +1,6 @@ package com.baeldung.controller.optionalpathvars; -import static com.baeldung.model.Article.DEFAULT_ARTICLE; +import static com.baeldung.controller.optionalpathvars.Article.DEFAULT_ARTICLE; import java.util.Map; @@ -8,8 +8,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.model.Article; - @RestController @RequestMapping(value = "/mapParam") public class ArticleViewerWithMapParamController { diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithOptionalParamController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithOptionalParamController.java index fd7b900535..ff645fbcc7 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithOptionalParamController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithOptionalParamController.java @@ -1,14 +1,12 @@ package com.baeldung.controller.optionalpathvars; -import static com.baeldung.model.Article.DEFAULT_ARTICLE; +import static com.baeldung.controller.optionalpathvars.Article.DEFAULT_ARTICLE; import java.util.Optional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.model.Article;; +import org.springframework.web.bind.annotation.RestController;; @RestController @RequestMapping("/optionalParam") diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithRequiredAttributeController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithRequiredAttributeController.java index d9b36f93e8..8cd1539391 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithRequiredAttributeController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithRequiredAttributeController.java @@ -1,12 +1,10 @@ package com.baeldung.controller.optionalpathvars; -import static com.baeldung.model.Article.DEFAULT_ARTICLE; +import static com.baeldung.controller.optionalpathvars.Article.DEFAULT_ARTICLE; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.model.Article;; +import org.springframework.web.bind.annotation.RestController;; @RestController @RequestMapping(value = "/requiredAttribute") diff --git a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsController.java index 0b66b6cf43..0ea401a589 100644 --- a/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsController.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsController.java @@ -1,13 +1,11 @@ package com.baeldung.controller.optionalpathvars; -import static com.baeldung.model.Article.DEFAULT_ARTICLE; +import static com.baeldung.controller.optionalpathvars.Article.DEFAULT_ARTICLE; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.model.Article; - @RestController @RequestMapping(value = "/seperateMethods") public class ArticleViewerWithTwoSeparateMethodsController { diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java index 629e37f963..c7b568b68e 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithOptionalParamIntegrationTest.java @@ -12,8 +12,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; - -import com.baeldung.model.Article; import org.baeldung.controller.config.WebConfig; @RunWith(SpringJUnit4ClassRunner.class) diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java index 00494171c0..760d94af17 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerControllerWithRequiredAttributeIntegrationTest.java @@ -12,8 +12,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; - -import com.baeldung.model.Article; import org.baeldung.controller.config.WebConfig; @RunWith(SpringJUnit4ClassRunner.class) diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java index 3c82b11578..fca6bba5fd 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithMapParamIntegrationTest.java @@ -12,8 +12,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; - -import com.baeldung.model.Article; import org.baeldung.controller.config.WebConfig; @RunWith(SpringJUnit4ClassRunner.class) diff --git a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java index 9532270c43..5d2733ec92 100644 --- a/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/com/baeldung/controller/optionalpathvars/ArticleViewerWithTwoSeparateMethodsIntegrationTest.java @@ -12,8 +12,6 @@ import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; - -import com.baeldung.model.Article; import org.baeldung.controller.config.WebConfig; @RunWith(SpringJUnit4ClassRunner.class) From 0d0216b113229cc076d85760240265e131a7f296 Mon Sep 17 00:00:00 2001 From: Rui Vilao Date: Tue, 10 Dec 2019 19:11:50 +0100 Subject: [PATCH 64/99] Moves the fetchmode code to hibernate mapping. --- .../src/main/java/com/baeldung/hibernate}/fetchMode/Customer.java | 0 .../src/main/java/com/baeldung/hibernate}/fetchMode/Order.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename persistence-modules/{hibernate5-2/src/main/java/com/baeldung => hibernate-mapping/src/main/java/com/baeldung/hibernate}/fetchMode/Customer.java (100%) rename persistence-modules/{hibernate5-2/src/main/java/com/baeldung => hibernate-mapping/src/main/java/com/baeldung/hibernate}/fetchMode/Order.java (100%) diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/fetchMode/Customer.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java similarity index 100% rename from persistence-modules/hibernate5-2/src/main/java/com/baeldung/fetchMode/Customer.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Customer.java diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/fetchMode/Order.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java similarity index 100% rename from persistence-modules/hibernate5-2/src/main/java/com/baeldung/fetchMode/Order.java rename to persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/fetchMode/Order.java From 6571103c5cea19386db53ded6c951e129ea88a55 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 10 Dec 2019 18:37:06 +0000 Subject: [PATCH 65/99] Moving code for multiple-http-servlet-request article from spring-core to spring-mvc (#8329) --- .../org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java | 0 .../org/baeldung/cachedrequest/CachedBodyServletInputStream.java | 0 .../java/org/baeldung/cachedrequest/ContentCachingFilter.java | 0 .../java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java | 0 .../src/main/java/org/baeldung/cachedrequest/Person.java | 0 .../main/java/org/baeldung/cachedrequest/PersonController.java | 0 .../org/baeldung/cachedrequest/PrintRequestContentFilter.java | 0 .../cachedrequest/CachedBodyHttpServletRequestUnitTest.java | 0 .../cachedrequest/CachedBodyServletInputStreamUnitTest.java | 0 .../org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java | 0 .../baeldung/cachedrequest/PersonControllerIntegrationTest.java | 0 .../baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/CachedBodyServletInputStream.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/ContentCachingFilter.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/Person.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/PersonController.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/org/baeldung/cachedrequest/PrintRequestContentFilter.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/test/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/test/java/org/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/test/java/org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/test/java/org/baeldung/cachedrequest/PersonControllerIntegrationTest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/test/java/org/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java (100%) diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequest.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/CachedBodyServletInputStream.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/CachedBodyServletInputStream.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/CachedBodyServletInputStream.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/CachedBodyServletInputStream.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/ContentCachingFilter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/ContentCachingFilter.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/ContentCachingFilter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/ContentCachingFilter.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/HttpRequestDemoConfig.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/Person.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/Person.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/Person.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/Person.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/PersonController.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/PersonController.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/PersonController.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/PersonController.java diff --git a/spring-core-2/src/main/java/org/baeldung/cachedrequest/PrintRequestContentFilter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/PrintRequestContentFilter.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/cachedrequest/PrintRequestContentFilter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/cachedrequest/PrintRequestContentFilter.java diff --git a/spring-core-2/src/test/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java b/spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java rename to spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/CachedBodyHttpServletRequestUnitTest.java diff --git a/spring-core-2/src/test/java/org/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java b/spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java rename to spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/CachedBodyServletInputStreamUnitTest.java diff --git a/spring-core-2/src/test/java/org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java b/spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java rename to spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/ContentCachingFilterUnitTest.java diff --git a/spring-core-2/src/test/java/org/baeldung/cachedrequest/PersonControllerIntegrationTest.java b/spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/PersonControllerIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/cachedrequest/PersonControllerIntegrationTest.java rename to spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/PersonControllerIntegrationTest.java diff --git a/spring-core-2/src/test/java/org/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java b/spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java rename to spring-mvc-simple-2/src/test/java/org/baeldung/cachedrequest/PrintRequestContentFilterUnitTest.java From 036dd985e1af091011d28e4d1d6dba40aca3646a Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 07:57:32 -0500 Subject: [PATCH 66/99] BAEL-3290: Corrected formatting and removed author line in class comment --- .../src/test/java/org/baeldung/store/AppConfigUnitTest.java | 1 - .../java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java | 2 -- .../src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java | 1 - 3 files changed, 4 deletions(-) diff --git a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java index 54c2bc0b34..3260114679 100644 --- a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java @@ -1,6 +1,5 @@ package org.baeldung.store; - import static org.junit.Assert.assertNotNull; import org.junit.Test; diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java index 2dd5f1fcb9..036399e537 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java @@ -13,8 +13,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Separate unit test class where only one Item object is available for * autowiring. If the ioc-context.xml were used for autowiring by type, there * would be multiple qualifying Item objects, causing a failure. - * - * @author Justin Albano */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:/ioc-context-by-type.xml") diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java index 79fabfd84e..2dd4d6ccd6 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java @@ -1,6 +1,5 @@ package org.baeldung.store; - import static org.junit.Assert.assertNotNull; import org.junit.Test; From 443ce367b8e197e0318b5994c069343757a54af7 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 08:01:53 -0500 Subject: [PATCH 67/99] Revert "BAEL-3290: Corrected formatting and removed author line in class comment" This reverts commit 036dd985e1af091011d28e4d1d6dba40aca3646a. --- .../src/test/java/org/baeldung/store/AppConfigUnitTest.java | 1 + .../java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java | 2 ++ .../src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java | 1 + 3 files changed, 4 insertions(+) diff --git a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java index 3260114679..54c2bc0b34 100644 --- a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java @@ -1,5 +1,6 @@ package org.baeldung.store; + import static org.junit.Assert.assertNotNull; import org.junit.Test; diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java index 036399e537..2dd5f1fcb9 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java @@ -13,6 +13,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Separate unit test class where only one Item object is available for * autowiring. If the ioc-context.xml were used for autowiring by type, there * would be multiple qualifying Item objects, causing a failure. + * + * @author Justin Albano */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:/ioc-context-by-type.xml") diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java index 2dd4d6ccd6..79fabfd84e 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java @@ -1,5 +1,6 @@ package org.baeldung.store; + import static org.junit.Assert.assertNotNull; import org.junit.Test; From 9aff76fcf8b4caf0e3ee1f04df37f778094a06d1 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 08:26:29 -0500 Subject: [PATCH 68/99] BAEL-3290: Corrected formatting --- .../main/resources/ioc-context-by-type.xml | 12 ++--- spring-di/src/main/resources/ioc-context.xml | 48 +++++++++---------- .../org/baeldung/store/AppConfigUnitTest.java | 1 - .../store/XmlAppConfigByTypeUnitTest.java | 2 - .../baeldung/store/XmlAppConfigUnitTest.java | 1 - 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/spring-di/src/main/resources/ioc-context-by-type.xml b/spring-di/src/main/resources/ioc-context-by-type.xml index 39a21b6917..1249ce51af 100644 --- a/spring-di/src/main/resources/ioc-context-by-type.xml +++ b/spring-di/src/main/resources/ioc-context-by-type.xml @@ -1,14 +1,14 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - + - - + + \ No newline at end of file diff --git a/spring-di/src/main/resources/ioc-context.xml b/spring-di/src/main/resources/ioc-context.xml index 47f7da8959..0e1d0ac29c 100644 --- a/spring-di/src/main/resources/ioc-context.xml +++ b/spring-di/src/main/resources/ioc-context.xml @@ -1,34 +1,34 @@ - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java index 54c2bc0b34..3260114679 100644 --- a/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/AppConfigUnitTest.java @@ -1,6 +1,5 @@ package org.baeldung.store; - import static org.junit.Assert.assertNotNull; import org.junit.Test; diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java index 2dd5f1fcb9..036399e537 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigByTypeUnitTest.java @@ -13,8 +13,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; * Separate unit test class where only one Item object is available for * autowiring. If the ioc-context.xml were used for autowiring by type, there * would be multiple qualifying Item objects, causing a failure. - * - * @author Justin Albano */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:/ioc-context-by-type.xml") diff --git a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java index 79fabfd84e..2dd4d6ccd6 100644 --- a/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java +++ b/spring-di/src/test/java/org/baeldung/store/XmlAppConfigUnitTest.java @@ -1,6 +1,5 @@ package org.baeldung.store; - import static org.junit.Assert.assertNotNull; import org.junit.Test; From fdf40ec8671658a8d00d635fab86f049bc89b745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Dupire?= Date: Wed, 11 Dec 2019 19:25:03 +0100 Subject: [PATCH 69/99] dupirefr/dupire.francois+pro@gmail.com [BAEL-3445] Cucumber Backgrounds (Moved package) (#8350) * [BAEL-3445] Added Background examples to Cucumber examples * [BAEL-3445] Copied code to have a package dedicated to the article * [BAEL-3445] Removed code from other package --- .../baeldung/cucumber/books/BookStore.java | 6 -- .../cucumberbackground/books/Book.java | 35 +++++++++++ .../cucumberbackground/books/BookStore.java | 28 +++++++++ .../cucumber/books/BookStoreRunSteps.java | 5 -- .../books/BookStoreRunSteps.java | 58 +++++++++++++++++++ ...ookStoreWithBackgroundIntegrationTest.java | 12 ++++ ...StoreWithoutBackgroundIntegrationTest.java | 12 ++++ 7 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/Book.java create mode 100644 testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/BookStore.java create mode 100644 testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreRunSteps.java create mode 100644 testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithBackgroundIntegrationTest.java create mode 100644 testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithoutBackgroundIntegrationTest.java diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/books/BookStore.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/books/BookStore.java index 4ccfe61542..da9b711a16 100644 --- a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/books/BookStore.java +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/books/BookStore.java @@ -19,10 +19,4 @@ public class BookStore { .filter(book -> Objects.equals(author, book.getAuthor())) .collect(Collectors.toList()); } - - public Optional bookByTitle(String title) { - return books.stream() - .filter(book -> book.getTitle().equals(title)) - .findFirst(); - } } diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/Book.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/Book.java new file mode 100644 index 0000000000..5fd1e680a0 --- /dev/null +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/Book.java @@ -0,0 +1,35 @@ +package com.baeldung.cucumberbackground.books; + +public class Book { + + private String title; + private String author; + + public Book(String title, String author) { + this.title = title; + this.author = author; + } + + public Book() {} + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + @Override + public String toString() { + return "Book [title=" + title + ", author=" + author + "]"; + } +} diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/BookStore.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/BookStore.java new file mode 100644 index 0000000000..f22eecb5f3 --- /dev/null +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumberbackground/books/BookStore.java @@ -0,0 +1,28 @@ +package com.baeldung.cucumberbackground.books; + +import java.util.*; +import java.util.stream.Collectors; + +public class BookStore { + private List books = new ArrayList<>(); + + public void addBook(Book book) { + books.add(book); + } + + public void addAllBooks(Collection books) { + this.books.addAll(books); + } + + public List booksByAuthor(String author) { + return books.stream() + .filter(book -> Objects.equals(author, book.getAuthor())) + .collect(Collectors.toList()); + } + + public Optional bookByTitle(String title) { + return books.stream() + .filter(book -> book.getTitle().equals(title)) + .findFirst(); + } +} diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumber/books/BookStoreRunSteps.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumber/books/BookStoreRunSteps.java index 995a3469f0..a0c759ab26 100644 --- a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumber/books/BookStoreRunSteps.java +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumber/books/BookStoreRunSteps.java @@ -56,11 +56,6 @@ public class BookStoreRunSteps { foundBooks = store.booksByAuthor(author); } - @When("^I search for a book titled (.+)$") - public void searchForBookByTitle(String title) { - foundBook = store.bookByTitle(title).orElse(null); - } - @Then("^I find (\\d+) books$") public void findBooks(int count) { assertEquals(count, foundBooks.size()); diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreRunSteps.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreRunSteps.java new file mode 100644 index 0000000000..981fe41f11 --- /dev/null +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreRunSteps.java @@ -0,0 +1,58 @@ +package com.baeldung.cucumberbackground.books; + +import io.cucumber.datatable.DataTable; +import io.cucumber.java.Before; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +public class BookStoreRunSteps { + private BookStore store; + private List foundBooks; + private Book foundBook; + + @Before + public void setUp() { + store = new BookStore(); + foundBooks = new ArrayList<>(); + } + + @Given("^I have the following books in the store$") + public void haveBooksInTheStore(DataTable table) { + List> rows = table.asLists(String.class); + + for (List columns: rows) { + store.addBook(new Book(columns.get(0), columns.get(1))); + } + } + + @When("^I search for books by author (.+)$") + public void searchForBooksByAuthor(String author) { + foundBooks = store.booksByAuthor(author); + } + + @When("^I search for a book titled (.+)$") + public void searchForBookByTitle(String title) { + foundBook = store.bookByTitle(title).orElse(null); + } + + @Then("^I find (\\d+) books$") + public void findBooks(int count) { + assertEquals(count, foundBooks.size()); + } + + @Then("^I find a book$") + public void findABook() { + assertNotNull(foundBook); + } + + @Then("^I find no book$") + public void findNoBook() { + assertNull(foundBook); + } +} diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithBackgroundIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithBackgroundIntegrationTest.java new file mode 100644 index 0000000000..528ccbc882 --- /dev/null +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithBackgroundIntegrationTest.java @@ -0,0 +1,12 @@ +package com.baeldung.cucumberbackground.books; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(features = "classpath:features/book-store-with-background.feature") +public class BookStoreWithBackgroundIntegrationTest { + +} + diff --git a/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithoutBackgroundIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithoutBackgroundIntegrationTest.java new file mode 100644 index 0000000000..6343a52cdc --- /dev/null +++ b/testing-modules/testing-libraries/src/test/java/com/baeldung/cucumberbackground/books/BookStoreWithoutBackgroundIntegrationTest.java @@ -0,0 +1,12 @@ +package com.baeldung.cucumberbackground.books; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(features = "classpath:features/book-store-without-background.feature") +public class BookStoreWithoutBackgroundIntegrationTest { + +} + From f42658581b69475b4fe99f2b18274dadaef7ef90 Mon Sep 17 00:00:00 2001 From: Vikas Rajput Date: Wed, 11 Dec 2019 21:42:31 +0300 Subject: [PATCH 70/99] BAEL-3397: Difference between throw e and throw new Exception(e) (#8339) * Article: Quick and practical example of hexagonal architecture in java with Spring Project * Removed server.port property from application.properties * BAEL-3397: Difference between throw e and throw new Exception(e) in java * BAEL-3397 : Removed links from readme file * BAEL-3397: removed hexagonal module from the code * BAEL-3397: renamed exceptions package name to rethrow --- .../core-java-exceptions-2/README.md | 5 ++++ .../core-java-exceptions-2/pom.xml | 24 +++++++++++++++ .../RethrowDifferentExceptionDemo.java | 29 +++++++++++++++++++ .../rethrow/RethrowSameExceptionDemo.java | 27 +++++++++++++++++ .../rethrow/custom/InvalidDataException.java | 8 +++++ 5 files changed, 93 insertions(+) create mode 100644 core-java-modules/core-java-exceptions-2/README.md create mode 100644 core-java-modules/core-java-exceptions-2/pom.xml create mode 100644 core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowDifferentExceptionDemo.java create mode 100644 core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowSameExceptionDemo.java create mode 100644 core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/custom/InvalidDataException.java diff --git a/core-java-modules/core-java-exceptions-2/README.md b/core-java-modules/core-java-exceptions-2/README.md new file mode 100644 index 0000000000..3ad5189b5e --- /dev/null +++ b/core-java-modules/core-java-exceptions-2/README.md @@ -0,0 +1,5 @@ +## Core Java Exceptions 2 + +This module contains articles about core java exceptions + +### diff --git a/core-java-modules/core-java-exceptions-2/pom.xml b/core-java-modules/core-java-exceptions-2/pom.xml new file mode 100644 index 0000000000..2f7f613faf --- /dev/null +++ b/core-java-modules/core-java-exceptions-2/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + core-java-exceptions-2 + core-java-exceptions-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + http://maven.apache.org + + + UTF-8 + + + diff --git a/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowDifferentExceptionDemo.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowDifferentExceptionDemo.java new file mode 100644 index 0000000000..ce2fcb2c7a --- /dev/null +++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowDifferentExceptionDemo.java @@ -0,0 +1,29 @@ +package com.baeldung.rethrow; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.baeldung.rethrow.custom.InvalidDataException; + +public class RethrowDifferentExceptionDemo { + + private final static Logger LOGGER = Logger.getLogger(RethrowDifferentExceptionDemo.class.getName()); + + public static void main(String[] args) throws Exception { + String name = null; + + try { + + // Below line will throw NullPointerException + if (name.equals("Joe")) { + // Do blah blah.. + } + + } catch (Exception e) { + LOGGER.log(Level.WARNING, "So and so user is unable to cast vote because he is found uneligible"); + throw new InvalidDataException(e); + } + + } + +} diff --git a/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowSameExceptionDemo.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowSameExceptionDemo.java new file mode 100644 index 0000000000..bf53f67d34 --- /dev/null +++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/RethrowSameExceptionDemo.java @@ -0,0 +1,27 @@ +package com.baeldung.rethrow; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class RethrowSameExceptionDemo { + + private final static Logger LOGGER = Logger.getLogger(RethrowDifferentExceptionDemo.class.getName()); + + public static void main(String[] args) throws Exception { + String name = null; + + try { + + // Below line will throw NullPointerException + if (name.equals("Joe")) { + // Do blah blah.. + } + + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Exception occurred due to invalid name"); + throw e; + } + + } + +} diff --git a/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/custom/InvalidDataException.java b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/custom/InvalidDataException.java new file mode 100644 index 0000000000..5a74e32012 --- /dev/null +++ b/core-java-modules/core-java-exceptions-2/src/main/java/com/baeldung/rethrow/custom/InvalidDataException.java @@ -0,0 +1,8 @@ +package com.baeldung.rethrow.custom; + +public class InvalidDataException extends Exception { + + public InvalidDataException(Exception e) { + super(e); + } +} From 825b960aa36716e679e483d36598cf2959f812bc Mon Sep 17 00:00:00 2001 From: Gerardo Roza Date: Thu, 12 Dec 2019 18:21:09 -0300 Subject: [PATCH 71/99] rearranged packages to include service and secondservice into gateway customfilters package, as they belong to that article --- .../{ => gatewayapp}/CustomFiltersGatewayApplication.java | 2 +- .../{ => gatewayapp}/config/WebClientConfig.java | 2 +- .../filters/factories/ChainRequestGatewayFilterFactory.java | 2 +- .../filters/factories/LoggingGatewayFilterFactory.java | 2 +- .../factories/ModifyRequestGatewayFilterFactory.java | 2 +- .../factories/ModifyResponseGatewayFilterFactory.java | 2 +- .../filters/global/FirstPreLastPostGlobalFilter.java | 2 +- .../filters/global/LoggingGlobalFiltersConfigurations.java | 2 +- .../filters/global/LoggingGlobalPreFilter.java | 2 +- .../{ => gatewayapp}/routes/ServiceRouteConfiguration.java | 6 +++--- .../secondservice/SecondServiceApplication.java | 2 +- .../secondservice/web/SecondServiceRestController.java | 2 +- .../customfilters}/service/ServiceApplication.java | 2 +- .../customfilters}/service/web/ServiceRestController.java | 2 +- .../{ => gatewayapp}/CustomFiltersLiveTest.java | 4 ++-- .../{ => gatewayapp}/utils/LoggerListAppender.java | 2 +- .../secondservice/SecondServiceIntegrationTest.java | 4 ++-- .../customfilters}/secondservice/SpringContextTest.java | 2 +- .../customfilters}/service/ServiceIntegrationTest.java | 4 ++-- .../customfilters}/service/SpringContextTest.java | 2 +- .../src/test/resources/logback-test.xml | 2 +- 21 files changed, 26 insertions(+), 26 deletions(-) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/CustomFiltersGatewayApplication.java (87%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/config/WebClientConfig.java (81%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/factories/ChainRequestGatewayFilterFactory.java (97%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/factories/LoggingGatewayFilterFactory.java (96%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/factories/ModifyRequestGatewayFilterFactory.java (97%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/factories/ModifyResponseGatewayFilterFactory.java (95%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/global/FirstPreLastPostGlobalFilter.java (91%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/global/LoggingGlobalFiltersConfigurations.java (89%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/filters/global/LoggingGlobalPreFilter.java (89%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/routes/ServiceRouteConfiguration.java (74%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/{ => springcloudgateway/customfilters}/secondservice/SecondServiceApplication.java (86%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/{ => springcloudgateway/customfilters}/secondservice/web/SecondServiceRestController.java (85%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/{ => springcloudgateway/customfilters}/service/ServiceApplication.java (86%) rename spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/{ => springcloudgateway/customfilters}/service/web/ServiceRestController.java (89%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/CustomFiltersLiveTest.java (96%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/{ => gatewayapp}/utils/LoggerListAppender.java (88%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/{ => springcloudgateway/customfilters}/secondservice/SecondServiceIntegrationTest.java (81%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/{ => springcloudgateway/customfilters}/secondservice/SpringContextTest.java (80%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/{ => springcloudgateway/customfilters}/service/ServiceIntegrationTest.java (85%) rename spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/{ => springcloudgateway/customfilters}/service/SpringContextTest.java (81%) diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersGatewayApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersGatewayApplication.java similarity index 87% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersGatewayApplication.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersGatewayApplication.java index a9f18e71fd..fae25bb7cc 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersGatewayApplication.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersGatewayApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters; +package com.baeldung.springcloudgateway.customfilters.gatewayapp; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/config/WebClientConfig.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/config/WebClientConfig.java similarity index 81% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/config/WebClientConfig.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/config/WebClientConfig.java index 8a7771f0e3..0589d8c321 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/config/WebClientConfig.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/config/WebClientConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.config; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ChainRequestGatewayFilterFactory.java similarity index 97% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ChainRequestGatewayFilterFactory.java index 1f4e2a96cb..f53b0a3c93 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ChainRequestGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ChainRequestGatewayFilterFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.factories; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories; import java.util.Arrays; import java.util.List; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/LoggingGatewayFilterFactory.java similarity index 96% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/LoggingGatewayFilterFactory.java index 18532e34a8..900d36cc02 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/LoggingGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/LoggingGatewayFilterFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.factories; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories; import java.util.Arrays; import java.util.List; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyRequestGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyRequestGatewayFilterFactory.java similarity index 97% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyRequestGatewayFilterFactory.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyRequestGatewayFilterFactory.java index e03b7eebb3..5828f35a36 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyRequestGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyRequestGatewayFilterFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.factories; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories; import java.util.Arrays; import java.util.Collections; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyResponseGatewayFilterFactory.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyResponseGatewayFilterFactory.java similarity index 95% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyResponseGatewayFilterFactory.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyResponseGatewayFilterFactory.java index 55b39fce29..f5efa69402 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/factories/ModifyResponseGatewayFilterFactory.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/factories/ModifyResponseGatewayFilterFactory.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.factories; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories; import java.util.Optional; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/FirstPreLastPostGlobalFilter.java similarity index 91% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/FirstPreLastPostGlobalFilter.java index 5b58eee8a6..687f3fe685 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/FirstPreLastPostGlobalFilter.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/FirstPreLastPostGlobalFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.global; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.global; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalFiltersConfigurations.java similarity index 89% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalFiltersConfigurations.java index 8edcf2a073..2dead8da3b 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalFiltersConfigurations.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalFiltersConfigurations.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.global; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.global; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalPreFilter.java similarity index 89% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalPreFilter.java index bd29499868..2bacf033db 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/filters/global/LoggingGlobalPreFilter.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/filters/global/LoggingGlobalPreFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.filters.global; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.global; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/routes/ServiceRouteConfiguration.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/routes/ServiceRouteConfiguration.java similarity index 74% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/routes/ServiceRouteConfiguration.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/routes/ServiceRouteConfiguration.java index b4f6eda374..17d4827d93 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/routes/ServiceRouteConfiguration.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/routes/ServiceRouteConfiguration.java @@ -1,11 +1,11 @@ -package com.baeldung.springcloudgateway.customfilters.routes; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.routes; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; -import com.baeldung.springcloudgateway.customfilters.filters.factories.LoggingGatewayFilterFactory; -import com.baeldung.springcloudgateway.customfilters.filters.factories.LoggingGatewayFilterFactory.Config; +import com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories.LoggingGatewayFilterFactory; +import com.baeldung.springcloudgateway.customfilters.gatewayapp.filters.factories.LoggingGatewayFilterFactory.Config; /** * Note: We want to keep this as an example of configuring a Route with a custom filter diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/SecondServiceApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceApplication.java similarity index 86% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/SecondServiceApplication.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceApplication.java index 69be1be9ca..b65d0efbd6 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/SecondServiceApplication.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.secondservice; +package com.baeldung.springcloudgateway.customfilters.secondservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/web/SecondServiceRestController.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/web/SecondServiceRestController.java similarity index 85% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/web/SecondServiceRestController.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/web/SecondServiceRestController.java index f047b123ef..1ac44ba6b1 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/secondservice/web/SecondServiceRestController.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/secondservice/web/SecondServiceRestController.java @@ -1,4 +1,4 @@ -package com.baeldung.secondservice.web; +package com.baeldung.springcloudgateway.customfilters.secondservice.web; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/ServiceApplication.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/ServiceApplication.java similarity index 86% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/ServiceApplication.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/ServiceApplication.java index 9853b78088..1e2ffb63c2 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/ServiceApplication.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/ServiceApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.service; +package com.baeldung.springcloudgateway.customfilters.service; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/web/ServiceRestController.java b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/web/ServiceRestController.java similarity index 89% rename from spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/web/ServiceRestController.java rename to spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/web/ServiceRestController.java index 12f7151e59..3ca09f6853 100644 --- a/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/service/web/ServiceRestController.java +++ b/spring-cloud/spring-cloud-gateway/src/main/java/com/baeldung/springcloudgateway/customfilters/service/web/ServiceRestController.java @@ -1,4 +1,4 @@ -package com.baeldung.service.web; +package com.baeldung.springcloudgateway.customfilters.service.web; import java.util.Locale; diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java similarity index 96% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java index b24db70e4f..a4bb3f8068 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/CustomFiltersLiveTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/CustomFiltersLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters; +package com.baeldung.springcloudgateway.customfilters.gatewayapp; import static org.assertj.core.api.Assertions.assertThat; @@ -11,7 +11,7 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; -import com.baeldung.springcloudgateway.customfilters.utils.LoggerListAppender; +import com.baeldung.springcloudgateway.customfilters.gatewayapp.utils.LoggerListAppender; import ch.qos.logback.classic.spi.ILoggingEvent; diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/utils/LoggerListAppender.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/utils/LoggerListAppender.java similarity index 88% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/utils/LoggerListAppender.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/utils/LoggerListAppender.java index b6337dabb6..8e113b417b 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/utils/LoggerListAppender.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/gatewayapp/utils/LoggerListAppender.java @@ -1,4 +1,4 @@ -package com.baeldung.springcloudgateway.customfilters.utils; +package com.baeldung.springcloudgateway.customfilters.gatewayapp.utils; import java.util.ArrayList; import java.util.List; diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SecondServiceIntegrationTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceIntegrationTest.java similarity index 81% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SecondServiceIntegrationTest.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceIntegrationTest.java index 9a1e0b0712..6b2a432d20 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SecondServiceIntegrationTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SecondServiceIntegrationTest.java @@ -1,11 +1,11 @@ -package com.baeldung.secondservice; +package com.baeldung.springcloudgateway.customfilters.secondservice; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.test.web.reactive.server.WebTestClient; -import com.baeldung.secondservice.web.SecondServiceRestController; +import com.baeldung.springcloudgateway.customfilters.secondservice.web.SecondServiceRestController; @WebFluxTest(SecondServiceRestController.class) public class SecondServiceIntegrationTest { diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SpringContextTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SpringContextTest.java similarity index 80% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SpringContextTest.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SpringContextTest.java index 127ef7fe32..eaf94c0a42 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/secondservice/SpringContextTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/secondservice/SpringContextTest.java @@ -1,4 +1,4 @@ -package com.baeldung.secondservice; +package com.baeldung.springcloudgateway.customfilters.secondservice; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/ServiceIntegrationTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/ServiceIntegrationTest.java similarity index 85% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/ServiceIntegrationTest.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/ServiceIntegrationTest.java index cb65ac3a50..bfb3f23f0d 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/ServiceIntegrationTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/ServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.service; +package com.baeldung.springcloudgateway.customfilters.service; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -6,7 +6,7 @@ import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.http.HttpHeaders; import org.springframework.test.web.reactive.server.WebTestClient; -import com.baeldung.service.web.ServiceRestController; +import com.baeldung.springcloudgateway.customfilters.service.web.ServiceRestController; @WebFluxTest(ServiceRestController.class) public class ServiceIntegrationTest { diff --git a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/SpringContextTest.java b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/SpringContextTest.java similarity index 81% rename from spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/SpringContextTest.java rename to spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/SpringContextTest.java index 28216dca86..2a9b322d5e 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/service/SpringContextTest.java +++ b/spring-cloud/spring-cloud-gateway/src/test/java/com/baeldung/springcloudgateway/customfilters/service/SpringContextTest.java @@ -1,4 +1,4 @@ -package com.baeldung.service; +package com.baeldung.springcloudgateway.customfilters.service; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; diff --git a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml index 8febdc8b1a..6fcdb6317f 100644 --- a/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml +++ b/spring-cloud/spring-cloud-gateway/src/test/resources/logback-test.xml @@ -1,7 +1,7 @@ + class="com.baeldung.springcloudgateway.customfilters.gatewayapp.utils.LoggerListAppender"> From 4c689ec97c9b0c63b190f72244c3755aa06a08db Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 13:53:42 +0800 Subject: [PATCH 72/99] Create README.md --- spring-boot-config-jpa-error/data-jpa-application/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-config-jpa-error/data-jpa-application/README.md diff --git a/spring-boot-config-jpa-error/data-jpa-application/README.md b/spring-boot-config-jpa-error/data-jpa-application/README.md new file mode 100644 index 0000000000..443ec07183 --- /dev/null +++ b/spring-boot-config-jpa-error/data-jpa-application/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Unable to Find @SpringBootConfiguration with @DataJpaTest](https://www.baeldung.com/spring-boot-unable-to-find-springbootconfiguration-with-datajpatest) From 650ce1770a9c7d8788e7895067bd44dd8d843471 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 13:59:38 +0800 Subject: [PATCH 73/99] Create README.md --- spring-boot-config-jpa-error/data-jpa-library/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-config-jpa-error/data-jpa-library/README.md diff --git a/spring-boot-config-jpa-error/data-jpa-library/README.md b/spring-boot-config-jpa-error/data-jpa-library/README.md new file mode 100644 index 0000000000..4e852f8a90 --- /dev/null +++ b/spring-boot-config-jpa-error/data-jpa-library/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Unable to Find @SpringBootConfiguration with @DataJpaTest](https://www.baeldung.com/spring-boot-unable-to-find-springbootconfiguration-with-datajpatest) From 7278057b7f5a4f2b09253675bc7f0b12c3783eb3 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:02:21 +0800 Subject: [PATCH 74/99] Update README.md --- cas/cas-server/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cas/cas-server/README.md b/cas/cas-server/README.md index bacf45a2a1..44cfa2246c 100644 --- a/cas/cas-server/README.md +++ b/cas/cas-server/README.md @@ -98,4 +98,8 @@ Invokes the CAS Command Line Shell. For a list of commands either use no argumen ```bash ./build.sh cli -``` \ No newline at end of file +``` + +### Relevant Articles: + +- [CAS SSO With Spring Security](https://www.baeldung.com/spring-security-cas-sso) From 00e3efe565cb4545edaf7bb51ee221a5fc8c40fc Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:03:51 +0800 Subject: [PATCH 75/99] Create README.md --- apache-olingo/olingo2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apache-olingo/olingo2/README.md diff --git a/apache-olingo/olingo2/README.md b/apache-olingo/olingo2/README.md new file mode 100644 index 0000000000..254f57d44f --- /dev/null +++ b/apache-olingo/olingo2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [OData Protocol Guide](https://www.baeldung.com/odata) From 2f8bb350e463ad55b4e9d8c9bcdbf795a6ba5c25 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:05:10 +0800 Subject: [PATCH 76/99] Update README.md --- apache-olingo/olingo2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apache-olingo/olingo2/README.md b/apache-olingo/olingo2/README.md index 254f57d44f..b1cb23d822 100644 --- a/apache-olingo/olingo2/README.md +++ b/apache-olingo/olingo2/README.md @@ -1,3 +1,4 @@ ### Relevant Articles: - [OData Protocol Guide](https://www.baeldung.com/odata) +- [Intro to OData with Olingo](https://www.baeldung.com/olingo) From 6a96adc1d943269804cc955e5aea43d9577c93c8 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:15:40 +0800 Subject: [PATCH 77/99] Create README.md --- apache-cxf/cxf-spring/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apache-cxf/cxf-spring/README.md diff --git a/apache-cxf/cxf-spring/README.md b/apache-cxf/cxf-spring/README.md new file mode 100644 index 0000000000..c4d55a5c94 --- /dev/null +++ b/apache-cxf/cxf-spring/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring) From 4a87e68c7ab2426c56f445c7f5d7ca75682127f7 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:17:49 +0800 Subject: [PATCH 78/99] Create README.md --- apache-cxf/cxf-aegis/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 apache-cxf/cxf-aegis/README.md diff --git a/apache-cxf/cxf-aegis/README.md b/apache-cxf/cxf-aegis/README.md new file mode 100644 index 0000000000..76b0740c35 --- /dev/null +++ b/apache-cxf/cxf-aegis/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +-[Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf) From 7a8c89dc6f037bf189703d1160089b09696caa96 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:18:05 +0800 Subject: [PATCH 79/99] Update README.md --- apache-cxf/cxf-aegis/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache-cxf/cxf-aegis/README.md b/apache-cxf/cxf-aegis/README.md index 76b0740c35..e055826554 100644 --- a/apache-cxf/cxf-aegis/README.md +++ b/apache-cxf/cxf-aegis/README.md @@ -1,3 +1,3 @@ ### Relevant Articles --[Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf) +- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf) From c0be64ef27a6bb3ec67128861de6297b356e5d0e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:20:05 +0800 Subject: [PATCH 80/99] Create README.md --- machine-learning/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 machine-learning/README.md diff --git a/machine-learning/README.md b/machine-learning/README.md new file mode 100644 index 0000000000..80f2d2c6cd --- /dev/null +++ b/machine-learning/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Introduction to Supervised Learning in Kotlin](https://www.baeldung.com/kotlin-supervised-learning) From 7315e69e5a4a9d2f164ca55cda44c0aa6ec3d975 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:26:09 +0800 Subject: [PATCH 81/99] Update README.md --- core-java-modules/core-java-concurrency-advanced-3/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java-concurrency-advanced-3/README.md b/core-java-modules/core-java-concurrency-advanced-3/README.md index d1622b5fe1..409d3aa464 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/README.md +++ b/core-java-modules/core-java-concurrency-advanced-3/README.md @@ -6,4 +6,6 @@ This module contains articles about advanced topics about multithreading with co ### Relevant Articles: +- [Common Concurrency Pitfalls in Java](https://www.baeldung.com/java-common-concurrency-pitfalls) +- [Guide to RejectedExecutionHandler](https://www.baeldung.com/java-rejectedexecutionhandler) [[<-- previous]](/core-java-modules/core-java-concurrency-advanced-2) From cb3cf4d95b8eb4bcc9109d35fe1b646e0419b3b1 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:30:30 +0800 Subject: [PATCH 82/99] Create README.md --- spring-security-sso/spring-security-sso-ui-2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-security-sso/spring-security-sso-ui-2/README.md diff --git a/spring-security-sso/spring-security-sso-ui-2/README.md b/spring-security-sso/spring-security-sso-ui-2/README.md new file mode 100644 index 0000000000..aed217bdf0 --- /dev/null +++ b/spring-security-sso/spring-security-sso-ui-2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2) From d8a4978767e4c46370419c0c5c75c331add89937 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:33:15 +0800 Subject: [PATCH 83/99] Create README.md --- spring-security-sso/spring-security-sso-auth-server/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-security-sso/spring-security-sso-auth-server/README.md diff --git a/spring-security-sso/spring-security-sso-auth-server/README.md b/spring-security-sso/spring-security-sso-auth-server/README.md new file mode 100644 index 0000000000..845fb50a93 --- /dev/null +++ b/spring-security-sso/spring-security-sso-auth-server/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2) From dbe99b11b45e837ad94f039ec18768a3fafc4d9a Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:35:56 +0800 Subject: [PATCH 84/99] Create README.md --- spring-security-sso/spring-security-sso-ui/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-security-sso/spring-security-sso-ui/README.md diff --git a/spring-security-sso/spring-security-sso-ui/README.md b/spring-security-sso/spring-security-sso-ui/README.md new file mode 100644 index 0000000000..845fb50a93 --- /dev/null +++ b/spring-security-sso/spring-security-sso-ui/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2) From 979fd99d774487bc887b7064c86efe20e440b4a5 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:39:40 +0800 Subject: [PATCH 85/99] Create README.md --- oauth2-framework-impl/oauth2-client/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 oauth2-framework-impl/oauth2-client/README.md diff --git a/oauth2-framework-impl/oauth2-client/README.md b/oauth2-framework-impl/oauth2-client/README.md new file mode 100644 index 0000000000..4bcb9790b1 --- /dev/null +++ b/oauth2-framework-impl/oauth2-client/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation) From d7675b402ceb4a0d06311fe2e133b8a98f4775b4 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:40:54 +0800 Subject: [PATCH 86/99] Create README.md --- oauth2-framework-impl/oauth2-authorization-server/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 oauth2-framework-impl/oauth2-authorization-server/README.md diff --git a/oauth2-framework-impl/oauth2-authorization-server/README.md b/oauth2-framework-impl/oauth2-authorization-server/README.md new file mode 100644 index 0000000000..4bcb9790b1 --- /dev/null +++ b/oauth2-framework-impl/oauth2-authorization-server/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation) From a2919835cd1ed986138cdb2f5312579665f1d8c2 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:41:43 +0800 Subject: [PATCH 87/99] Create README.md --- oauth2-framework-impl/oauth2-resource-server/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 oauth2-framework-impl/oauth2-resource-server/README.md diff --git a/oauth2-framework-impl/oauth2-resource-server/README.md b/oauth2-framework-impl/oauth2-resource-server/README.md new file mode 100644 index 0000000000..4bcb9790b1 --- /dev/null +++ b/oauth2-framework-impl/oauth2-resource-server/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Implementing The OAuth 2.0 Authorization Framework Using Jakarta EE](https://www.baeldung.com/java-ee-oauth2-implementation) From 2c4b8774eed5d65e02ca43c61964caf05a5042c7 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:45:16 +0800 Subject: [PATCH 88/99] Create README.md --- bazel/bazelgreeting/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 bazel/bazelgreeting/README.md diff --git a/bazel/bazelgreeting/README.md b/bazel/bazelgreeting/README.md new file mode 100644 index 0000000000..528f797c21 --- /dev/null +++ b/bazel/bazelgreeting/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) From f8814e6fc528d38268bc570866e634d92e7ce54b Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:46:34 +0800 Subject: [PATCH 89/99] Create README.md --- bazel/bazelapp/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 bazel/bazelapp/README.md diff --git a/bazel/bazelapp/README.md b/bazel/bazelapp/README.md new file mode 100644 index 0000000000..528f797c21 --- /dev/null +++ b/bazel/bazelapp/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) From b7d3ea3772aae2922fbc67e05fd1b876c60d9f4e Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:48:03 +0800 Subject: [PATCH 90/99] Create README.md --- spring-boot-runtime/disabling-console-logback/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-runtime/disabling-console-logback/README.md diff --git a/spring-boot-runtime/disabling-console-logback/README.md b/spring-boot-runtime/disabling-console-logback/README.md new file mode 100644 index 0000000000..554f051b41 --- /dev/null +++ b/spring-boot-runtime/disabling-console-logback/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) From 9ae11d5e14b7f60c8e9a40f1ecd277beb73e4a18 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:49:29 +0800 Subject: [PATCH 91/99] Create README.md --- spring-boot-runtime/disabling-console-log4j2/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-runtime/disabling-console-log4j2/README.md diff --git a/spring-boot-runtime/disabling-console-log4j2/README.md b/spring-boot-runtime/disabling-console-log4j2/README.md new file mode 100644 index 0000000000..554f051b41 --- /dev/null +++ b/spring-boot-runtime/disabling-console-log4j2/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) From a839c00586710e2aa22e8cac8211c39126966dd5 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:51:02 +0800 Subject: [PATCH 92/99] Create README.md --- spring-boot-runtime/disabling-console-jul/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 spring-boot-runtime/disabling-console-jul/README.md diff --git a/spring-boot-runtime/disabling-console-jul/README.md b/spring-boot-runtime/disabling-console-jul/README.md new file mode 100644 index 0000000000..554f051b41 --- /dev/null +++ b/spring-boot-runtime/disabling-console-jul/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) From 2931fd222f43cde64541bd9fb3df189031624cb7 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:52:25 +0800 Subject: [PATCH 93/99] Create README.md --- maven-all/versions-maven-plugin/original/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 maven-all/versions-maven-plugin/original/README.md diff --git a/maven-all/versions-maven-plugin/original/README.md b/maven-all/versions-maven-plugin/original/README.md new file mode 100644 index 0000000000..5652a9b7e4 --- /dev/null +++ b/maven-all/versions-maven-plugin/original/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) From d8ed63ceba758652f2b73017edbf21674d25b7b6 Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Fri, 13 Dec 2019 14:55:24 +0800 Subject: [PATCH 94/99] Create README.md --- maven-all/maven/custom-rule/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 maven-all/maven/custom-rule/README.md diff --git a/maven-all/maven/custom-rule/README.md b/maven-all/maven/custom-rule/README.md new file mode 100644 index 0000000000..44d43050e7 --- /dev/null +++ b/maven-all/maven/custom-rule/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin) From b6ad214a340f3c8ef82f72dc965ae64431336931 Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Fri, 13 Dec 2019 08:41:16 +0000 Subject: [PATCH 95/99] BAEL-3387 Hibernate - Different Levels Of Logging (#8326) * Added module for article * Update pom.xml * Delete pom.xml * Update and rename ForecastProcessorTest.java to ForecastProcessorUnitTest.java * Updated code as per review comments * Delete .gitignore * Update pom.xml * BAEL-2904 Moved files * BAEL-2904 Deleted files from previous project * BAEL-2904 Moved classes for method reference article * Update pom.xml * BAEL-2904 Updated README.md * First draft * BAEL-3300 Added more tests * BAEL-3300 Removed unused imports * BAEL-3300 Run dos2unix on README.md * BAEL-3387 Added entity and test classes * BAEL-3387 Added logging configuration * BAEL-3387 Corrected log4j and log4j2 config --- persistence-modules/hibernate5-2/pom.xml | 6 ++ .../baeldung/hibernate/logging/Employee.java | 59 +++++++++++++++++++ .../main/resources/hibernate-logging.cfg.xml | 27 +++++++++ .../HibernateLoggingIntegrationTest.java | 50 ++++++++++++++++ .../hibernate5-2/src/test/resources/log4j.xml | 25 ++++++++ .../src/test/resources/log4j2.xml | 18 ++++++ .../src/test/resources/logback.xml | 18 ++++++ 7 files changed, 203 insertions(+) create mode 100644 persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java create mode 100644 persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml create mode 100644 persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernatelogging/HibernateLoggingIntegrationTest.java create mode 100644 persistence-modules/hibernate5-2/src/test/resources/log4j.xml create mode 100644 persistence-modules/hibernate5-2/src/test/resources/log4j2.xml create mode 100644 persistence-modules/hibernate5-2/src/test/resources/logback.xml diff --git a/persistence-modules/hibernate5-2/pom.xml b/persistence-modules/hibernate5-2/pom.xml index 516ab83997..16f6c10a7a 100644 --- a/persistence-modules/hibernate5-2/pom.xml +++ b/persistence-modules/hibernate5-2/pom.xml @@ -27,6 +27,12 @@ h2 1.4.200 + + + org.apache.commons + commons-lang3 + 3.8.1 + diff --git a/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java new file mode 100644 index 0000000000..9dcf4058a7 --- /dev/null +++ b/persistence-modules/hibernate5-2/src/main/java/com/baeldung/hibernate/logging/Employee.java @@ -0,0 +1,59 @@ +package com.baeldung.hibernate.logging; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String title; + + private String name; + + public Employee() { + } + + public Employee(String name, String employeeNumber) { + this.name = name; + this.employeeNumber = employeeNumber; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml b/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml new file mode 100644 index 0000000000..52ef1ee685 --- /dev/null +++ b/persistence-modules/hibernate5-2/src/main/resources/hibernate-logging.cfg.xml @@ -0,0 +1,27 @@ + + + + + + + org.h2.Driver + jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 + sa + + + 1 + + org.hibernate.dialect.H2Dialect + + org.hibernate.cache.internal.NoCacheProvider + + true + + create + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernatelogging/HibernateLoggingIntegrationTest.java b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernatelogging/HibernateLoggingIntegrationTest.java new file mode 100644 index 0000000000..8ec722671d --- /dev/null +++ b/persistence-modules/hibernate5-2/src/test/java/com/baeldung/hibernatelogging/HibernateLoggingIntegrationTest.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernatelogging; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.IOException; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.query.Query; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.logging.Employee; + +public class HibernateLoggingIntegrationTest { + + private SessionFactory sessionFactory; + + @Before + public void setUp() throws IOException { + final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure("hibernate-logging.cfg.xml") + .build(); + try { + sessionFactory = new MetadataSources(registry).buildMetadata() + .buildSessionFactory(); + Session session = sessionFactory.openSession(); + session.beginTransaction(); + session.save(new Employee("John Smith", "001")); + session.getTransaction() + .commit(); + session.close(); + } catch (Exception e) { + fail(e); + StandardServiceRegistryBuilder.destroy(registry); + } + } + + @Test + public void whenAllEmployeesAreSelected_ThenSuccess() { + Query query = sessionFactory.openSession().createQuery("from com.baeldung.hibernate.logging.Employee", Employee.class); + List deptEmployees = query.list(); + Employee deptEmployee = deptEmployees.get(0); + assertEquals("John Smith", deptEmployee.getName()); + } +} diff --git a/persistence-modules/hibernate5-2/src/test/resources/log4j.xml b/persistence-modules/hibernate5-2/src/test/resources/log4j.xml new file mode 100644 index 0000000000..2d153af124 --- /dev/null +++ b/persistence-modules/hibernate5-2/src/test/resources/log4j.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml b/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml new file mode 100644 index 0000000000..c5d0f12462 --- /dev/null +++ b/persistence-modules/hibernate5-2/src/test/resources/log4j2.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate5-2/src/test/resources/logback.xml b/persistence-modules/hibernate5-2/src/test/resources/logback.xml new file mode 100644 index 0000000000..9e591977d7 --- /dev/null +++ b/persistence-modules/hibernate5-2/src/test/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %d{yyyy-MM-dd HH:mm:ss} | %-5p | [%thread] %logger{5}:%L - %msg%n + + + + + + + + + + + + \ No newline at end of file From 4d552daac0d9dd445fc9b35fb3d7f358e660145f Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 09:57:24 +0100 Subject: [PATCH 96/99] BAEL-3440: Remove unnecessary sorting (#8336) --- .../src/main/java/com/baeldung/convertToMap/ConvertToMap.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java b/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java index e33d9ee212..317cdca529 100644 --- a/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java +++ b/java-collections-conversions/src/main/java/com/baeldung/convertToMap/ConvertToMap.java @@ -24,10 +24,7 @@ public class ConvertToMap { public TreeMap listToSortedMap(List books) { return books.stream() - .sorted(Comparator.comparing(Book::getName)) .collect(Collectors.toMap(Book::getName, Function.identity(), (o1, o2) -> o1, TreeMap::new)); } - - } From 721b738162583c1e3613f90b2069c204bac32d31 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 09:58:42 +0100 Subject: [PATCH 97/99] BAEL-3271: Use random port in spring-session-redis IntegrationTest (#8359) --- .../SessionControllerIntegrationTest.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java b/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java index f739aeb3ab..7ee0294315 100644 --- a/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java +++ b/spring-session/spring-session-redis/src/test/java/com/baeldung/spring/session/SessionControllerIntegrationTest.java @@ -1,16 +1,11 @@ package com.baeldung.spring.session; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.util.Set; - import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; @@ -20,19 +15,27 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; - import redis.clients.jedis.Jedis; import redis.embedded.RedisServer; +import java.io.IOException; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + @RunWith(SpringRunner.class) -@SpringBootTest(classes = SessionWebApplication.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@SpringBootTest(classes = SessionWebApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class SessionControllerIntegrationTest { - private Jedis jedis; private static RedisServer redisServer; + + @LocalServerPort + private int port; + + private Jedis jedis; private TestRestTemplate testRestTemplate; private TestRestTemplate testRestTemplateWithAuth; - private String testUrl = "http://localhost:8080/"; @BeforeClass public static void startRedisServer() throws IOException { @@ -41,7 +44,7 @@ public class SessionControllerIntegrationTest { } @AfterClass - public static void stopRedisServer() throws IOException { + public static void stopRedisServer() { redisServer.stop(); } @@ -63,13 +66,13 @@ public class SessionControllerIntegrationTest { @Test public void testUnauthenticatedCantAccess() { - ResponseEntity result = testRestTemplate.getForEntity(testUrl, String.class); + ResponseEntity result = testRestTemplate.getForEntity(getTestUrl(), String.class); assertEquals(HttpStatus.UNAUTHORIZED, result.getStatusCode()); } @Test public void testRedisControlsSession() { - ResponseEntity result = testRestTemplateWithAuth.getForEntity(testUrl, String.class); + ResponseEntity result = testRestTemplateWithAuth.getForEntity(getTestUrl(), String.class); assertEquals("hello admin", result.getBody()); // login worked Set redisResult = jedis.keys("*"); @@ -80,13 +83,16 @@ public class SessionControllerIntegrationTest { headers.add("Cookie", sessionCookie); HttpEntity httpEntity = new HttpEntity<>(headers); - result = testRestTemplate.exchange(testUrl, HttpMethod.GET, httpEntity, String.class); + result = testRestTemplate.exchange(getTestUrl(), HttpMethod.GET, httpEntity, String.class); assertEquals("hello admin", result.getBody()); // access with session works worked jedis.flushAll(); // clear all keys in redis - result = testRestTemplate.exchange(testUrl, HttpMethod.GET, httpEntity, String.class); + result = testRestTemplate.exchange(getTestUrl(), HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.UNAUTHORIZED, result.getStatusCode());// access denied after sessions are removed in redis + } + private String getTestUrl(){ + return "http://localhost:" + port; } } \ No newline at end of file From 35174629489a57a81219cf5b2d104984e0350654 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 11:38:28 +0100 Subject: [PATCH 98/99] BAEL-3253: Use a random port number for Tomcat (#8351) * BAEL-3253: Use a random port number for Tomcat * BAEL-3253: Validate a port availability --- .../baeldung/tomcat/ProgrammaticTomcat.java | 30 ++++++++++++++++++- .../ProgrammaticTomcatIntegrationTest.java | 3 +- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java b/libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java index 6c4fed6d07..f42db2d3de 100644 --- a/libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java +++ b/libraries-server/src/main/java/com/baeldung/tomcat/ProgrammaticTomcat.java @@ -7,22 +7,50 @@ import org.apache.tomcat.util.descriptor.web.FilterDef; import org.apache.tomcat.util.descriptor.web.FilterMap; import java.io.File; +import java.io.IOException; +import java.net.ServerSocket; +import java.util.Random; /** * Created by adi on 1/10/18. */ public class ProgrammaticTomcat { + private static boolean isFree(int port) { + try { + new ServerSocket(port).close(); + return true; + } catch (IOException e) { + return false; + } + } + private Tomcat tomcat = null; + private int randomPort; + + public ProgrammaticTomcat() { + // Get a random port number in range 6000 (inclusive) - 9000 (exclusive) + this.randomPort = new Random() + .ints(6000, 9000) + .filter(ProgrammaticTomcat::isFree) + .findFirst() + .orElse(8080); + } + // uncomment for live test // public static void main(String[] args) throws LifecycleException, ServletException, URISyntaxException, IOException { // startTomcat(); // } + + public int getPort() { + return randomPort; + } + public void startTomcat() throws LifecycleException { tomcat = new Tomcat(); - tomcat.setPort(8080); + tomcat.setPort(randomPort); tomcat.setHostname("localhost"); String appBase = "."; tomcat.getHost().setAppBase(appBase); diff --git a/libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java b/libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java index 9224561341..888fb8e366 100644 --- a/libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java +++ b/libraries-server/src/test/java/com/baeldung/tomcat/ProgrammaticTomcatIntegrationTest.java @@ -37,7 +37,8 @@ public class ProgrammaticTomcatIntegrationTest { @Test public void givenTomcatStarted_whenAccessServlet_responseIsTestAndResponseHeaderIsSet() throws Exception { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); - HttpGet getServlet = new HttpGet("http://localhost:8080/my-servlet"); + String uri = "http://localhost:" + tomcat.getPort() + "/my-servlet"; + HttpGet getServlet = new HttpGet(uri); HttpResponse response = httpClient.execute(getServlet); assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); From a141ac01fd85a738e76e746374bb214d16689884 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Tue, 10 Dec 2019 14:57:11 +0200 Subject: [PATCH 99/99] [BAEL-19882] - Move articles out of core-kotlin part1 --- core-kotlin-2/README.md | 2 - core-kotlin-io/.gitignore | 11 --- core-kotlin-io/pom.xml | 97 ------------------- core-kotlin-modules/README.md | 5 + .../core-kotlin-annotations/README.md | 8 ++ .../core-kotlin-annotations/pom.xml | 41 ++++++++ .../com/baeldung/annotations/Annotations.kt | 0 .../kotlin/com/baeldung/annotations/Item.kt | 0 .../kotlin/com/baeldung/annotations/Main.kt | 0 .../com/baeldung/annotations/Validator.kt | 0 .../com/baeldung/jvmannotations/Document.kt | 0 .../baeldung/jvmannotations/HtmlDocument.java | 0 .../com/baeldung/jvmannotations/Message.kt | 0 .../jvmannotations/MessageConverter.kt | 0 .../baeldung/jvmannotations/TextDocument.kt | 0 .../baeldung/jvmannotations/XmlDocument.kt | 0 .../com/baeldung/jvmfield}/JvmSample.kt | 2 +- .../baeldung/annotations/ValidationTest.kt | 0 .../baeldung/jvmannotations}/DocumentTest.kt | 0 .../com/baeldung/jvmfield}/JvmSampleTest.kt | 2 +- .../core-kotlin-io}/README.md | 4 +- core-kotlin-modules/core-kotlin-io/pom.xml | 54 +++++++++++ .../com/baeldung/filesystem/FileReader.kt | 0 .../com/baeldung/filesystem/FileWriter.kt | 0 .../inputstream/InputStreamExtension.kt | 0 .../com/baeldung/console/ConsoleIOUnitTest.kt | 0 .../com/baeldung/filesystem/FileReaderTest.kt | 0 .../com/baeldung/filesystem/FileWriterTest.kt | 0 .../inputstream/InputStreamToStringTest.kt | 4 +- .../src/test/resources/Kotlin.in | 0 .../src/test/resources/Kotlin.out | 0 .../src/test/resources/inputstream2string.txt | 0 .../org.mockito.plugins.MockMaker | 0 .../core-kotlin-strings/README.md | 9 ++ .../core-kotlin-strings/pom.xml | 24 +++++ .../com/baeldung/stringtemplates/Templates.kt | 0 .../randomstring}/RandomStringUnitTest.kt | 2 + .../stringcomparison/StringComparisonTest.kt | 2 +- .../StringConcatenationTest.kt | 2 +- core-kotlin-modules/pom.xml | 56 +++++++++++ core-kotlin/README.md | 6 -- pom.xml | 3 +- 42 files changed, 210 insertions(+), 124 deletions(-) delete mode 100644 core-kotlin-io/.gitignore delete mode 100644 core-kotlin-io/pom.xml create mode 100644 core-kotlin-modules/README.md create mode 100644 core-kotlin-modules/core-kotlin-annotations/README.md create mode 100644 core-kotlin-modules/core-kotlin-annotations/pom.xml rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/annotations/Annotations.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/annotations/Item.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/annotations/Main.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/annotations/Validator.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/Document.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/HtmlDocument.java (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/Message.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/MessageConverter.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/TextDocument.kt (100%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/main/kotlin/com/baeldung/jvmannotations/XmlDocument.kt (100%) rename {core-kotlin/src/main/kotlin/com/baeldung/kotlin => core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmfield}/JvmSample.kt (85%) rename {core-kotlin-2 => core-kotlin-modules/core-kotlin-annotations}/src/test/kotlin/com/baeldung/annotations/ValidationTest.kt (100%) rename {core-kotlin-2/src/test/kotlin/com/baeldung/range => core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmannotations}/DocumentTest.kt (100%) rename {core-kotlin/src/test/kotlin/com/baeldung/kotlin => core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmfield}/JvmSampleTest.kt (94%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/README.md (62%) create mode 100644 core-kotlin-modules/core-kotlin-io/pom.xml rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/main/kotlin/com/baeldung/filesystem/FileReader.kt (100%) rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/main/kotlin/com/baeldung/filesystem/FileWriter.kt (100%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/src/main/kotlin/com/baeldung/inputstream/InputStreamExtension.kt (100%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt (100%) rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt (100%) rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/test/kotlin/com/baeldung/filesystem/FileWriterTest.kt (100%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt (99%) rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/test/resources/Kotlin.in (100%) rename {core-kotlin => core-kotlin-modules/core-kotlin-io}/src/test/resources/Kotlin.out (100%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/src/test/resources/inputstream2string.txt (100%) rename {core-kotlin-io => core-kotlin-modules/core-kotlin-io}/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker (100%) create mode 100644 core-kotlin-modules/core-kotlin-strings/README.md create mode 100644 core-kotlin-modules/core-kotlin-strings/pom.xml rename {core-kotlin => core-kotlin-modules/core-kotlin-strings}/src/main/kotlin/com/baeldung/stringtemplates/Templates.kt (100%) rename {core-kotlin/src/test/kotlin/com/baeldung/random => core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/randomstring}/RandomStringUnitTest.kt (98%) rename {core-kotlin-2/src/test/kotlin => core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung}/stringcomparison/StringComparisonTest.kt (97%) rename {core-kotlin/src/test/kotlin/com/baeldung/kotlin => core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringconcatenation}/StringConcatenationTest.kt (96%) create mode 100644 core-kotlin-modules/pom.xml diff --git a/core-kotlin-2/README.md b/core-kotlin-2/README.md index 06dda396d9..5a443c1831 100644 --- a/core-kotlin-2/README.md +++ b/core-kotlin-2/README.md @@ -10,7 +10,5 @@ This module contains articles about core Kotlin. - [Kotlin Scope Functions](https://www.baeldung.com/kotlin-scope-functions) - [Kotlin Annotations](https://www.baeldung.com/kotlin-annotations) - [Split a List into Parts in Kotlin](https://www.baeldung.com/kotlin-split-list-into-parts) -- [String Comparison in Kotlin](https://www.baeldung.com/kotlin-string-comparison) -- [Guide to JVM Platform Annotations in Kotlin](https://www.baeldung.com/kotlin-jvm-annotations) - [Finding an Element in a List Using Kotlin](https://www.baeldung.com/kotlin-finding-element-in-list) - More articles: [[<-- prev]](/core-kotlin) diff --git a/core-kotlin-io/.gitignore b/core-kotlin-io/.gitignore deleted file mode 100644 index f521947850..0000000000 --- a/core-kotlin-io/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/bin/ - -#ignore gradle -.gradle/ - - -#ignore build and generated files -build/ -node/ -target/ -out/ diff --git a/core-kotlin-io/pom.xml b/core-kotlin-io/pom.xml deleted file mode 100644 index 78b36626d6..0000000000 --- a/core-kotlin-io/pom.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - 4.0.0 - core-kotlin-io - core-kotlin-io - jar - - - com.baeldung - parent-kotlin - 1.0.0-SNAPSHOT - ../parent-kotlin - - - - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - ${kotlin.version} - - - org.junit.jupiter - junit-jupiter - ${junit-jupiter.version} - test - - - org.mockito - mockito-core - ${mockito.version} - test - - - net.bytebuddy - byte-buddy - ${byte-buddy.version} - test - - - org.assertj - assertj-core - ${assertj.version} - test - - - org.jetbrains.kotlin - kotlin-test - ${kotlin.version} - test - - - org.jetbrains.kotlin - kotlin-test-junit5 - ${kotlin.version} - test - - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - 1.8 - - - - - - - 1.3.30 - 5.4.2 - 2.27.0 - 1.9.12 - 3.10.0 - - - diff --git a/core-kotlin-modules/README.md b/core-kotlin-modules/README.md new file mode 100644 index 0000000000..974db9378a --- /dev/null +++ b/core-kotlin-modules/README.md @@ -0,0 +1,5 @@ +## Core Kotlin + +This module contains articles about core Kotlin. + + diff --git a/core-kotlin-modules/core-kotlin-annotations/README.md b/core-kotlin-modules/core-kotlin-annotations/README.md new file mode 100644 index 0000000000..787b67be11 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-annotations/README.md @@ -0,0 +1,8 @@ +## Core Kotlin Annotations + +This module contains articles about core Kotlin annotations. + +### Relevant articles: +- [Kotlin Annotations](https://www.baeldung.com/kotlin-annotations) +- [Guide to Kotlin @JvmField](https://www.baeldung.com/kotlin-jvm-field-annotation) +- [Guide to JVM Platform Annotations in Kotlin](https://www.baeldung.com/kotlin-jvm-annotations) diff --git a/core-kotlin-modules/core-kotlin-annotations/pom.xml b/core-kotlin-modules/core-kotlin-annotations/pom.xml new file mode 100644 index 0000000000..77670be151 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-annotations/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + core-kotlin-annotations + core-kotlin-annotations + jar + + + com.baeldung.core-kotlin-modules + core-kotlin-modules + 1.0.0-SNAPSHOT + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + 1.3.30 + 3.10.0 + + + \ No newline at end of file diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Annotations.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Annotations.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Annotations.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Annotations.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Item.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Item.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Item.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Item.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Main.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Main.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Main.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Main.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Validator.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Validator.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/annotations/Validator.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/annotations/Validator.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/Document.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/Document.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/Document.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/Document.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/HtmlDocument.java b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/HtmlDocument.java similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/HtmlDocument.java rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/HtmlDocument.java diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/Message.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/Message.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/Message.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/Message.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/MessageConverter.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/MessageConverter.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/MessageConverter.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/MessageConverter.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/TextDocument.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/TextDocument.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/TextDocument.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/TextDocument.kt diff --git a/core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/XmlDocument.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/XmlDocument.kt similarity index 100% rename from core-kotlin-2/src/main/kotlin/com/baeldung/jvmannotations/XmlDocument.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmannotations/XmlDocument.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmfield/JvmSample.kt similarity index 85% rename from core-kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt rename to core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmfield/JvmSample.kt index 610d5282b2..e60894ba88 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/kotlin/JvmSample.kt +++ b/core-kotlin-modules/core-kotlin-annotations/src/main/kotlin/com/baeldung/jvmfield/JvmSample.kt @@ -1,4 +1,4 @@ -package com.baeldung.kotlin +package com.baeldung.jvmfield class JvmSample(text:String) { @JvmField diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/annotations/ValidationTest.kt b/core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/annotations/ValidationTest.kt similarity index 100% rename from core-kotlin-2/src/test/kotlin/com/baeldung/annotations/ValidationTest.kt rename to core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/annotations/ValidationTest.kt diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/range/DocumentTest.kt b/core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmannotations/DocumentTest.kt similarity index 100% rename from core-kotlin-2/src/test/kotlin/com/baeldung/range/DocumentTest.kt rename to core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmannotations/DocumentTest.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt b/core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmfield/JvmSampleTest.kt similarity index 94% rename from core-kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt rename to core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmfield/JvmSampleTest.kt index abe6edec92..769c0311c4 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/JvmSampleTest.kt +++ b/core-kotlin-modules/core-kotlin-annotations/src/test/kotlin/com/baeldung/jvmfield/JvmSampleTest.kt @@ -1,4 +1,4 @@ -package com.baeldung.kotlin +package com.baeldung.jvmfield import org.junit.Before import org.junit.Test diff --git a/core-kotlin-io/README.md b/core-kotlin-modules/core-kotlin-io/README.md similarity index 62% rename from core-kotlin-io/README.md rename to core-kotlin-modules/core-kotlin-io/README.md index ad4c503895..89f9534d4b 100644 --- a/core-kotlin-io/README.md +++ b/core-kotlin-modules/core-kotlin-io/README.md @@ -3,7 +3,7 @@ This module contains articles about core Kotlin I/O. ### Relevant articles: - - [InputStream to String in Kotlin](https://www.baeldung.com/kotlin-inputstream-to-string) - [Console I/O in Kotlin](https://www.baeldung.com/kotlin-console-io) - +- [Reading from a File in Kotlin](https://www.baeldung.com/kotlin-read-file) +- [Writing to a File in Kotlin](https://www.baeldung.com/kotlin-write-file) diff --git a/core-kotlin-modules/core-kotlin-io/pom.xml b/core-kotlin-modules/core-kotlin-io/pom.xml new file mode 100644 index 0000000000..9443cd0d5b --- /dev/null +++ b/core-kotlin-modules/core-kotlin-io/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + core-kotlin-io + core-kotlin-io + jar + + + com.baeldung.core-kotlin-modules + core-kotlin-modules + 1.0.0-SNAPSHOT + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.junit.jupiter + junit-jupiter + ${junit-jupiter.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + 5.4.2 + 2.27.0 + 3.10.0 + + + \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt b/core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/filesystem/FileReader.kt similarity index 100% rename from core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileReader.kt rename to core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/filesystem/FileReader.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileWriter.kt b/core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/filesystem/FileWriter.kt similarity index 100% rename from core-kotlin/src/main/kotlin/com/baeldung/filesystem/FileWriter.kt rename to core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/filesystem/FileWriter.kt diff --git a/core-kotlin-io/src/main/kotlin/com/baeldung/inputstream/InputStreamExtension.kt b/core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/inputstream/InputStreamExtension.kt similarity index 100% rename from core-kotlin-io/src/main/kotlin/com/baeldung/inputstream/InputStreamExtension.kt rename to core-kotlin-modules/core-kotlin-io/src/main/kotlin/com/baeldung/inputstream/InputStreamExtension.kt diff --git a/core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt b/core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt similarity index 100% rename from core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt rename to core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/console/ConsoleIOUnitTest.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt b/core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt similarity index 100% rename from core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt rename to core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/filesystem/FileReaderTest.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileWriterTest.kt b/core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/filesystem/FileWriterTest.kt similarity index 100% rename from core-kotlin/src/test/kotlin/com/baeldung/filesystem/FileWriterTest.kt rename to core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/filesystem/FileWriterTest.kt diff --git a/core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt b/core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt similarity index 99% rename from core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt rename to core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt index d10d23bef0..a0eb26b762 100644 --- a/core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt +++ b/core-kotlin-modules/core-kotlin-io/src/test/kotlin/com/baeldung/inputstream/InputStreamToStringTest.kt @@ -7,6 +7,7 @@ import java.io.File import kotlin.test.assertEquals class InputStreamToStringTest { + private val fileName = "src/test/resources/inputstream2string.txt" private val endOfLine = System.lineSeparator() private val fileFullContent = "Computer programming can be a hassle$endOfLine" + @@ -19,6 +20,7 @@ class InputStreamToStringTest { val content = inputStream.bufferedReader().use(BufferedReader::readText) assertEquals(fileFullContent, content) } + @Test fun whenReadFileWithBufferedReaderReadText_thenFullFileContentIsReadAsString() { val file = File(fileName) @@ -32,6 +34,7 @@ class InputStreamToStringTest { } assertEquals(fileFullContent, content) } + @Test fun whenReadFileWithBufferedReaderManually_thenFullFileContentIsReadAsString() { val file = File(fileName) @@ -67,6 +70,5 @@ class InputStreamToStringTest { assertEquals(fileFullContent, content) } - } diff --git a/core-kotlin/src/test/resources/Kotlin.in b/core-kotlin-modules/core-kotlin-io/src/test/resources/Kotlin.in similarity index 100% rename from core-kotlin/src/test/resources/Kotlin.in rename to core-kotlin-modules/core-kotlin-io/src/test/resources/Kotlin.in diff --git a/core-kotlin/src/test/resources/Kotlin.out b/core-kotlin-modules/core-kotlin-io/src/test/resources/Kotlin.out similarity index 100% rename from core-kotlin/src/test/resources/Kotlin.out rename to core-kotlin-modules/core-kotlin-io/src/test/resources/Kotlin.out diff --git a/core-kotlin-io/src/test/resources/inputstream2string.txt b/core-kotlin-modules/core-kotlin-io/src/test/resources/inputstream2string.txt similarity index 100% rename from core-kotlin-io/src/test/resources/inputstream2string.txt rename to core-kotlin-modules/core-kotlin-io/src/test/resources/inputstream2string.txt diff --git a/core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/core-kotlin-modules/core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker similarity index 100% rename from core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker rename to core-kotlin-modules/core-kotlin-io/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/core-kotlin-modules/core-kotlin-strings/README.md b/core-kotlin-modules/core-kotlin-strings/README.md new file mode 100644 index 0000000000..0e3d8ea57f --- /dev/null +++ b/core-kotlin-modules/core-kotlin-strings/README.md @@ -0,0 +1,9 @@ +## Core Kotlin Strings + +This module contains articles about core Kotlin strings. + +### Relevant articles: +- [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) +- [String Comparison in Kotlin](https://www.baeldung.com/kotlin-string-comparison) +- [Concatenate Strings in Kotlin](https://www.baeldung.com/kotlin-concatenate-strings) +- [Kotlin String Templates](https://www.baeldung.com/kotlin-string-template) diff --git a/core-kotlin-modules/core-kotlin-strings/pom.xml b/core-kotlin-modules/core-kotlin-strings/pom.xml new file mode 100644 index 0000000000..fb2998e9e1 --- /dev/null +++ b/core-kotlin-modules/core-kotlin-strings/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + core-kotlin-strings + core-kotlin-strings + jar + + + com.baeldung.core-kotlin-modules + core-kotlin-modules + 1.0.0-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/stringtemplates/Templates.kt b/core-kotlin-modules/core-kotlin-strings/src/main/kotlin/com/baeldung/stringtemplates/Templates.kt similarity index 100% rename from core-kotlin/src/main/kotlin/com/baeldung/stringtemplates/Templates.kt rename to core-kotlin-modules/core-kotlin-strings/src/main/kotlin/com/baeldung/stringtemplates/Templates.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/randomstring/RandomStringUnitTest.kt similarity index 98% rename from core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt rename to core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/randomstring/RandomStringUnitTest.kt index 62e8dfe720..5b84d1f67d 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/random/RandomStringUnitTest.kt +++ b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/randomstring/RandomStringUnitTest.kt @@ -1,3 +1,5 @@ +package com.baeldung.randomstring + import org.apache.commons.lang3.RandomStringUtils import org.junit.Before import org.junit.jupiter.api.BeforeAll diff --git a/core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt similarity index 97% rename from core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt rename to core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt index 45a8dd7e04..9528f62df5 100644 --- a/core-kotlin-2/src/test/kotlin/stringcomparison/StringComparisonTest.kt +++ b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringcomparison/StringComparisonTest.kt @@ -1,4 +1,4 @@ -package stringcomparison +package com.baeldung.stringcomparison import org.junit.Test import kotlin.test.assertFalse diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/StringConcatenationTest.kt b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringconcatenation/StringConcatenationTest.kt similarity index 96% rename from core-kotlin/src/test/kotlin/com/baeldung/kotlin/StringConcatenationTest.kt rename to core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringconcatenation/StringConcatenationTest.kt index 9c371614a4..9ac011f7d2 100644 --- a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/StringConcatenationTest.kt +++ b/core-kotlin-modules/core-kotlin-strings/src/test/kotlin/com/baeldung/stringconcatenation/StringConcatenationTest.kt @@ -1,4 +1,4 @@ -package com.baeldung.kotlin +package com.baeldung.stringconcatenation import org.junit.Test import kotlin.test.assertEquals diff --git a/core-kotlin-modules/pom.xml b/core-kotlin-modules/pom.xml new file mode 100644 index 0000000000..747e8b69de --- /dev/null +++ b/core-kotlin-modules/pom.xml @@ -0,0 +1,56 @@ + + + 4.0.0 + com.baeldung.core-kotlin-modules + core-kotlin-modules + core-kotlin-modules + pom + + + com.baeldung + parent-kotlin + 1.0.0-SNAPSHOT + ../parent-kotlin + + + + core-kotlin-annotations + core-kotlin-io + core-kotlin-strings + + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + + + + 1.3.30 + + + diff --git a/core-kotlin/README.md b/core-kotlin/README.md index bdff95d36d..f75a4e764c 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -24,12 +24,8 @@ This module contains articles about core Kotlin. - [Try-with-resources in Kotlin](https://www.baeldung.com/kotlin-try-with-resources) - [Regular Expressions in Kotlin](https://www.baeldung.com/kotlin-regular-expressions) - [Objects in Kotlin](https://www.baeldung.com/kotlin-objects) -- [Reading from a File in Kotlin](https://www.baeldung.com/kotlin-read-file) -- [Guide to Kotlin @JvmField](https://www.baeldung.com/kotlin-jvm-field-annotation) - [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection) -- [Writing to a File in Kotlin](https://www.baeldung.com/kotlin-write-file) - [Lambda Expressions in Kotlin](https://www.baeldung.com/kotlin-lambda-expressions) -- [Kotlin String Templates](https://www.baeldung.com/kotlin-string-template) - [Working with Enums in Kotlin](https://www.baeldung.com/kotlin-enum) - [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project) - [Reflection with Kotlin](https://www.baeldung.com/kotlin-reflection) @@ -41,7 +37,6 @@ This module contains articles about core Kotlin. - [Fuel HTTP Library with Kotlin](https://www.baeldung.com/kotlin-fuel) - [Introduction to Kovenant Library for Kotlin](https://www.baeldung.com/kotlin-kovenant) - [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class) -- [Concatenate Strings in Kotlin](https://www.baeldung.com/kotlin-concatenate-strings) - [Kotlin return, break, continue Keywords](https://www.baeldung.com/kotlin-return-break-continue) - [Mapping of Data Objects in Kotlin](https://www.baeldung.com/kotlin-data-objects) - [Initializing Arrays in Kotlin](https://www.baeldung.com/kotlin-initialize-array) @@ -50,7 +45,6 @@ This module contains articles about core Kotlin. - [Guide to Sorting in Kotlin](https://www.baeldung.com/kotlin-sort) - [Dependency Injection for Kotlin with Injekt](https://www.baeldung.com/kotlin-dependency-injection-with-injekt) - [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree) -- [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) - [Kotlin Contracts](https://www.baeldung.com/kotlin-contracts) - [Operator Overloading in Kotlin](https://www.baeldung.com/kotlin-operator-overloading) - [Inline Classes in Kotlin](https://www.baeldung.com/kotlin-inline-classes) diff --git a/pom.xml b/pom.xml index db7ec25a5c..a9d66d0546 100644 --- a/pom.xml +++ b/pom.xml @@ -454,6 +454,7 @@ core-java-modules/core-java core-java-modules/core-java-jar core-java-modules/core-java-jvm + core-kotlin-modules core-scala couchbase custom-pmd @@ -932,7 +933,6 @@ core-java-modules/core-java-concurrency-advanced-3 core-kotlin core-kotlin-2 - core-kotlin-io jenkins/plugins jhipster @@ -1094,6 +1094,7 @@ core-java-modules/core-java-string-algorithms-2 core-java-modules/core-java-string-apis core-java-modules/core-java-strings + core-kotlin-modules core-scala couchbase custom-pmd