From 7010533b25dac12eb6b041b502f82a7a3d65094e Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 15:19:28 +0100 Subject: [PATCH 01/30] 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 fbd2c5884418f60d08af213602aa55dcef6854e8 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 15:54:37 +0100 Subject: [PATCH 02/30] 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 3cde05a6ed82c398b617a687a2f99b8c6178fec5 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 20:55:03 +0100 Subject: [PATCH 03/30] 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 1f94507c528bb8259b793cae7593662785fd9e7f Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 17 Nov 2019 21:27:07 +0100 Subject: [PATCH 04/30] 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 4979fd21dc9428b05cc69565adddd75ff740fc91 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Mon, 25 Nov 2019 21:57:06 +0100 Subject: [PATCH 05/30] 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 fd2d9b1477394975794fc155237f963da4867cfd Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Wed, 27 Nov 2019 20:35:28 +0100 Subject: [PATCH 06/30] [ 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 406d6ac92793c1541ca687f7fbd8f83da8926e8b Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 30 Nov 2019 23:11:02 +0100 Subject: [PATCH 07/30] [ 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 b7c0761241ec62b7490cce041f7c21225a2e32c5 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 30 Nov 2019 23:15:39 +0100 Subject: [PATCH 08/30] [ 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 8bdf6f8d349029951198a6daea11df2871734c72 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Thu, 5 Dec 2019 09:42:34 -0500 Subject: [PATCH 09/30] 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 c6acca67144c66d8cf3e836c2d0766d0010d7ea2 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sat, 7 Dec 2019 09:08:35 -0500 Subject: [PATCH 10/30] 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 6d1caf802679058c022ea6927dc11a3025e3f7a3 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 7 Dec 2019 17:40:17 +0100 Subject: [PATCH 11/30] 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 9de21f0fc8aa7635aef7230e1834ded9002a9075 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sat, 7 Dec 2019 21:50:20 +0100 Subject: [PATCH 12/30] 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 6e096b99a3472d8f8fc321db19fe8bac6f97ce98 Mon Sep 17 00:00:00 2001 From: Lukasz Rys Date: Sun, 8 Dec 2019 11:11:46 +0100 Subject: [PATCH 13/30] 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 b1c2b0bebc00b733a65a9fdc07e41b0a7d9033c0 Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Sun, 8 Dec 2019 21:53:52 +0100 Subject: [PATCH 14/30] 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 2a419fc2618be6fc415e722acb73cfe962137e2e Mon Sep 17 00:00:00 2001 From: Krzysiek Date: Mon, 9 Dec 2019 20:19:45 +0100 Subject: [PATCH 15/30] 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 3539c9900a8ffabd26dce62e44ac812c8751ccda Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Mon, 9 Dec 2019 21:54:17 -0500 Subject: [PATCH 16/30] 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 a96ad152232bcadcf21d7e2647b42b772d6ed0e2 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 10 Dec 2019 08:23:01 -0500 Subject: [PATCH 17/30] 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 49b511d74a37851ea9593eda3e84f9cd3de6b35f Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Tue, 10 Dec 2019 08:35:09 -0500 Subject: [PATCH 18/30] 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 96d4c3c95b38329994c5c96544fb05f03c82ac08 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 19/30] 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 254486adcfc9fb79c41d980910ccf5933aa79dda Mon Sep 17 00:00:00 2001 From: Rui Vilao Date: Tue, 10 Dec 2019 19:11:50 +0100 Subject: [PATCH 20/30] 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 c0a4e8019b8669e4a1450604761557a0cf28b64f Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 10 Dec 2019 18:37:06 +0000 Subject: [PATCH 21/30] 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 d746d0b74af4b22f508c271092fef7f57b1cdd32 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 07:57:32 -0500 Subject: [PATCH 22/30] 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 348d6386b00e94dc379986d5ed573e4ce79d4926 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 08:01:53 -0500 Subject: [PATCH 23/30] Revert "BAEL-3290: Corrected formatting and removed author line in class comment" This reverts commit d746d0b74af4b22f508c271092fef7f57b1cdd32. --- .../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 71ba4ca875eb2b7f2206389063b9141a944ae7d0 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Wed, 11 Dec 2019 08:26:29 -0500 Subject: [PATCH 24/30] 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 c8cafe8cd293a09ead60be87a5d02cc57e07b61f 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 25/30] 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 8f1d5128c71c1a3cd0c0f1f049ff8b3e6b70fb02 Mon Sep 17 00:00:00 2001 From: Vikas Rajput Date: Wed, 11 Dec 2019 21:42:31 +0300 Subject: [PATCH 26/30] 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 339913ef05ed8bcf56734fce33c86f15b12cb504 Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Fri, 13 Dec 2019 08:41:16 +0000 Subject: [PATCH 27/30] 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 0201d9f0e7ad305ba89c9c40abb6b1a3236f3988 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 09:57:24 +0100 Subject: [PATCH 28/30] 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 1f0ab8ba5bb2a2c0229c627030b048f39bb40ab3 Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 09:58:42 +0100 Subject: [PATCH 29/30] 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 f9f153439495aacb186e57eadec2ce20e413d71b Mon Sep 17 00:00:00 2001 From: kwoyke Date: Fri, 13 Dec 2019 11:38:28 +0100 Subject: [PATCH 30/30] 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());