[
  {
    "path": ".gitignore",
    "content": ".idea/\ntarget\n*.iml\natlassian-ide-plugin.xml\n"
  },
  {
    "path": "README.md",
    "content": "Sampler for Clean Architecture/Onion-Architecture [![Build Status](https://snap-ci.com/mp911de/CleanArchitecture/branch/master/build_image)](https://snap-ci.com/mp911de/CleanArchitecture/branch/master)\n========================\nAuthor: Mark Paluch<br/>\nTechnologies: CDI, JSF, JPA, EJB, JPA, JAX-RS<br/>\nSummary: Example Application built using an Onion-Architecture that incorporates multiple technologies<br/>\nSource: <https://github.com/mp911de/CleanArchitecture><br/>\n\nMore Information: <br/>\n* https://www.paluch.biz/blog/80-clean-your-architecture-databases-the-web-and-service-interfaces-are-just-plugins.html\n* https://www.paluch.biz/blog/83-clean-architecture-code-examples-for-an-onion-architecture.html\n\nWhat is it?\n-----------\nThis simple application consists of a few use cases. The purpose of the application is to show how to\napply clean architecture patterns in a Multi-Module Maven/Java environment.\n\nIt all starts with the data structures/entities/application model. These models are independent of business logic and delivery mechanisms. The models are specific to your domain, but not necessary specific to your application. They live within the `application-model` module. Business rules and use cases, the specific things your application does, reside within the `use-cases` module. They depend on the `application-model` and perhaps on external things that are represented by boundaries, located in `contracts`. Those boundaries are an agreement between the use case and the other side that provides a specific implementation. The `contracts` depend only on the `application-model`. No ORM entities or external-specific API/entities.\nORM, caching implementations, clients to external services implement a contract that is located in `external` and its sub-modules.\n\nAll parts are tied together by the delivery mechanism that\nintegrates the externals and connects the use cases by supplying dependencies to come the system to life.\n\nIf you need a different implementation for any external, so you can easily change that specific part without\naffecting other parts of the system.\n\nThese patterns are verified by real life projects.\n\nA word on Clean Architecture\n----------------------------\n\nAs soon as you dig into the code, you'll notice comments on the one or other class. Subject of these comments is to help\nto understand the structure and the different styles, which are possible.\n\nYou'll notice soon, there are many different styles and ways to approach the Clean Architecture style. There are use cases\nwhich are built much more simple, e. g. without input/output boundaries and direct usage of dependency injection and\nthere are use-cases which implement input boundaries and use output boundaries. \n\nIn the end it's up to you, how much you're willing to invest in your architecture. This is, however, only a variety of\nexamples to give you an impression, how to express Clean Architecture with Java.\n\n\nWhat does it?\n---------\nThe use cases are:\n\n* CreateOrUpdateItem\n* CreateOrUpdateUser\n* ListItems\n* ListOrders\n* PlaceOrder\n* PlaceOrderValidator\n\nand a few business entities:\n\n* User\n* OrderItem\n* Order\n* Item\n\nThese use cases can be accessed by REST or Web UI (JSF) and are persisted using JPA within an in-memory H2 Database\n(everything you need is included).\n\nRequirements to run the App\n-------------------\n\nAll you need to build this project is Java 6.0 (Java SDK 1.6) or better, Maven 3.0 or better.\n\nThe application this project produces is designed to be run on JBoss AS7, WildFly 8 or better.\nYou could easily change the delivery mechanism to a console application with only providing a new delivery mechanism\nand a different approach how to wire the dependencies.\n\n\nBuild and Deploy the Quickstart\n-------------------------\n\n_NOTE: The following build command assumes you have configured your Maven user settings. If you have not, you must include Maven setting arguments on the command line._\n\n1. Open a command line and navigate to the root directory of this project.\n2. Type this command to build and deploy the archive:\n\n        mvn clean package wildfly:run\n\n3. This will start a WildFly 10 instance and deploy `target/clean-architecture.war` to the newly started instance.\n \n\nAccess the application \n-------------------------\n\nThe application will be running at the following URL: <http://localhost:8080/clean-architecture/>.\n\n"
  },
  {
    "path": "application-model/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>application-model</artifactId>\n\n\n    <dependencies>\n        <dependency>\n            <groupId>org.apache.commons</groupId>\n            <artifactId>commons-lang3</artifactId>\n        </dependency>\n    </dependencies>\n</project>\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/AbstractModel.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\nimport java.io.Serializable;\n\nimport org.apache.commons.lang3.builder.EqualsBuilder;\nimport org.apache.commons.lang3.builder.HashCodeBuilder;\nimport org.apache.commons.lang3.builder.ReflectionToStringBuilder;\nimport org.apache.commons.lang3.builder.ToStringStyle;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 07.02.14 07:34\n */\npublic abstract class AbstractModel implements Serializable {\n\n    @Override\n    public int hashCode() {\n        return HashCodeBuilder.reflectionHashCode(this, false);\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        return EqualsBuilder.reflectionEquals(this, obj, false);\n    }\n\n    @Override\n    public String toString() {\n        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);\n    }\n}\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Item.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:51\n */\npublic class Item extends AbstractModel {\n    private String item;\n\n    public String getItem() {\n        return item;\n    }\n\n    public void setItem(String item) {\n        this.item = item;\n    }\n}\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/NotFoundException.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:47\n */\npublic class NotFoundException extends RuntimeException\n{\n    public NotFoundException(String message)\n    {\n        super(message);\n    }\n}\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Order.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:23\n */\npublic class Order extends AbstractModel {\n    private String orderId;\n    private Date orderDate;\n\n    private List<OrderItem> items = new ArrayList<>();\n    private User createdBy;\n\n    public String getOrderId() {\n        return orderId;\n    }\n\n    public void setOrderId(String orderId) {\n        this.orderId = orderId;\n    }\n\n    public Date getOrderDate() {\n        return orderDate;\n    }\n\n    public void setOrderDate(Date orderDate) {\n        this.orderDate = orderDate;\n    }\n\n    public List<OrderItem> getItems() {\n        return items;\n    }\n\n    public User getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(User createdBy) {\n        this.createdBy = createdBy;\n    }\n}\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/OrderItem.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:24\n */\npublic class OrderItem extends AbstractModel {\n    private String orderItem;\n\n    public OrderItem() {\n    }\n\n    public OrderItem(String orderItem) {\n        this.orderItem = orderItem;\n    }\n\n    public String getOrderItem() {\n        return orderItem;\n    }\n\n    public void setOrderItem(String orderItem) {\n        this.orderItem = orderItem;\n    }\n}\n"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/User.java",
    "content": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:24\n */\npublic class User extends AbstractModel {\n    private String userName;\n\n    public User() {\n    }\n\n    public User(String userName) {\n        this.userName = userName;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n}\n"
  },
  {
    "path": "commons/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>commons</artifactId>\n\n</project>\n"
  },
  {
    "path": "commons/src/main/java/biz/paluch/clean/architecture/commons/DateProvider.java",
    "content": "package biz.paluch.clean.architecture.commons;\n\nimport java.util.Date;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:01\n */\npublic class DateProvider {\n    private static DateProvider dateProvider = new DateProvider();\n\n    public static Date get() {\n        return dateProvider.getCurrentDate();\n    }\n\n    public Date getCurrentDate() {\n        return new Date();\n    }\n\n    public static void setDateProvider(DateProvider dateProvider) {\n        DateProvider.dateProvider = dateProvider;\n    }\n}\n"
  },
  {
    "path": "commons/src/main/java/biz/paluch/clean/architecture/commons/StaticDateProvider.java",
    "content": "package biz.paluch.clean.architecture.commons;\n\nimport java.util.Date;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:03\n */\npublic class StaticDateProvider extends DateProvider {\n\n    private Date currentDate;\n\n    public static void initialize(Date currentDate) {\n        StaticDateProvider instance = new StaticDateProvider();\n        instance.setCurrentDate(currentDate);\n        DateProvider.setDateProvider(instance);\n    }\n\n    @Override\n    public Date getCurrentDate() {\n        return currentDate;\n    }\n\n    public void setCurrentDate(Date currentDate) {\n        this.currentDate = currentDate;\n    }\n}\n"
  },
  {
    "path": "contracts/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>contracts</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>application-model</artifactId>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/ItemRepository.java",
    "content": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:29\n */\npublic interface ItemRepository {\n\n    Item find(String item);\n\n    List<Item> findAll();\n\n    void persist(Item item);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/OrderRepository.java",
    "content": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:26\n */\npublic interface OrderRepository {\n    int getNextOrderId();\n\n    void persist(Order order);\n\n    List<Order> findOrders();\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/UserRepository.java",
    "content": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport biz.paluch.clean.architecture.applicationmodel.User;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:27\n */\npublic interface UserRepository {\n    User find(String userName);\n\n    void store(User user);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/CreateOrUpdateItem.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\n\n/**\n * Create or update item Use-Case.\n * \n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic interface CreateOrUpdateItem {\n\n    /**\n     * Creates a new or updates an existing item.\n     * \n     * @param item\n     */\n    void createOrUpdateItem(String item);\n\n    /**\n     * Setter to {@link ItemRepository} dependency.\n     * \n     * @param itemRepository\n     */\n    void setItemRepository(ItemRepository itemRepository);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItems.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\n\n/**\n * List items Use-Case.\n * \n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic interface ListItems {\n\n    /**\n     * List all items and pass these to the {@link ListItemsOutput} output.\n     * \n     * @param listItemsOutput\n     */\n    void listItems(ListItemsOutput listItemsOutput);\n\n    /**\n     * Setter to {@link ItemRepository} dependency.\n     * \n     * @param itemRepository\n     */\n    void setItemRepository(ItemRepository itemRepository);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItemsOutput.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic interface ListItemsOutput {\n\n    void onResponse(List<Item> items);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrder.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.applicationmodel.NotFoundException;\n\n/**\n * This use-case input boundary does not define any dependencies. The {@link #placeOrder(PlaceOrderRequest, PlaceOrderOutput)}\n * method accept a request data structure and an output boundary for returning the result of the operation.\n * \n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic interface PlaceOrder {\n\n    /**\n     * Places an order.\n     * \n     * @param request\n     * @param output\n     */\n    void placeOrder(PlaceOrderRequest request, PlaceOrderOutput output) throws NotFoundException;\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderOutput.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic interface PlaceOrderOutput {\n    void onResponse(String orderId);\n}\n"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderRequest.java",
    "content": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport java.util.List;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic class PlaceOrderRequest {\n\n    public List<String> items;\n    public String userName;\n\n}\n"
  },
  {
    "path": "delivery/web/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n        <relativePath>../..</relativePath>\n    </parent>\n\n    <artifactId>web</artifactId>\n    <packaging>war</packaging>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>contracts</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>use-cases</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>application-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>jpa-repository</artifactId>\n        </dependency>\n\n        <!-- First declare the APIs we depend on and need for compilation. All\n            of them are provided by JBoss AS 7 -->\n\n        <!-- Import the CDI API, we use provided scope as the API is included in\n            JBoss AS 7 -->\n        <dependency>\n            <groupId>javax.enterprise</groupId>\n            <artifactId>cdi-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n\n        <!-- Import the Common Annotations API (JSR-250), we use provided scope \n            as the API is included in JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.annotation</groupId>\n            <artifactId>jboss-annotations-api_1.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the JAX-RS API, we use provided scope as the API is included \n            in JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.ws.rs</groupId>\n            <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the EJB API, we use provided scope as the API is included in \n            JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.ejb</groupId>\n            <artifactId>jboss-ejb-api_3.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the JSF API, we use provided scope as the API is included in \n            JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.faces</groupId>\n            <artifactId>jboss-jsf-api_2.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the JPA API, we use provided scope as the API is included in\n            JBoss AS 7 -->\n        <dependency>\n            <groupId>org.hibernate.javax.persistence</groupId>\n            <artifactId>hibernate-jpa-2.0-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n\n        <!-- Needed for running tests (you may also use TestNG) -->\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.jboss.resteasy</groupId>\n            <artifactId>resteasy-jaxrs</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.jboss.resteasy</groupId>\n            <artifactId>resteasy-jaxb-provider</artifactId>\n            <scope>provided</scope>\n        </dependency>\n    </dependencies>\n\n    <build>\n        <!-- Maven will append the version to the finalName (which is the name \n            given to the generated war, and hence the context root) -->\n        <finalName>${project.artifactId}</finalName>\n        <plugins>\n            <!-- Compiler plugin enforces Java 1.6 compatibility and activates annotation \n                processors -->\n            <plugin>\n                <artifactId>maven-war-plugin</artifactId>\n                <version>${version.war.plugin}</version>\n                <configuration>\n                    <!-- Java EE 6 doesn't require web.xml, Maven needs to catch up! -->\n                    <failOnMissingWebXml>false</failOnMissingWebXml>\n                    <warName>clean-architecture</warName>\n                </configuration>\n            </plugin>\n            <!-- The Wildfly plugin deploys your war to a local Wildfly container -->\n            <!-- To use, run: mvn package wildfly:deploy -->\n            <plugin>\n                <groupId>org.wildfly.plugins</groupId>\n                <artifactId>wildfly-maven-plugin</artifactId>\n                <configuration>\n                    <skip>false</skip>\n                    <filename>clean-architecture.war</filename>\n                </configuration>\n            </plugin>\n        </plugins>\n    </build>\n\n    <profiles>\n        <profile>\n            <!-- When built in OpenShift the 'openshift' profile will be used when \n                invoking mvn. -->\n            <!-- Use this profile for any OpenShift specific customization your app \n                will need. -->\n            <!-- By default that is to put the resulting archive into the 'deployments' \n                folder. -->\n            <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html -->\n            <id>openshift</id>\n            <build>\n                <plugins>\n                    <plugin>\n                        <artifactId>maven-war-plugin</artifactId>\n                        <version>${version.war.plugin}</version>\n                        <configuration>\n                            <outputDirectory>deployments</outputDirectory>\n                            <warName>ROOT</warName>\n                        </configuration>\n                    </plugin>\n                </plugins>\n            </build>\n        </profile>\n\n    </profiles>\n</project>\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/di_example/PlaceOrderWithDependencies.java",
    "content": "package biz.paluch.clean.architecture.di_example;\n\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\nimport biz.paluch.clean.architecture.usecases.advanced.PlaceOrderImpl;\n\n/**\n * This Use-Case wrapper extends the {@link PlaceOrderImpl} use case class in order to use declarative dependency injection.\n * \n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n */\npublic class PlaceOrderWithDependencies extends PlaceOrderImpl {\n\n    @Inject\n    @Override\n    public void setOrderRepository(OrderRepository orderRepository) {\n        super.setOrderRepository(orderRepository);\n    }\n\n    @Inject\n    @Override\n    public void setItemRepository(ItemRepository itemRepository) {\n        super.setItemRepository(itemRepository);\n    }\n\n    @Inject\n    @Override\n    public void setUserRepository(UserRepository userRepository) {\n        super.setUserRepository(userRepository);\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/facade/ItemService.java",
    "content": "package biz.paluch.clean.architecture.facade;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.annotation.PostConstruct;\nimport javax.ejb.Stateless;\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.CreateOrUpdateItem;\nimport biz.paluch.clean.architecture.contracts.usecases.ListItemsOutput;\nimport biz.paluch.clean.architecture.usecases.advanced.ListItemsImpl;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 12:45\n */\n@Stateless\npublic class ItemService {\n\n    @Inject\n    private ItemRepository itemRepository;\n\n    @Inject\n    private ListItemsImpl listItems;\n\n    @Inject\n    private CreateOrUpdateItem createOrUpdateItem;\n\n    /**\n     * Wire all dependencies.\n     */\n    @PostConstruct\n    public void postConstruct() {\n        createOrUpdateItem.setItemRepository(itemRepository);\n        listItems.setItemRepository(itemRepository);\n    }\n\n    /**\n     * List items and illustrate the use of an output boundary without an adapter. While this may look awkward, imagine this use\n     * case might have a conversation with the output boundary. The use case does some action and talks to the output boundary\n     * in order to push some intermediate results until the operation is finished.\n     * \n     * @return list of items.\n     */\n    public List<Item> listItems() {\n\n        final List<Item> results = new ArrayList<>();\n\n        listItems.listItems(new ListItemsOutput() {\n            @Override\n            public void onResponse(List<Item> items) {\n                results.addAll(items);\n            }\n        });\n\n        return results;\n    }\n\n    /**\n     * A simple use case without the need of an output boundary.\n     * \n     * @param item\n     */\n    public void createOrUpdateItem(String item) {\n        createOrUpdateItem.createOrUpdateItem(item);\n    }\n\n    public Item find(String itemId) {\n        return itemRepository.find(itemId);\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/facade/OrderService.java",
    "content": "package biz.paluch.clean.architecture.facade;\n\nimport java.util.List;\n\nimport javax.ejb.Stateless;\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.applicationmodel.NotFoundException;\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;\nimport biz.paluch.clean.architecture.di_example.PlaceOrderWithDependencies;\nimport biz.paluch.clean.architecture.usecases.simple.CreateOrUpdateUser;\nimport biz.paluch.clean.architecture.usecases.simple.ListOrders;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 12:45\n */\n@Stateless\npublic class OrderService {\n\n    @Inject\n    private OrderRepository orderRepository;\n\n    @Inject\n    private UserRepository userRepository;\n\n    @Inject\n    private ItemRepository itemRepository;\n\n    @Inject\n    private CreateOrUpdateUser createOrUpdateUser;\n\n    @Inject\n    private ListOrders listOrders;\n\n    @Inject\n    private PlaceOrderWithDependencies placeOrder;\n\n    public List<Order> listOrders() {\n        return listOrders.listOrders();\n    }\n\n    public String placeOrder(List<String> items, String userName) throws NotFoundException {\n        createOrUpdateUser.createOrUpdateUser(userName);\n\n        PlaceOrderRequest request = new PlaceOrderRequest();\n        request.items = items;\n        request.userName = userName;\n\n        PlaceOrderResponse response = new PlaceOrderResponse();\n\n        placeOrder.placeOrder(request, response);\n\n        return response.orderId;\n    }\n\n    private static class PlaceOrderResponse implements PlaceOrderOutput {\n        public String orderId;\n\n        @Override\n        public void onResponse(String orderId) {\n            this.orderId = orderId;\n        }\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemController.java",
    "content": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScoped;\nimport javax.faces.model.SelectItem;\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.facade.ItemService;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:10\n */\n@RequestScoped\n@Named(\"itemController\")\npublic class ItemController {\n    @EJB\n    private ItemService itemService;\n\n    @Inject\n    private ItemModel itemModel;\n\n    public List<SelectItem> getItems() {\n        List<Item> items = itemService.listItems();\n        List<SelectItem> result = new ArrayList<>();\n\n        for (Item item : items) {\n            SelectItem selectItem = new SelectItem(item.getItem(), item.getItem());\n            result.add(selectItem);\n        }\n\n        return result;\n    }\n\n    public void createOrUpdateItem() {\n        itemService.createOrUpdateItem(itemModel.getItem());\n        itemModel.setItem(\"\");\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemModel.java",
    "content": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\n\nimport javax.enterprise.inject.Model;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:10\n */\n@Model\npublic class ItemModel implements Serializable\n{\n    private String item;\n\n    public String getItem()\n    {\n        return item;\n    }\n\n    public void setItem(String item)\n    {\n        this.item = item;\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderController.java",
    "content": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScoped;\nimport javax.faces.application.FacesMessage;\nimport javax.faces.context.FacesContext;\nimport javax.inject.Inject;\nimport javax.inject.Named;\n\nimport biz.paluch.clean.architecture.facade.OrderService;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:41\n */\n@RequestScoped\n@Named(\"orderController\")\npublic class OrderController {\n    @EJB\n    private OrderService orderService;\n\n    @Inject\n    private OrderModel orderModel;\n\n    public void addItem() {\n        OrderItem oim = new OrderItem();\n\n        if (orderModel.getSelectedItem() != null && !\"\".equals(orderModel.getSelectedItem().trim())) {\n            oim.setItem(orderModel.getSelectedItem());\n            orderModel.getOrderItems().add(oim);\n        }\n    }\n\n    public void removeItem(OrderItem item) {\n        orderModel.getOrderItems().remove(item);\n    }\n\n    public void createOrder() {\n        List<String> items = new ArrayList<>();\n\n        for (OrderItem orderItem : orderModel.getOrderItems()) {\n            items.add(orderItem.getItem());\n        }\n        String orderId = orderService.placeOrder(items, orderModel.getUserName());\n\n        orderModel.setUserName(null);\n        orderModel.setSelectedItem(null);\n        orderModel.setOrderItems(new ArrayList<OrderItem>());\n\n        FacesContext.getCurrentInstance().addMessage(\"success\",\n                new FacesMessage(\"Created sucessfully an order with id \" + orderId));\n\n    }\n\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderItem.java",
    "content": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:40\n */\npublic class OrderItem implements Serializable\n{\n    private String item;\n\n    public String getItem()\n    {\n        return item;\n    }\n\n    public void setItem(String item)\n    {\n        this.item = item;\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderModel.java",
    "content": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.enterprise.context.SessionScoped;\nimport javax.enterprise.inject.Model;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:39\n */\n@Model\n@SessionScoped\npublic class OrderModel implements Serializable\n{\n    private String userName;\n    private List<OrderItem> orderItems = new ArrayList<>();\n    private String selectedItem;\n\n    public String getSelectedItem()\n    {\n        return selectedItem;\n    }\n\n    public void setSelectedItem(String selectedItem)\n    {\n        this.selectedItem = selectedItem;\n    }\n\n    public String getUserName()\n    {\n        return userName;\n    }\n\n    public void setUserName(String userName)\n    {\n        this.userName = userName;\n    }\n\n    public List<OrderItem> getOrderItems()\n    {\n        return orderItems;\n    }\n\n    public void setOrderItems(List<OrderItem> orderItems)\n    {\n        this.orderItems = orderItems;\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemResource.java",
    "content": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScoped;\nimport javax.ws.rs.*;\nimport javax.ws.rs.core.MediaType;\nimport javax.ws.rs.core.Response;\nimport javax.xml.bind.JAXBElement;\nimport javax.xml.namespace.QName;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.facade.ItemService;\n\n@Path(\"/items\")\n@RequestScoped\npublic class ItemResource {\n\n    @EJB\n    private ItemService itemService;\n\n    @GET\n    @Produces(MediaType.APPLICATION_XML)\n    public ItemsRepresentation list() {\n        ItemsRepresentation result = new ItemsRepresentation();\n        result.setItems(itemService.listItems());\n        return result;\n    }\n\n    @GET\n    @Produces(MediaType.APPLICATION_XML)\n    @Path(\"{itemId}\")\n    public JAXBElement<Item> get(@PathParam(\"itemId\") String itemId) {\n        Item item = itemService.find(itemId);\n        if (item == null) {\n            throw new WebApplicationException(Response.Status.NOT_FOUND);\n        }\n\n        return new JAXBElement<>(new QName(\"item\"), Item.class, item);\n    }\n\n    @PUT\n    @Consumes(MediaType.APPLICATION_XML)\n    @Produces(MediaType.APPLICATION_XML)\n    public void createOrUpdate(JAXBElement<Item> item) {\n        itemService.createOrUpdateItem(item.getValue().getItem());\n    }\n\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemsRepresentation.java",
    "content": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.xml.bind.annotation.XmlRootElement;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:53\n */\n@XmlRootElement\npublic class ItemsRepresentation {\n    private List<Item> items = new ArrayList<>();\n\n    public List<Item> getItems() {\n        return items;\n    }\n\n    public void setItems(List<Item> items) {\n        this.items = items;\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/JaxRsActivator.java",
    "content": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * contributors by the @authors tag. See the copyright.txt in the\n * distribution for a full listing of individual contributors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage biz.paluch.clean.architecture.frontend.rest;\n\nimport javax.ws.rs.ApplicationPath;\nimport javax.ws.rs.core.Application;\n\n/**\n * A class extending {@link Application} and annotated with @ApplicationPath is the Java EE 6 \"no XML\" approach to activating\n * JAX-RS.\n * \n * <p>\n * Resources are served relative to the servlet path specified in the {@link ApplicationPath} annotation.\n * </p>\n */\n@ApplicationPath(\"/rest\")\npublic class JaxRsActivator extends Application {\n    /* class body intentionally left blank */\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrderResource.java",
    "content": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScoped;\nimport javax.ws.rs.GET;\nimport javax.ws.rs.Path;\nimport javax.ws.rs.Produces;\nimport javax.ws.rs.core.MediaType;\n\nimport biz.paluch.clean.architecture.facade.OrderService;\n\n@Path(\"/orders\")\n@RequestScoped\npublic class OrderResource {\n\n    @EJB\n    private OrderService orderService;\n\n    @GET\n    @Produces(MediaType.APPLICATION_XML)\n    public OrdersRepresentation list() {\n        OrdersRepresentation result = new OrdersRepresentation();\n        result.setOrders(orderService.listOrders());\n        return result;\n    }\n\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrdersRepresentation.java",
    "content": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.xml.bind.annotation.XmlRootElement;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:56\n */\n@XmlRootElement\npublic class OrdersRepresentation {\n    private List<Order> orders = new ArrayList<>();\n\n    public List<Order> getOrders() {\n        return orders;\n    }\n\n    public void setOrders(List<Order> orders) {\n        this.orders = orders;\n    }\n}\n"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/util/Resources.java",
    "content": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * contributors by the @authors tag. See the copyright.txt in the\n * distribution for a full listing of individual contributors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage biz.paluch.clean.architecture.util;\n\nimport java.util.logging.Logger;\n\nimport javax.enterprise.context.RequestScoped;\nimport javax.enterprise.inject.Produces;\nimport javax.enterprise.inject.spi.InjectionPoint;\nimport javax.faces.context.FacesContext;\nimport javax.persistence.EntityManager;\nimport javax.persistence.PersistenceContext;\n\n/**\n * This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans\n * \n * <p>\n * Example injection on a managed bean field:\n * </p>\n * \n * <pre>\n * &#064;Inject\n * private EntityManager em;\n * </pre>\n */\npublic class Resources {\n    // use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly\n    @SuppressWarnings(\"unused\")\n    @Produces\n    @PersistenceContext\n    private EntityManager em;\n\n    @Produces\n    public Logger produceLog(InjectionPoint injectionPoint) {\n        return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());\n    }\n\n    @Produces\n    @RequestScoped\n    public FacesContext produceFacesContext() {\n        return FacesContext.getCurrentInstance();\n    }\n\n}\n"
  },
  {
    "path": "delivery/web/src/main/resources/META-INF/persistence.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<persistence version=\"2.0\"\n             xmlns=\"http://java.sun.com/xml/ns/persistence\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/persistence\n        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">\n\n    <persistence-unit name=\"primary\" transaction-type=\"JTA\">\n        <jta-data-source>java:jboss/datasources/clean-architectureDS</jta-data-source>\n\n        <class>biz.paluch.clean.architecture.external.jpa.entity.ItemEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.UserEntity</class>\n\n        <exclude-unlisted-classes>false</exclude-unlisted-classes>\n\n        <shared-cache-mode>NONE</shared-cache-mode>\n        <validation-mode>AUTO</validation-mode>\n\n        <properties>\n            <property name=\"hibernate.show_sql\" value=\"true\" />\n            <property name=\"hibernate.format_sql\" value=\"false\" />\n            <property name=\"hibernate.hbm2ddl.auto\" value=\"create\" />\n        </properties>\n    </persistence-unit>\n</persistence>\n"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/beans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the schema to save you time if you do have to configure \n    this in the future -->\n<beans xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/javaee \n        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd\">\n</beans>\n"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/clean-architecture-ds.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This is an unmanaged datasource. It should be used for proofs of concept \n    or testing only. It uses H2, an in memory database that ships with JBoss \n    AS. -->\n<datasources xmlns=\"http://www.jboss.org/ironjacamar/schema\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd\">\n    <!-- The datasource is bound into JNDI at this location. We reference \n        this in META-INF/persistence.xml -->\n    <datasource jndi-name=\"java:jboss/datasources/clean-architectureDS\"\n        pool-name=\"clean-architecture\" enabled=\"true\"\n        use-java-context=\"true\">\n        <connection-url>jdbc:h2:mem:clean-architecture;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1</connection-url>\n        <driver>h2</driver>\n        <security>\n            <user-name>sa</user-name>\n            <password>sa</password>\n        </security>\n    </datasource>\n</datasources>\n \n"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/faces-config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file is not required if you don't need any extra configuration. -->\n<faces-config version=\"2.0\" xmlns=\"http://java.sun.com/xml/ns/javaee\"\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/javaee\n        http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd\">\n\n    <!-- This descriptor activates the JSF 2.0 Servlet -->\n\n    <!-- Write your navigation rules here. You are encouraged to use CDI \n        for creating @Named managed beans. -->\n    \n</faces-config>\n"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/web.xml",
    "content": "<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee \n\t      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"\n         version=\"3.0\">\n    <display-name>Servlet 3.0 Web Application</display-name>\n\n\n    <servlet>\n        <servlet-name>Faces Servlet</servlet-name>\n        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>\n        <load-on-startup>1</load-on-startup>\n    </servlet>\n\n    <servlet-mapping>\n        <servlet-name>Faces Servlet</servlet-name>\n        <url-pattern>*.xhtml</url-pattern>\n    </servlet-mapping>\n\n    <welcome-file-list>\n        <welcome-file>index.xhtml</welcome-file>\n    </welcome-file-list>\n\n</web-app>"
  },
  {
    "path": "delivery/web/src/main/webapp/index.xhtml",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:h=\"http://java.sun.com/jsf/html\"\n      xmlns:f=\"http://java.sun.com/jsf/core\">\n<h:head>\n    <title>Orders</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <h:outputStylesheet name=\"css/screen.css\"/>\n</h:head>\n<h:body>\n    <div id=\"container\">\n        <h1>Clean Architecture Demo</h1>\n\n        <div id=\"content\">\n            <p>\n                You can manage items and create an order with this frontend.\n            </p>\n\n            <p><strong>Guide</strong></p>\n            <ol>\n                <li>Go to <a href=\"items.xhtml\">Manage Items</a> and create a few items</li>\n                <li>Come back to <a href=\"index.xhtml\">the Index</a> and add some items into the order</li>\n                <li>Enter a name into the name field</li>\n                <li>Submit the order using \"Create Order\" and notice that an order record has been written to\n                    <code>java:jboss/datasources/clean-architectureDS</code></li>\n            </ol>\n            <p>\n\n            </p>\n\n            <h2>Order</h2>\n            <h:form>\n\n                <h:messages/>\n                Your Name: <h:inputText value=\"#{orderModel.userName}\"/><br/>\n\n                Items in Order:\n                <h:dataTable value=\"#{orderModel.orderItems}\" var=\"var\" style=\"width: 50%\">\n                    <h:column>\n                        <f:facet name=\"header\">\n                            Item\n                        </f:facet>\n                        <h:outputText value=\"#{var.item}\"/>\n                    </h:column>\n                    <h:column>\n                        <f:facet name=\"header\">\n                            Remove\n                        </f:facet>\n                        <h:commandLink id=\"remove\"\n                                       action=\"${orderController.removeItem(var)}\">Remove item</h:commandLink>\n                    </h:column>\n                </h:dataTable>\n\n                <h2>Add new Item</h2>\n\n                <h:selectOneListbox size=\"1\" value=\"#{orderModel.selectedItem}\">\n                    <f:selectItems value=\"#{itemController.items}\"/>\n                </h:selectOneListbox>\n                <h:commandButton action=\"#{orderController.addItem()}\" value=\"Add item\"/>\n\n                <br/>\n\n                <h:commandButton action=\"#{orderController.createOrder()}\" value=\"Create the Order\"/>\n            </h:form>\n\n            <a href=\"items.xhtml\">Manage Items</a>\n        </div>\n\n        <div id=\"footer\">\n            <p>\n                This project was generated from a Maven archetype from\n                JBoss.<br/> Sources: <a\n                    href=\"https://github.com/mp911de/CleanArchitecture\">https://github.com/mp911de/CleanArchitecture</a>\n            </p>\n        </div>\n    </div>\n</h:body>\n</html>"
  },
  {
    "path": "delivery/web/src/main/webapp/items.xhtml",
    "content": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:h=\"http://java.sun.com/jsf/html\"\n      xmlns:f=\"http://java.sun.com/jsf/core\">\n<h:head>\n    <title>Items</title>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <h:outputStylesheet name=\"css/screen.css\"/>\n</h:head>\n<h:body>\n    <div id=\"container\">\n        <div id=\"content\">\n            <h2>Items</h2>\n            <h:form>\n                <h:dataTable value=\"#{itemController.items}\" var=\"var\">\n                    <h:column>\n                        <f:facet name=\"header\">\n                            Item\n                        </f:facet>\n                        <h:outputText value=\"#{var.label}\"/>\n                    </h:column>\n                </h:dataTable>\n\n                <h2>Create new Item</h2>\n                <h:inputText value=\"#{itemModel.item}\"/>\n                <h:commandButton action=\"#{itemController.createOrUpdateItem}\" value=\"Create or Update\"/>\n            </h:form>\n\n            <a href=\"index.xhtml\">Back to Index</a>\n        </div>\n\n        <div id=\"footer\">\n            <p>\n                This project was generated from a Maven archetype from\n                JBoss.<br/>\n            </p>\n        </div>\n    </div>\n</h:body>\n</html>"
  },
  {
    "path": "delivery/web/src/main/webapp/resources/css/screen.css",
    "content": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * contributors by the @authors tag. See the copyright.txt in the\n * distribution for a full listing of individual contributors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* Core styles for the page */\nbody {\n  margin: 0;\n  padding: 0;\n  background-color: #F1F1F1;\n  font-family: \"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif;\n  font-size: 0.8em;\n  color:#363636;\n}\n\n#container {\n  margin: 0 auto;\n  padding: 0 20px 10px 20px;\n  border-top: 5px solid #000000;\n  border-left: 5px solid #8c8f91;\n  border-right: 5px solid #8c8f91;\n  border-bottom: 25px solid #8c8f91;\n  width: 865px; /* subtract 40px from banner width for padding */\n  background: #FFFFFF;\n  background-image: url(#{request.contextPath}/resources/gfx/headerbkg.png);\n  background-repeat: repeat-x;\n  padding-top: 30px;\n  box-shadow: 3px 3px 15px #d5d5d5;\n}\n#content {\n  float: left;\n  width: 500px;\n  margin: 20px;\n}\n#aside {\n  font-size: 0.9em;\n  width: 275px;\n  float: left;\n  margin: 20px 0px;\n  border: 1px solid #D5D5D5;\n  background: #F1F1F1;\n  background-image: url(#{request.contextPath}/resources/gfx/asidebkg.png);\n  background-repeat: repeat-x;\n  padding: 20px;\n}\n\n#aside ul {\n  padding-left: 30px;\n}\n.dualbrand {\n  float: right;\n  padding-right: 10px;\n}\n#footer {\n  clear: both;\n  text-align: center;\n  color: #666666;\n  font-size: 0.85em;\n}\ncode {\n  font-size: 1.1em;\n}\na {\n  color: #4a5d75;\n  text-decoration: none;\n}\na:hover {\n  color: #369;\n  text-decoration: underline;\n}\nh1 {\n  color:#243446;\n  font-size: 2.25em;\n}\nh2 {\n  font-size: 1em;\n}\nh3 {\n  color:#243446;\n}\nh4 {\n}\nh5 {\n}\nh6 {\n}\n/* Member registration styles */\nspan.invalid {\n  padding-left: 3px;\n  color: red;\n}\nform {\n  padding: 1em;\n  font: 80%/1 sans-serif;\n  width: 375px;\n  border: 1px solid #D5D5D5;\n}\nlabel {\n  float: left;\n  width: 15%;\n  margin-left: 20px;\n  margin-right: 0.5em;\n  padding-top: 0.2em;\n  text-align: right;\n  font-weight: bold;\n  color:#363636;\n}\ninput {\n  margin-bottom: 8px;\n}\n.register {\n  float: left;\n  margin-left: 85px;\n}\n\n/*  -----  table style  -------  */\n\n\n/*  = Simple Table style (black header, grey/white stripes  */\n\n.simpletablestyle {\n  background-color:#E6E7E8;\n  clear:both;\n  width: 550px;\n}\n\n.simpletablestyle img {\n  border:0px;\n}\n\n.simpletablestyle td {\n  height:2em;\n  padding-left: 6px;\n  font-size:11px;\n  padding:5px 5px;\n}\n\n.simpletablestyle th {\n\tbackground: url(#{request.contextPath}/resources/gfx/bkg-blkheader.png) black repeat-x top left;\n  font-size:12px;\n  font-weight:normal;\n  padding:0 10px 0 5px;\n  border-bottom:#999999 dotted 1px;\n}\n\n.simpletablestyle thead {\n  background: url(#{request.contextPath}/resources/gfx/bkg-blkheader.png) black repeat-x top left;\n  height:31px;\n  font-size:10px;\n  font-weight:bold;\n  color:#FFFFFF;\n  text-align:left;\n}\n\n.simpletablestyle .header a {\n  color:#94aebd;\n}\n\n.simpletablestype tfoot {\n\theight: 20px;\n  font-size: 10px;\n  font-weight: bold;\n  background-color: #EAECEE;\n  text-align: center;\n}\n\n.simpletablestyle tr.header td {\n  padding: 0px 10px 0px 5px;\n}\n\n\n.simpletablestyle .subheader {\n  background-color: #e6e7e8;\n  font-size:10px;\n  font-weight:bold;\n  color:#000000;\n  text-align:left;\n}\n\n/* Using new CSS3 selectors for styling*/\n.simpletablestyle tr:nth-child(odd) {\n  background: #f4f3f3;\n}\n.simpletablestyle tr:nth-child(even) {\n  background: #ffffff;\n}\n\n.simpletablestyle td a:hover {\n  color:#3883ce;\n  text-decoration:none; \n}\n"
  },
  {
    "path": "external/jpa-repository/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n        <relativePath>../..</relativePath>\n    </parent>\n\n    <artifactId>jpa-repository</artifactId>\n\n    <dependencies>\n\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>contracts</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>application-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>commons</artifactId>\n        </dependency>\n\n        <!-- First declare the APIs we depend on and need for compilation. All\n            of them are provided by JBoss AS 7 -->\n\n        <!-- Import the CDI API, we use provided scope as the API is included in\n            JBoss AS 7 -->\n        <dependency>\n            <groupId>javax.enterprise</groupId>\n            <artifactId>cdi-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n\n        <!-- Import the Common Annotations API (JSR-250), we use provided scope\n            as the API is included in JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.annotation</groupId>\n            <artifactId>jboss-annotations-api_1.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the JPA API, we use provided scope as the API is included in\n            JBoss AS 7 -->\n        <dependency>\n            <groupId>org.hibernate.javax.persistence</groupId>\n            <artifactId>hibernate-jpa-2.0-api</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Import the EJB API, we use provided scope as the API is included in\n            JBoss AS 7 -->\n        <dependency>\n            <groupId>org.jboss.spec.javax.ejb</groupId>\n            <artifactId>jboss-ejb-api_3.1_spec</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n\n        <!-- Annotation processor to generate the JPA 2.0 metamodel classes for\n            typesafe criteria queries -->\n        <dependency>\n            <groupId>org.hibernate</groupId>\n            <artifactId>hibernate-jpamodelgen</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.hibernate</groupId>\n            <artifactId>hibernate-core</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.hibernate</groupId>\n            <artifactId>hibernate-entitymanager</artifactId>\n            <scope>provided</scope>\n        </dependency>\n\n        <!-- Needed for running tests (you may also use TestNG) -->\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>com.h2database</groupId>\n            <artifactId>h2</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-api</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.slf4j</groupId>\n            <artifactId>slf4j-simple</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/ItemEntity.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:18\n */\n@Entity\n@Table(name = \"Items\")\n@NamedQueries({\n        @NamedQuery(name = ItemEntity.QUERY_FIND_BY_ITEM_NAME, query = \"SELECT i from ItemEntity i where i.item = :item\"),\n        @NamedQuery(name = ItemEntity.QUERY_FIND_ALL, query = \"SELECT i from ItemEntity i \") })\npublic class ItemEntity {\n    public static final String QUERY_FIND_BY_ITEM_NAME = \"ItemEntity.findByItem\";\n    public static final String QUERY_FIND_ALL = \"ItemEntity.findAll\";\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.AUTO)\n    private Long id;\n\n    @Basic\n    private String item;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getItem() {\n        return item;\n    }\n\n    public void setItem(String item) {\n        this.item = item;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderEntity.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.List;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:18\n */\n@Entity\n@Table(name = \"Orders\")\n@NamedQueries({ @NamedQuery(name = OrderEntity.QUERY_COUNT, query = \"SELECT count(orderId) from OrderEntity\"),\n        @NamedQuery(name = OrderEntity.QUERY_FIND_BY_ORDERID, query = \"SELECT o from OrderEntity o where o.orderId= :orderId\"),\n        @NamedQuery(name = OrderEntity.QUERY_FIND_ALL, query = \"SELECT o from  OrderEntity o \") })\npublic class OrderEntity {\n    public static final String QUERY_COUNT = \"OrderEntity.count\";\n    public static final String QUERY_FIND_BY_ORDERID = \"OrderEntity.findByOrderId\";\n    public static final String QUERY_FIND_ALL = \"OrderEntity.findAll\";\n    @Id\n    @GeneratedValue(strategy = GenerationType.AUTO)\n    private Long id;\n\n    @Basic\n    private String orderId;\n\n    @Basic\n    private Date orderDate;\n\n    @ManyToOne()\n    private UserEntity createdBy;\n\n    @OneToMany(cascade = CascadeType.ALL, mappedBy = \"order\")\n    private List<OrderItemEntity> items = new ArrayList<>();\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getOrderId() {\n        return orderId;\n    }\n\n    public void setOrderId(String orderId) {\n        this.orderId = orderId;\n    }\n\n    public Date getOrderDate() {\n        return orderDate;\n    }\n\n    public void setOrderDate(Date orderDate) {\n        this.orderDate = orderDate;\n    }\n\n    public UserEntity getCreatedBy() {\n        return createdBy;\n    }\n\n    public void setCreatedBy(UserEntity createdBy) {\n        this.createdBy = createdBy;\n    }\n\n    public List<OrderItemEntity> getItems() {\n        return items;\n    }\n\n    public void setItems(List<OrderItemEntity> items) {\n        this.items = items;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderItemEntity.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:18\n */\n@Entity\n@Table(name = \"OrderItem\")\npublic class OrderItemEntity {\n    @Id\n    @GeneratedValue(strategy = GenerationType.AUTO)\n    private Long id;\n\n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name = \"orderId\")\n    private OrderEntity order;\n\n    @Basic\n    private String orderItem;\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public OrderEntity getOrder() {\n        return order;\n    }\n\n    public void setOrder(OrderEntity order) {\n        this.order = order;\n    }\n\n    public String getOrderItem() {\n        return orderItem;\n    }\n\n    public void setOrderItem(String orderItem) {\n        this.orderItem = orderItem;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/UserEntity.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:24\n */\n@Entity\n@Table(name = \"Users\")\n@NamedQueries({ @NamedQuery(name = UserEntity.QUERY_FIND_BY_USERNAME, query = \"SELECT u from UserEntity u where u.userName = :userName\") })\npublic class UserEntity {\n    public static final String QUERY_FIND_BY_USERNAME = \"UserEntity.finyByUserName\";\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @Basic\n    private String userName;\n\n    public UserEntity() {\n    }\n\n    public Long getId() {\n        return id;\n    }\n\n    public void setId(Long id) {\n        this.id = id;\n    }\n\n    public String getUserName() {\n        return userName;\n    }\n\n    public void setUserName(String userName) {\n        this.userName = userName;\n    }\n\n    @Override\n    public String toString() {\n        final StringBuilder sb = new StringBuilder();\n        sb.append(getClass().getSimpleName());\n        sb.append(\" [id=\").append(id);\n        sb.append(\", userName='\").append(userName).append('\\'');\n        sb.append(']');\n        return sb.toString();\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaItemRepository.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.inject.Inject;\nimport javax.persistence.EntityManager;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.external.jpa.entity.ItemEntity;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 12:55\n */\npublic class JpaItemRepository implements ItemRepository {\n    @Inject\n    private EntityManager entityManager;\n\n    @Override\n    public Item find(String item) {\n\n        List<ItemEntity> list = entityManager.createNamedQuery(ItemEntity.QUERY_FIND_BY_ITEM_NAME, ItemEntity.class)\n                .setParameter(\"item\", item).getResultList();\n        if (list.isEmpty()) {\n            return null;\n        }\n\n        ItemEntity itemEntity = list.get(0);\n\n        return toItem(itemEntity);\n    }\n\n    private Item toItem(ItemEntity itemEntity) {\n        Item result = new Item();\n        result.setItem(itemEntity.getItem());\n\n        return result;\n    }\n\n    @Override\n    public void persist(Item item) {\n\n        ItemEntity itemEntity = new ItemEntity();\n        itemEntity.setItem(item.getItem());\n        entityManager.persist(itemEntity);\n    }\n\n    @Override\n    public List<Item> findAll() {\n        List<ItemEntity> list = entityManager.createNamedQuery(ItemEntity.QUERY_FIND_ALL, ItemEntity.class).getResultList();\n        List<Item> result = new ArrayList<>();\n        for (ItemEntity itemEntity : list) {\n            result.add(toItem(itemEntity));\n        }\n\n        return result;\n    }\n\n    public void setEntityManager(EntityManager entityManager) {\n        this.entityManager = entityManager;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaOrderRepository.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.enterprise.context.ApplicationScoped;\nimport javax.inject.Inject;\nimport javax.persistence.EntityManager;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.applicationmodel.OrderItem;\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\nimport biz.paluch.clean.architecture.external.jpa.entity.OrderEntity;\nimport biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity;\nimport biz.paluch.clean.architecture.external.jpa.entity.UserEntity;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:22\n */\n@ApplicationScoped\npublic class JpaOrderRepository implements OrderRepository {\n    @Inject\n    private EntityManager entityManager;\n\n    @Override\n    public int getNextOrderId() {\n        List<Number> maxOrderId = entityManager.createNamedQuery(OrderEntity.QUERY_COUNT).getResultList();\n        if (maxOrderId.isEmpty()) {\n            return 1;\n        }\n        return maxOrderId.get(0).intValue() + 1;\n    }\n\n    @Override\n    public void persist(Order order) {\n\n        OrderEntity orderEntity = new OrderEntity();\n        orderEntity.setOrderDate(order.getOrderDate());\n        orderEntity.setOrderId(order.getOrderId());\n\n        UserEntity user = getUser(order.getCreatedBy().getUserName());\n        orderEntity.setCreatedBy(user);\n\n        for (OrderItem orderItem : order.getItems()) {\n            OrderItemEntity orderItemEntity = new OrderItemEntity();\n            orderItemEntity.setOrder(orderEntity);\n            orderItemEntity.setOrderItem(orderItem.getOrderItem());\n            orderEntity.getItems().add(orderItemEntity);\n        }\n\n        entityManager.persist(orderEntity);\n    }\n\n    private UserEntity getUser(String userName) {\n        return (UserEntity) entityManager.createNamedQuery(UserEntity.QUERY_FIND_BY_USERNAME)\n                .setParameter(\"userName\", userName).getSingleResult();\n    }\n\n    public void deleteAll() {\n        entityManager.createQuery(\"DELETE from  \" + OrderEntity.class.getSimpleName()).executeUpdate();\n    }\n\n    public Order find(String orderId) {\n        List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_BY_ORDERID, OrderEntity.class)\n                .setParameter(\"orderId\", orderId).getResultList();\n        if (list.isEmpty()) {\n            return null;\n        }\n\n        OrderEntity orderEntity = list.get(0);\n\n        return toOrder(orderEntity);\n    }\n\n    private Order toOrder(OrderEntity orderEntity) {\n        Order order = new Order();\n\n        order.setCreatedBy(new User(orderEntity.getCreatedBy().getUserName()));\n        order.setOrderDate(orderEntity.getOrderDate());\n        order.setOrderId(orderEntity.getOrderId());\n\n        for (OrderItemEntity orderItemEntity : orderEntity.getItems()) {\n            order.getItems().add(new OrderItem(orderItemEntity.getOrderItem()));\n        }\n        return order;\n    }\n\n    @Override\n    public List<Order> findOrders() {\n\n        List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_ALL, OrderEntity.class).getResultList();\n\n        List<Order> result = new ArrayList<>();\n        for (OrderEntity orderEntity : list) {\n            result.add(toOrder(orderEntity));\n        }\n        return result;\n    }\n\n    public void setEntityManager(EntityManager entityManager) {\n        this.entityManager = entityManager;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaUserRepository.java",
    "content": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\nimport javax.persistence.EntityManager;\n\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\nimport biz.paluch.clean.architecture.external.jpa.entity.UserEntity;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 09:21\n */\npublic class JpaUserRepository implements UserRepository {\n    @Inject\n    private EntityManager entityManager;\n\n    @Override\n    public User find(String userName) {\n        List<UserEntity> list = entityManager.createNamedQuery(UserEntity.QUERY_FIND_BY_USERNAME, UserEntity.class)\n                .setParameter(\"userName\", userName).getResultList();\n\n        if (!list.isEmpty()) {\n            UserEntity userEntity = list.get(0);\n            User user = new User();\n            user.setUserName(userEntity.getUserName());\n            return user;\n        }\n\n        return null;\n    }\n\n    @Override\n    public void store(User user) {\n        UserEntity userEntity = new UserEntity();\n        userEntity.setUserName(user.getUserName());\n        entityManager.persist(userEntity);\n    }\n\n    public void setEntityManager(EntityManager entityManager) {\n        this.entityManager = entityManager;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/main/resources/META-INF/beans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the schema to save you time if you do have to configure \n    this in the future -->\n<beans xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/javaee \n        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd\">\n</beans>\n"
  },
  {
    "path": "external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/AbstractJpaTest.java",
    "content": "package biz.paluch.clean.architecture.external.jpa;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.persistence.EntityManager;\nimport javax.persistence.EntityManagerFactory;\nimport javax.persistence.Persistence;\n\nimport org.h2.Driver;\nimport org.hibernate.cfg.AvailableSettings;\nimport org.hibernate.dialect.H2Dialect;\nimport org.junit.After;\nimport org.junit.AfterClass;\nimport org.junit.Before;\nimport org.junit.BeforeClass;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 13.06.13 21:28\n */\npublic abstract class AbstractJpaTest {\n\n    private static EntityManagerFactory entityManagerFactory;\n    protected EntityManager entityManager;\n\n    @BeforeClass\n    public static void beforeClass() throws Exception {\n        Map<String, String> properties = getH2Properties();\n        entityManagerFactory = Persistence.createEntityManagerFactory(\"primary\", properties);\n\n    }\n\n    @AfterClass\n    public static void afterClass() throws Exception {\n        entityManagerFactory.close();\n\n    }\n\n    @Before\n    public void before() throws Exception {\n        entityManager = entityManagerFactory.createEntityManager();\n        entityManager.getTransaction().begin();\n\n    }\n\n    @After\n    public void after() throws Exception {\n        entityManager.getTransaction().rollback();\n        entityManager.close();\n\n    }\n\n    public static Map<String, String> getH2Properties() {\n        Map<String, String> properties = new HashMap<>();\n        properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());\n        properties.put(AvailableSettings.URL, \"jdbc:h2:mem:primary\");\n        properties.put(AvailableSettings.USER, \"SA\");\n        properties.put(AvailableSettings.DRIVER, Driver.class.getName());\n        properties.put(AvailableSettings.HBM2DDL_AUTO, \"create-drop\");\n        return properties;\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/JpaOrderRepositoryTest.java",
    "content": "package biz.paluch.clean.architecture.external.jpa;\n\nimport static org.junit.Assert.*;\n\nimport java.util.Date;\nimport java.util.List;\n\nimport org.junit.Test;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.applicationmodel.OrderItem;\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.external.jpa.repository.JpaOrderRepository;\nimport biz.paluch.clean.architecture.external.jpa.repository.JpaUserRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 08:50\n */\npublic class JpaOrderRepositoryTest extends AbstractJpaTest {\n    private JpaUserRepository jpaUserRepository = new JpaUserRepository();\n    private JpaOrderRepository jpaOrderRepository = new JpaOrderRepository();\n\n    @Override\n    public void before() throws Exception {\n        super.before();\n        jpaOrderRepository.setEntityManager(entityManager);\n        jpaUserRepository.setEntityManager(entityManager);\n    }\n\n    @Test\n    public void testGetNextOrderId() throws Exception {\n        int result = jpaOrderRepository.getNextOrderId();\n        assertEquals(1, result);\n    }\n\n    @Test\n    public void testPersistAndFind() throws Exception {\n        jpaUserRepository.store(new User(\"mark\"));\n        entityManager.flush();\n\n        Order order = mockOrder();\n\n        jpaOrderRepository.persist(order);\n\n    }\n\n    private Order mockOrder() {\n        Order order = new Order();\n        order.setCreatedBy(new User(\"mark\"));\n        order.setOrderDate(new Date());\n        order.setOrderId(\"mark-42\");\n\n        order.getItems().add(new OrderItem(\"A\"));\n        order.getItems().add(new OrderItem(\"B\"));\n        order.getItems().add(new OrderItem(\"C\"));\n        return order;\n    }\n\n    @Test\n    public void testFind() throws Exception {\n\n        Order order = mockOrder();\n        createOrder(order);\n\n        Order result = jpaOrderRepository.find(order.getOrderId());\n\n        assertEquals(order.getCreatedBy().getUserName(), result.getCreatedBy().getUserName());\n        assertEquals(order.getOrderId(), result.getOrderId());\n        assertEquals(order.getItems().size(), result.getItems().size());\n    }\n\n    @Test\n    public void testFindOrders() throws Exception {\n        Order order = mockOrder();\n        createOrder(order);\n\n        List<Order> result = jpaOrderRepository.findOrders();\n        assertEquals(1, result.size());\n\n    }\n\n    private void createOrder(Order order) {\n\n        jpaUserRepository.store(new User(\"mark\"));\n        jpaOrderRepository.persist(order);\n        entityManager.flush();\n    }\n}\n"
  },
  {
    "path": "external/jpa-repository/src/test/resources/META-INF/persistence.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<persistence version=\"2.0\"\n             xmlns=\"http://java.sun.com/xml/ns/persistence\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n             xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/persistence\n        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd\">\n\n    <persistence-unit name=\"primary\" transaction-type=\"RESOURCE_LOCAL\">\n        <provider>org.hibernate.ejb.HibernatePersistence</provider>\n\n        <class>biz.paluch.clean.architecture.external.jpa.entity.ItemEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity</class>\n        <class>biz.paluch.clean.architecture.external.jpa.entity.UserEntity</class>\n\n        <exclude-unlisted-classes>true</exclude-unlisted-classes>\n\n        <shared-cache-mode>NONE</shared-cache-mode>\n        <validation-mode>AUTO</validation-mode>\n\n        <properties>\n            <property name=\"hibernate.show_sql\" value=\"true\" />\n            <property name=\"hibernate.format_sql\" value=\"true\" />\n\n            <property name=\"hibernate.cache.use_second_level_cache\" value=\"false\" />\n            <property name=\"hibernate.cache.use_query_cache\" value=\"false\" />\n\n            <property name=\"hibernate.transaction.jta.platform\"\n                      value=\"org.hibernate.service.jta.platform.internal.NoJtaPlatform\" />\n        </properties>\n    </persistence-unit>\n</persistence>\n"
  },
  {
    "path": "pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <groupId>biz.paluch.clean.architecture</groupId>\n    <artifactId>clean-architecture</artifactId>\n    <version>1.0-SNAPSHOT</version>\n\n    <packaging>pom</packaging>\n    <name>clean-architecture</name>\n    <description>A Multi-Module example for a maven clean architecture project.</description>\n\n    <url>http://www.paluch.biz/</url>\n    <licenses>\n        <license>\n            <name>Apache License, Version 2.0</name>\n            <distribution>repo</distribution>\n            <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>\n        </license>\n    </licenses>\n\n    <modules>\n        <module>application-model</module>\n        <module>contracts</module>\n        <module>commons</module>\n        <module>use-cases</module>\n        <module>external/jpa-repository</module>\n        <module>delivery/web</module>\n    </modules>\n\n    <properties>\n        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n        <version.wildfly.maven.plugin>1.1.0.Alpha8</version.wildfly.maven.plugin>\n        <version.jboss.bom>1.0.6.Final</version.jboss.bom>\n        <version.compiler.plugin>2.3.1</version.compiler.plugin>\n        <version.surefire.plugin>2.10</version.surefire.plugin>\n        <version.war.plugin>2.6</version.war.plugin>\n        <maven.compiler.target>1.8</maven.compiler.target>\n        <maven.compiler.source>1.8</maven.compiler.source>\n    </properties>\n\n    <dependencyManagement>\n        <dependencies>\n\n            <dependency>\n                <groupId>biz.paluch.clean.architecture</groupId>\n                <artifactId>application-model</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n\n            <dependency>\n                <groupId>biz.paluch.clean.architecture</groupId>\n                <artifactId>use-cases</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n\n            <dependency>\n                <groupId>biz.paluch.clean.architecture</groupId>\n                <artifactId>jpa-repository</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n\n            <dependency>\n                <groupId>biz.paluch.clean.architecture</groupId>\n                <artifactId>commons</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n\n            <dependency>\n                <groupId>biz.paluch.clean.architecture</groupId>\n                <artifactId>contracts</artifactId>\n                <version>${project.version}</version>\n            </dependency>\n\n            <dependency>\n                <groupId>org.apache.commons</groupId>\n                <artifactId>commons-lang3</artifactId>\n                <version>3.3.2</version>\n            </dependency>\n\n            <dependency>\n                <groupId>javax.inject</groupId>\n                <artifactId>javax.inject</artifactId>\n                <version>1</version>\n                <scope>provided</scope>\n            </dependency>\n\n            <!-- JBoss distributes a complete set of Java EE 6 APIs including a Bill\n                of Materials (BOM). A BOM specifies the versions of a \"stack\" (or a collection) \n                of artifacts. We use this here so that we always get the correct versions \n                of artifacts. Here we use the jboss-javaee-6.0-with-tools stack (you can \n                read this as the JBoss stack of the Java EE 6 APIs, with some extras tools \n                for your project, such as Arquillian for testing) and the jboss-javaee-6.0-with-hibernate \n                stack you can read this as the JBoss stack of the Java EE 6 APIs, with extras \n                from the Hibernate family of projects) -->\n            <dependency>\n                <groupId>org.jboss.bom</groupId>\n                <artifactId>jboss-javaee-6.0-with-tools</artifactId>\n                <version>${version.jboss.bom}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.jboss.bom</groupId>\n                <artifactId>jboss-javaee-6.0-with-hibernate</artifactId>\n                <version>${version.jboss.bom}</version>\n                <type>pom</type>\n                <scope>import</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>com.h2database</groupId>\n                <artifactId>h2</artifactId>\n                <version>1.4.191</version>\n                <scope>test</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-api</artifactId>\n                <version>1.7.2</version>\n                <scope>test</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.slf4j</groupId>\n                <artifactId>slf4j-simple</artifactId>\n                <version>1.7.2</version>\n                <scope>test</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.mockito</groupId>\n                <artifactId>mockito-core</artifactId>\n                <version>2.6.8</version>\n                <scope>test</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.jboss.resteasy</groupId>\n                <artifactId>resteasy-jaxrs</artifactId>\n                <version>2.3.6.Final</version>\n                <scope>provided</scope>\n            </dependency>\n\n            <dependency>\n                <groupId>org.jboss.resteasy</groupId>\n                <artifactId>resteasy-jaxb-provider</artifactId>\n                <version>2.3.6.Final</version>\n                <scope>provided</scope>\n            </dependency>\n        </dependencies>\n    </dependencyManagement>\n\n\n    <build>\n        <defaultGoal>clean package jboss-as:run</defaultGoal>\n        <plugins>\n\n            <plugin>\n                <artifactId>maven-surefire-plugin</artifactId>\n                <version>2.19.1</version>\n            </plugin>\n\n            <plugin>\n                <groupId>org.wildfly.plugins</groupId>\n                <artifactId>wildfly-maven-plugin</artifactId>\n                <version>${version.wildfly.maven.plugin}</version>\n                <configuration>\n                    <skip>true</skip>\n                </configuration>\n            </plugin>\n        </plugins>\n\n    </build>\n\n</project>\n"
  },
  {
    "path": "use-cases/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0</modelVersion>\n\n    <parent>\n        <groupId>biz.paluch.clean.architecture</groupId>\n        <artifactId>clean-architecture</artifactId>\n        <version>1.0-SNAPSHOT</version>\n    </parent>\n\n    <artifactId>use-cases</artifactId>\n\n    <dependencies>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>application-model</artifactId>\n        </dependency>\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>contracts</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>biz.paluch.clean.architecture</groupId>\n            <artifactId>commons</artifactId>\n        </dependency>\n\n        <dependency>\n            <groupId>javax.inject</groupId>\n            <artifactId>javax.inject</artifactId>\n            <version>1</version>\n            <scope>provided</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>org.mockito</groupId>\n            <artifactId>mockito-core</artifactId>\n            <scope>test</scope>\n        </dependency>\n\n        <dependency>\n            <groupId>junit</groupId>\n            <artifactId>junit</artifactId>\n            <scope>test</scope>\n        </dependency>\n    </dependencies>\n\n</project>\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/CreateOrUpdateItemImpl.java",
    "content": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.CreateOrUpdateItem;\n\n/**\n *\n * This Use-Case class implements the input boundary {@link CreateOrUpdateItem} and requires a dependency to\n * {@link ItemRepository}. Everything within this class is POJO-style. There is no response boundary since the completion of the\n * use case does not create any result data structure.\n *\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:02\n */\npublic class CreateOrUpdateItemImpl implements CreateOrUpdateItem {\n\n    private ItemRepository itemRepository;\n\n    public void createOrUpdateItem(String item) {\n\n        Item theItem = itemRepository.find(item);\n        if (theItem == null) {\n            theItem = new Item();\n            theItem.setItem(item);\n            itemRepository.persist(theItem);\n        }\n    }\n\n    public void setItemRepository(ItemRepository itemRepository) {\n        this.itemRepository = itemRepository;\n    }\n}\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/ListItemsImpl.java",
    "content": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.ListItems;\nimport biz.paluch.clean.architecture.contracts.usecases.ListItemsOutput;\n\n/**\n *\n * This Use-Case class implements the input boundary {@link ListItems} and requires a dependency to {@link ItemRepository}.\n * Everything within this class is POJO-style. There is no response boundary since the completion of the use case does not\n * create any result data structure.\n *\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 13:02\n */\npublic class ListItemsImpl implements ListItems {\n    private ItemRepository itemRepository;\n\n    @Override\n    public void listItems(ListItemsOutput listItemsOutput) {\n        listItemsOutput.onResponse(itemRepository.findAll());\n    }\n\n    @Override\n    public void setItemRepository(ItemRepository itemRepository) {\n        this.itemRepository = itemRepository;\n    }\n\n}\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/PlaceOrderImpl.java",
    "content": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.applicationmodel.NotFoundException;\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.applicationmodel.OrderItem;\nimport biz.paluch.clean.architecture.commons.DateProvider;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrder;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;\nimport biz.paluch.clean.architecture.usecases.simple.ValidateOrder;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:15\n */\npublic class PlaceOrderImpl implements PlaceOrder {\n    private OrderRepository orderRepository;\n    private ItemRepository itemRepository;\n    private UserRepository userRepository;\n\n    /**\n     * Place order and return the OrderId.\n     * \n     * @param request\n     * @param output\n     */\n    @Override\n    public void placeOrder(PlaceOrderRequest request, PlaceOrderOutput output) throws NotFoundException {\n\n        ValidateOrder.newInstance(itemRepository, userRepository).validate(request.items, request.userName);\n\n        String orderId = createOrderId(request.userName);\n\n        Order order = constructOrder(orderId, request.items, request.userName);\n\n        storeOrder(order);\n\n        output.onResponse(order.getOrderId());\n    }\n\n    private String createOrderId(String userName) {\n        int nextOrderId = orderRepository.getNextOrderId();\n        return userName + \"-\" + nextOrderId;\n    }\n\n    private Order constructOrder(String orderId, List<String> items, String userName) {\n        Order order = new Order();\n        order.setOrderDate(DateProvider.get());\n        order.setOrderId(orderId);\n        order.setCreatedBy(userRepository.find(userName));\n\n        for (String item : items) {\n            OrderItem orderItem = new OrderItem();\n            orderItem.setOrderItem(item);\n            order.getItems().add(orderItem);\n        }\n\n        return order;\n    }\n\n    private void storeOrder(Order order) {\n        orderRepository.persist(order);\n    }\n\n    public void setOrderRepository(OrderRepository orderRepository) {\n        this.orderRepository = orderRepository;\n    }\n\n    public void setItemRepository(ItemRepository itemRepository) {\n        this.itemRepository = itemRepository;\n    }\n\n    public void setUserRepository(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n}\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/CreateOrUpdateUser.java",
    "content": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 07:34\n */\npublic class CreateOrUpdateUser {\n    private UserRepository userRepository;\n\n    public void createOrUpdateUser(String userName) {\n\n        User user = userRepository.find(userName);\n        if (user == null) {\n            user = new User(userName);\n            userRepository.store(user);\n        }\n    }\n\n    @Inject\n    public void setUserRepository(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n}\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ListOrders.java",
    "content": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:22\n */\npublic class ListOrders {\n    private OrderRepository orderRepository;\n\n    public List<Order> listOrders() {\n        return orderRepository.findOrders();\n    }\n\n    @Inject\n    public void setOrderRepository(OrderRepository orderRepository) {\n        this.orderRepository = orderRepository;\n    }\n}\n"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ValidateOrder.java",
    "content": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.applicationmodel.NotFoundException;\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:49\n */\npublic class ValidateOrder {\n    private ItemRepository itemRepository;\n    private UserRepository userRepository;\n\n    private ValidateOrder(ItemRepository itemRepository, UserRepository userRepository) {\n        this.itemRepository = itemRepository;\n        this.userRepository = userRepository;\n    }\n\n    public static ValidateOrder newInstance(ItemRepository itemRepository, UserRepository userRepository) {\n        return new ValidateOrder(itemRepository, userRepository);\n    }\n\n    public void validate(List<String> items, String userName) {\n        validateItems(items);\n        validateUser(userName);\n    }\n\n    private void validateUser(String userName) {\n        User user = userRepository.find(userName);\n        if (user == null) {\n            throw new NotFoundException(\"User \" + userName + \" not found\");\n        }\n    }\n\n    private void validateItems(List<String> items) {\n        for (String item : items) {\n            validateItem(item);\n\n        }\n    }\n\n    private void validateItem(String item) {\n        Item itemInCatalog = itemRepository.find(item);\n        if (itemInCatalog == null) {\n            throw new NotFoundException(\"Item \" + item + \" not found\");\n        }\n    }\n}\n"
  },
  {
    "path": "use-cases/src/main/resources/META-INF/beans.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the schema to save you time if you do have to configure \n    this in the future -->\n<beans xmlns=\"http://java.sun.com/xml/ns/javaee\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n       xsi:schemaLocation=\"\n        http://java.sun.com/xml/ns/javaee \n        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd\">\n</beans>\n"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/CreateOrUpdateUserTest.java",
    "content": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Mockito.*;\n\nimport biz.paluch.clean.architecture.usecases.simple.CreateOrUpdateUser;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.junit.MockitoJUnitRunner;\n\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 07:36\n */\n@RunWith(MockitoJUnitRunner.class)\npublic class CreateOrUpdateUserTest {\n\n    public static final String USER_NAME = \"mark\";\n    private CreateOrUpdateUser sut = new CreateOrUpdateUser();\n\n    @Mock\n    private UserRepository userRepository;\n\n    @Before\n    public void before() throws Exception {\n        sut.setUserRepository(userRepository);\n    }\n\n    @Test\n    public void testCreateOrUpdateUser() throws Exception {\n        sut.createOrUpdateUser(USER_NAME);\n\n        verify(userRepository).store(any(User.class));\n    }\n}\n"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/ListOrdersTest.java",
    "content": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.junit.Assert.*;\nimport static org.mockito.Mockito.*;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.usecases.simple.ListOrders;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.Mock;\nimport org.mockito.junit.MockitoJUnitRunner;\n\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 02.08.13 11:13\n */\n@RunWith(MockitoJUnitRunner.class)\npublic class ListOrdersTest {\n\n    private ListOrders sut = new ListOrders();\n\n    @Mock\n    private OrderRepository orderRepository;\n\n    @Before\n    public void before() throws Exception {\n        sut.setOrderRepository(orderRepository);\n\n    }\n\n    @Test\n    public void testListOrders() throws Exception {\n        when(orderRepository.findOrders()).thenReturn(Arrays.asList(new Order()));\n\n        List<Order> result = sut.listOrders();\n        assertEquals(1, result.size());\n\n    }\n}\n"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/PlaceOrderImplTest.java",
    "content": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.junit.Assert.*;\nimport static org.mockito.Mockito.*;\n\nimport java.util.Arrays;\nimport java.util.Date;\nimport java.util.List;\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.mockito.junit.MockitoJUnitRunner;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nimport biz.paluch.clean.architecture.applicationmodel.NotFoundException;\nimport biz.paluch.clean.architecture.applicationmodel.Order;\nimport biz.paluch.clean.architecture.applicationmodel.User;\nimport biz.paluch.clean.architecture.commons.StaticDateProvider;\nimport biz.paluch.clean.architecture.contracts.repositories.ItemRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.OrderRepository;\nimport biz.paluch.clean.architecture.contracts.repositories.UserRepository;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;\nimport biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;\nimport biz.paluch.clean.architecture.usecases.advanced.PlaceOrderImpl;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch</a>\n * @since 01.08.13 07:31\n */\n@RunWith(MockitoJUnitRunner.class)\npublic class PlaceOrderImplTest {\n    public static final String ITEM_NAME_SCISSORS = \"Scissors\";\n    public static final String ITEM_NAME_PAPER = \"Paper\";\n    public static final String ITEM_NAME_GLUE = \"Glue\";\n    public static final String USER_NAME_MARK = \"mark\";\n\n    private PlaceOrderImpl sut = new PlaceOrderImpl();\n\n    @Mock\n    private OrderRepository orderRepository;\n\n    @Mock\n    private ItemRepository itemRepository;\n\n    @Mock\n    private UserRepository userRepository;\n\n    @Mock\n    private PlaceOrderOutput orderOutput;\n\n    private PlaceOrderRequest request = new PlaceOrderRequest();\n\n    @Before\n    public void setUp() throws Exception {\n        sut.setItemRepository(itemRepository);\n        sut.setOrderRepository(orderRepository);\n        sut.setUserRepository(userRepository);\n    }\n\n    @Test\n    public void testPlaceOrder() throws Exception {\n        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);\n\n        mockItemRepository();\n        mockUserRepository();\n        mockOrderRepository();\n\n        request.items = items;\n        request.userName = USER_NAME_MARK;\n\n        sut.placeOrder(request, orderOutput);\n\n        verify(orderOutput).onResponse(\"mark-42\");\n    }\n\n    @Test\n    public void testPlaceOrderAndVerify() throws Exception {\n        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);\n\n        mockItemRepository();\n        mockUserRepository();\n        mockOrderRepository();\n\n        Date orderDate = new Date(42424242L);\n        StaticDateProvider.initialize(orderDate);\n\n        request.items = items;\n        request.userName = USER_NAME_MARK;\n\n        sut.placeOrder(request, orderOutput);\n\n        ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class);\n        verify(orderRepository).persist(captor.capture());\n\n        Order theOrder = captor.getValue();\n\n        assertEquals(orderDate, theOrder.getOrderDate());\n        assertEquals(USER_NAME_MARK, theOrder.getCreatedBy().getUserName());\n        assertEquals(items.size(), theOrder.getItems().size());\n\n        verify(orderOutput).onResponse(\"mark-42\");\n\n    }\n\n    private void mockOrderRepository() {\n        when(orderRepository.getNextOrderId()).thenReturn(42);\n    }\n\n    private void mockUserRepository() {\n        when(userRepository.find(USER_NAME_MARK)).thenReturn(new User(USER_NAME_MARK));\n    }\n\n    private void mockItemRepository() {\n        when(itemRepository.find(ITEM_NAME_SCISSORS)).thenReturn(new Item());\n        when(itemRepository.find(ITEM_NAME_PAPER)).thenReturn(new Item());\n        when(itemRepository.find(ITEM_NAME_GLUE)).thenReturn(new Item());\n    }\n\n    @Test(expected = NotFoundException.class)\n    public void testPlaceOrderItemNotFound() throws Exception {\n        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);\n\n        request.items = items;\n        request.userName = USER_NAME_MARK;\n        sut.placeOrder(request, orderOutput);\n\n    }\n\n    @Test(expected = NotFoundException.class)\n    public void testPlaceOrderUserNotFound() throws Exception {\n        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);\n        mockItemRepository();\n\n        request.items = items;\n        request.userName = USER_NAME_MARK;\n\n        sut.placeOrder(request, orderOutput);\n\n    }\n}\n"
  }
]