/* * Copyright (c) 2006 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package orderMngr.domain.order; import java.math.*; import java.util.*; public final class OrderFactory { // Just for simplicity. In a real application, a more robust mechanism would be used for // generating sequential order numbers, such as a database sequence or identity column. private static int nextOrderNo = 1; public Order createOrder(String customerId, List<OrderItem> items) throws MissingOrderItems, InvalidOrderItem, DuplicateOrderItem { if (items.isEmpty()) { throw new MissingOrderItems(); } validateOrderItems(items); Order order = new Order(nextOrderNo++, customerId); order.getItems().addAll(items); new OrderRepository().create(order); return order; } private void validateOrderItems(List<OrderItem> items) throws InvalidOrderItem, DuplicateOrderItem { for (OrderItem item : items) { if (item.getQuantity() <= 0 || item.getUnitPrice().compareTo(BigDecimal.ZERO) <= 0) { throw new InvalidOrderItem("Quantity=" + item.getQuantity() + ", Unit Price=" + item.getUnitPrice()); } } if (new HashSet<>(items).size() < items.size()) { throw new DuplicateOrderItem(); } } }