Full Code of mp911de/CleanArchitecture for AI

main b180299ad87f cached
69 files
93.3 KB
25.5k tokens
214 symbols
1 requests
Download .txt
Repository: mp911de/CleanArchitecture
Branch: main
Commit: b180299ad87f
Files: 69
Total size: 93.3 KB

Directory structure:
gitextract_5gr77y1v/

├── .gitignore
├── README.md
├── application-model/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── applicationmodel/
│                                   ├── AbstractModel.java
│                                   ├── Item.java
│                                   ├── NotFoundException.java
│                                   ├── Order.java
│                                   ├── OrderItem.java
│                                   └── User.java
├── commons/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── commons/
│                                   ├── DateProvider.java
│                                   └── StaticDateProvider.java
├── contracts/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── contracts/
│                                   ├── repositories/
│                                   │   ├── ItemRepository.java
│                                   │   ├── OrderRepository.java
│                                   │   └── UserRepository.java
│                                   └── usecases/
│                                       ├── CreateOrUpdateItem.java
│                                       ├── ListItems.java
│                                       ├── ListItemsOutput.java
│                                       ├── PlaceOrder.java
│                                       ├── PlaceOrderOutput.java
│                                       └── PlaceOrderRequest.java
├── delivery/
│   └── web/
│       ├── pom.xml
│       └── src/
│           └── main/
│               ├── java/
│               │   └── biz/
│               │       └── paluch/
│               │           └── clean/
│               │               └── architecture/
│               │                   ├── di_example/
│               │                   │   └── PlaceOrderWithDependencies.java
│               │                   ├── facade/
│               │                   │   ├── ItemService.java
│               │                   │   └── OrderService.java
│               │                   ├── frontend/
│               │                   │   ├── jsf/
│               │                   │   │   ├── ItemController.java
│               │                   │   │   ├── ItemModel.java
│               │                   │   │   ├── OrderController.java
│               │                   │   │   ├── OrderItem.java
│               │                   │   │   └── OrderModel.java
│               │                   │   └── rest/
│               │                   │       ├── ItemResource.java
│               │                   │       ├── ItemsRepresentation.java
│               │                   │       ├── JaxRsActivator.java
│               │                   │       ├── OrderResource.java
│               │                   │       └── OrdersRepresentation.java
│               │                   └── util/
│               │                       └── Resources.java
│               ├── resources/
│               │   └── META-INF/
│               │       └── persistence.xml
│               └── webapp/
│                   ├── WEB-INF/
│                   │   ├── beans.xml
│                   │   ├── clean-architecture-ds.xml
│                   │   ├── faces-config.xml
│                   │   └── web.xml
│                   ├── index.xhtml
│                   ├── items.xhtml
│                   └── resources/
│                       └── css/
│                           └── screen.css
├── external/
│   └── jpa-repository/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   └── biz/
│           │   │       └── paluch/
│           │   │           └── clean/
│           │   │               └── architecture/
│           │   │                   └── external/
│           │   │                       └── jpa/
│           │   │                           ├── entity/
│           │   │                           │   ├── ItemEntity.java
│           │   │                           │   ├── OrderEntity.java
│           │   │                           │   ├── OrderItemEntity.java
│           │   │                           │   └── UserEntity.java
│           │   │                           └── repository/
│           │   │                               ├── JpaItemRepository.java
│           │   │                               ├── JpaOrderRepository.java
│           │   │                               └── JpaUserRepository.java
│           │   └── resources/
│           │       └── META-INF/
│           │           └── beans.xml
│           └── test/
│               ├── java/
│               │   └── biz/
│               │       └── paluch/
│               │           └── clean/
│               │               └── architecture/
│               │                   └── external/
│               │                       └── jpa/
│               │                           ├── AbstractJpaTest.java
│               │                           └── JpaOrderRepositoryTest.java
│               └── resources/
│                   └── META-INF/
│                       └── persistence.xml
├── pom.xml
└── use-cases/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── biz/
        │   │       └── paluch/
        │   │           └── clean/
        │   │               └── architecture/
        │   │                   └── usecases/
        │   │                       ├── advanced/
        │   │                       │   ├── CreateOrUpdateItemImpl.java
        │   │                       │   ├── ListItemsImpl.java
        │   │                       │   └── PlaceOrderImpl.java
        │   │                       └── simple/
        │   │                           ├── CreateOrUpdateUser.java
        │   │                           ├── ListOrders.java
        │   │                           └── ValidateOrder.java
        │   └── resources/
        │       └── META-INF/
        │           └── beans.xml
        └── test/
            └── java/
                └── biz/
                    └── paluch/
                        └── clean/
                            └── architecture/
                                └── usecases/
                                    ├── CreateOrUpdateUserTest.java
                                    ├── ListOrdersTest.java
                                    └── PlaceOrderImplTest.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.idea/
target
*.iml
atlassian-ide-plugin.xml


================================================
FILE: README.md
================================================
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)
========================
Author: Mark Paluch<br/>
Technologies: CDI, JSF, JPA, EJB, JPA, JAX-RS<br/>
Summary: Example Application built using an Onion-Architecture that incorporates multiple technologies<br/>
Source: <https://github.com/mp911de/CleanArchitecture><br/>

More Information: <br/>
* https://www.paluch.biz/blog/80-clean-your-architecture-databases-the-web-and-service-interfaces-are-just-plugins.html
* https://www.paluch.biz/blog/83-clean-architecture-code-examples-for-an-onion-architecture.html

What is it?
-----------
This simple application consists of a few use cases. The purpose of the application is to show how to
apply clean architecture patterns in a Multi-Module Maven/Java environment.

It 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.
ORM, caching implementations, clients to external services implement a contract that is located in `external` and its sub-modules.

All parts are tied together by the delivery mechanism that
integrates the externals and connects the use cases by supplying dependencies to come the system to life.

If you need a different implementation for any external, so you can easily change that specific part without
affecting other parts of the system.

These patterns are verified by real life projects.

A word on Clean Architecture
----------------------------

As soon as you dig into the code, you'll notice comments on the one or other class. Subject of these comments is to help
to understand the structure and the different styles, which are possible.

You'll notice soon, there are many different styles and ways to approach the Clean Architecture style. There are use cases
which are built much more simple, e. g. without input/output boundaries and direct usage of dependency injection and
there are use-cases which implement input boundaries and use output boundaries. 

In the end it's up to you, how much you're willing to invest in your architecture. This is, however, only a variety of
examples to give you an impression, how to express Clean Architecture with Java.


What does it?
---------
The use cases are:

* CreateOrUpdateItem
* CreateOrUpdateUser
* ListItems
* ListOrders
* PlaceOrder
* PlaceOrderValidator

and a few business entities:

* User
* OrderItem
* Order
* Item

These use cases can be accessed by REST or Web UI (JSF) and are persisted using JPA within an in-memory H2 Database
(everything you need is included).

Requirements to run the App
-------------------

All you need to build this project is Java 6.0 (Java SDK 1.6) or better, Maven 3.0 or better.

The application this project produces is designed to be run on JBoss AS7, WildFly 8 or better.
You could easily change the delivery mechanism to a console application with only providing a new delivery mechanism
and a different approach how to wire the dependencies.


Build and Deploy the Quickstart
-------------------------

_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._

1. Open a command line and navigate to the root directory of this project.
2. Type this command to build and deploy the archive:

        mvn clean package wildfly:run

3. This will start a WildFly 10 instance and deploy `target/clean-architecture.war` to the newly started instance.
 

Access the application 
-------------------------

The application will be running at the following URL: <http://localhost:8080/clean-architecture/>.



================================================
FILE: application-model/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>application-model</artifactId>


    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>
</project>


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/AbstractModel.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

import java.io.Serializable;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 07.02.14 07:34
 */
public abstract class AbstractModel implements Serializable {

    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this, false);
    }

    @Override
    public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(this, obj, false);
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
}


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Item.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:51
 */
public class Item extends AbstractModel {
    private String item;

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }
}


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/NotFoundException.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:47
 */
public class NotFoundException extends RuntimeException
{
    public NotFoundException(String message)
    {
        super(message);
    }
}


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Order.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:23
 */
public class Order extends AbstractModel {
    private String orderId;
    private Date orderDate;

    private List<OrderItem> items = new ArrayList<>();
    private User createdBy;

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public List<OrderItem> getItems() {
        return items;
    }

    public User getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(User createdBy) {
        this.createdBy = createdBy;
    }
}


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/OrderItem.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:24
 */
public class OrderItem extends AbstractModel {
    private String orderItem;

    public OrderItem() {
    }

    public OrderItem(String orderItem) {
        this.orderItem = orderItem;
    }

    public String getOrderItem() {
        return orderItem;
    }

    public void setOrderItem(String orderItem) {
        this.orderItem = orderItem;
    }
}


================================================
FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/User.java
================================================
package biz.paluch.clean.architecture.applicationmodel;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:24
 */
public class User extends AbstractModel {
    private String userName;

    public User() {
    }

    public User(String userName) {
        this.userName = userName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}


================================================
FILE: commons/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>commons</artifactId>

</project>


================================================
FILE: commons/src/main/java/biz/paluch/clean/architecture/commons/DateProvider.java
================================================
package biz.paluch.clean.architecture.commons;

import java.util.Date;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:01
 */
public class DateProvider {
    private static DateProvider dateProvider = new DateProvider();

    public static Date get() {
        return dateProvider.getCurrentDate();
    }

    public Date getCurrentDate() {
        return new Date();
    }

    public static void setDateProvider(DateProvider dateProvider) {
        DateProvider.dateProvider = dateProvider;
    }
}


================================================
FILE: commons/src/main/java/biz/paluch/clean/architecture/commons/StaticDateProvider.java
================================================
package biz.paluch.clean.architecture.commons;

import java.util.Date;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:03
 */
public class StaticDateProvider extends DateProvider {

    private Date currentDate;

    public static void initialize(Date currentDate) {
        StaticDateProvider instance = new StaticDateProvider();
        instance.setCurrentDate(currentDate);
        DateProvider.setDateProvider(instance);
    }

    @Override
    public Date getCurrentDate() {
        return currentDate;
    }

    public void setCurrentDate(Date currentDate) {
        this.currentDate = currentDate;
    }
}


================================================
FILE: contracts/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>contracts</artifactId>

    <dependencies>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>application-model</artifactId>
        </dependency>
    </dependencies>

</project>


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/ItemRepository.java
================================================
package biz.paluch.clean.architecture.contracts.repositories;

import java.util.List;

import biz.paluch.clean.architecture.applicationmodel.Item;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:29
 */
public interface ItemRepository {

    Item find(String item);

    List<Item> findAll();

    void persist(Item item);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/OrderRepository.java
================================================
package biz.paluch.clean.architecture.contracts.repositories;

import java.util.List;

import biz.paluch.clean.architecture.applicationmodel.Order;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:26
 */
public interface OrderRepository {
    int getNextOrderId();

    void persist(Order order);

    List<Order> findOrders();
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/UserRepository.java
================================================
package biz.paluch.clean.architecture.contracts.repositories;

import biz.paluch.clean.architecture.applicationmodel.User;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:27
 */
public interface UserRepository {
    User find(String userName);

    void store(User user);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/CreateOrUpdateItem.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;

/**
 * Create or update item Use-Case.
 * 
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public interface CreateOrUpdateItem {

    /**
     * Creates a new or updates an existing item.
     * 
     * @param item
     */
    void createOrUpdateItem(String item);

    /**
     * Setter to {@link ItemRepository} dependency.
     * 
     * @param itemRepository
     */
    void setItemRepository(ItemRepository itemRepository);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItems.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;

/**
 * List items Use-Case.
 * 
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public interface ListItems {

    /**
     * List all items and pass these to the {@link ListItemsOutput} output.
     * 
     * @param listItemsOutput
     */
    void listItems(ListItemsOutput listItemsOutput);

    /**
     * Setter to {@link ItemRepository} dependency.
     * 
     * @param itemRepository
     */
    void setItemRepository(ItemRepository itemRepository);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItemsOutput.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

import java.util.List;

import biz.paluch.clean.architecture.applicationmodel.Item;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public interface ListItemsOutput {

    void onResponse(List<Item> items);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrder.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

import biz.paluch.clean.architecture.applicationmodel.NotFoundException;

/**
 * This use-case input boundary does not define any dependencies. The {@link #placeOrder(PlaceOrderRequest, PlaceOrderOutput)}
 * method accept a request data structure and an output boundary for returning the result of the operation.
 * 
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public interface PlaceOrder {

    /**
     * Places an order.
     * 
     * @param request
     * @param output
     */
    void placeOrder(PlaceOrderRequest request, PlaceOrderOutput output) throws NotFoundException;
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderOutput.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public interface PlaceOrderOutput {
    void onResponse(String orderId);
}


================================================
FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderRequest.java
================================================
package biz.paluch.clean.architecture.contracts.usecases;

import java.util.List;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public class PlaceOrderRequest {

    public List<String> items;
    public String userName;

}


================================================
FILE: delivery/web/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../..</relativePath>
    </parent>

    <artifactId>web</artifactId>
    <packaging>war</packaging>

    <dependencies>

        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>contracts</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>use-cases</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>application-model</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>jpa-repository</artifactId>
        </dependency>

        <!-- First declare the APIs we depend on and need for compilation. All
            of them are provided by JBoss AS 7 -->

        <!-- Import the CDI API, we use provided scope as the API is included in
            JBoss AS 7 -->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- Import the Common Annotations API (JSR-250), we use provided scope 
            as the API is included in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.annotation</groupId>
            <artifactId>jboss-annotations-api_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the JAX-RS API, we use provided scope as the API is included 
            in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.ws.rs</groupId>
            <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the EJB API, we use provided scope as the API is included in 
            JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.ejb</groupId>
            <artifactId>jboss-ejb-api_3.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the JSF API, we use provided scope as the API is included in 
            JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.faces</groupId>
            <artifactId>jboss-jsf-api_2.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the JPA API, we use provided scope as the API is included in
            JBoss AS 7 -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- Needed for running tests (you may also use TestNG) -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxb-provider</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <!-- Maven will append the version to the finalName (which is the name 
            given to the generated war, and hence the context root) -->
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- Compiler plugin enforces Java 1.6 compatibility and activates annotation 
                processors -->
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>${version.war.plugin}</version>
                <configuration>
                    <!-- Java EE 6 doesn't require web.xml, Maven needs to catch up! -->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>clean-architecture</warName>
                </configuration>
            </plugin>
            <!-- The Wildfly plugin deploys your war to a local Wildfly container -->
            <!-- To use, run: mvn package wildfly:deploy -->
            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <configuration>
                    <skip>false</skip>
                    <filename>clean-architecture.war</filename>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <!-- When built in OpenShift the 'openshift' profile will be used when 
                invoking mvn. -->
            <!-- Use this profile for any OpenShift specific customization your app 
                will need. -->
            <!-- By default that is to put the resulting archive into the 'deployments' 
                folder. -->
            <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html -->
            <id>openshift</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>${version.war.plugin}</version>
                        <configuration>
                            <outputDirectory>deployments</outputDirectory>
                            <warName>ROOT</warName>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>

    </profiles>
</project>


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/di_example/PlaceOrderWithDependencies.java
================================================
package biz.paluch.clean.architecture.di_example;

import javax.inject.Inject;

import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;
import biz.paluch.clean.architecture.usecases.advanced.PlaceOrderImpl;

/**
 * This Use-Case wrapper extends the {@link PlaceOrderImpl} use case class in order to use declarative dependency injection.
 * 
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 */
public class PlaceOrderWithDependencies extends PlaceOrderImpl {

    @Inject
    @Override
    public void setOrderRepository(OrderRepository orderRepository) {
        super.setOrderRepository(orderRepository);
    }

    @Inject
    @Override
    public void setItemRepository(ItemRepository itemRepository) {
        super.setItemRepository(itemRepository);
    }

    @Inject
    @Override
    public void setUserRepository(UserRepository userRepository) {
        super.setUserRepository(userRepository);
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/facade/ItemService.java
================================================
package biz.paluch.clean.architecture.facade;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.inject.Inject;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.usecases.CreateOrUpdateItem;
import biz.paluch.clean.architecture.contracts.usecases.ListItemsOutput;
import biz.paluch.clean.architecture.usecases.advanced.ListItemsImpl;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 12:45
 */
@Stateless
public class ItemService {

    @Inject
    private ItemRepository itemRepository;

    @Inject
    private ListItemsImpl listItems;

    @Inject
    private CreateOrUpdateItem createOrUpdateItem;

    /**
     * Wire all dependencies.
     */
    @PostConstruct
    public void postConstruct() {
        createOrUpdateItem.setItemRepository(itemRepository);
        listItems.setItemRepository(itemRepository);
    }

    /**
     * List items and illustrate the use of an output boundary without an adapter. While this may look awkward, imagine this use
     * case might have a conversation with the output boundary. The use case does some action and talks to the output boundary
     * in order to push some intermediate results until the operation is finished.
     * 
     * @return list of items.
     */
    public List<Item> listItems() {

        final List<Item> results = new ArrayList<>();

        listItems.listItems(new ListItemsOutput() {
            @Override
            public void onResponse(List<Item> items) {
                results.addAll(items);
            }
        });

        return results;
    }

    /**
     * A simple use case without the need of an output boundary.
     * 
     * @param item
     */
    public void createOrUpdateItem(String item) {
        createOrUpdateItem.createOrUpdateItem(item);
    }

    public Item find(String itemId) {
        return itemRepository.find(itemId);
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/facade/OrderService.java
================================================
package biz.paluch.clean.architecture.facade;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import biz.paluch.clean.architecture.applicationmodel.NotFoundException;
import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;
import biz.paluch.clean.architecture.di_example.PlaceOrderWithDependencies;
import biz.paluch.clean.architecture.usecases.simple.CreateOrUpdateUser;
import biz.paluch.clean.architecture.usecases.simple.ListOrders;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 12:45
 */
@Stateless
public class OrderService {

    @Inject
    private OrderRepository orderRepository;

    @Inject
    private UserRepository userRepository;

    @Inject
    private ItemRepository itemRepository;

    @Inject
    private CreateOrUpdateUser createOrUpdateUser;

    @Inject
    private ListOrders listOrders;

    @Inject
    private PlaceOrderWithDependencies placeOrder;

    public List<Order> listOrders() {
        return listOrders.listOrders();
    }

    public String placeOrder(List<String> items, String userName) throws NotFoundException {
        createOrUpdateUser.createOrUpdateUser(userName);

        PlaceOrderRequest request = new PlaceOrderRequest();
        request.items = items;
        request.userName = userName;

        PlaceOrderResponse response = new PlaceOrderResponse();

        placeOrder.placeOrder(request, response);

        return response.orderId;
    }

    private static class PlaceOrderResponse implements PlaceOrderOutput {
        public String orderId;

        @Override
        public void onResponse(String orderId) {
            this.orderId = orderId;
        }
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemController.java
================================================
package biz.paluch.clean.architecture.frontend.jsf;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.facade.ItemService;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:10
 */
@RequestScoped
@Named("itemController")
public class ItemController {
    @EJB
    private ItemService itemService;

    @Inject
    private ItemModel itemModel;

    public List<SelectItem> getItems() {
        List<Item> items = itemService.listItems();
        List<SelectItem> result = new ArrayList<>();

        for (Item item : items) {
            SelectItem selectItem = new SelectItem(item.getItem(), item.getItem());
            result.add(selectItem);
        }

        return result;
    }

    public void createOrUpdateItem() {
        itemService.createOrUpdateItem(itemModel.getItem());
        itemModel.setItem("");
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemModel.java
================================================
package biz.paluch.clean.architecture.frontend.jsf;

import java.io.Serializable;

import javax.enterprise.inject.Model;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:10
 */
@Model
public class ItemModel implements Serializable
{
    private String item;

    public String getItem()
    {
        return item;
    }

    public void setItem(String item)
    {
        this.item = item;
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderController.java
================================================
package biz.paluch.clean.architecture.frontend.jsf;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;

import biz.paluch.clean.architecture.facade.OrderService;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:41
 */
@RequestScoped
@Named("orderController")
public class OrderController {
    @EJB
    private OrderService orderService;

    @Inject
    private OrderModel orderModel;

    public void addItem() {
        OrderItem oim = new OrderItem();

        if (orderModel.getSelectedItem() != null && !"".equals(orderModel.getSelectedItem().trim())) {
            oim.setItem(orderModel.getSelectedItem());
            orderModel.getOrderItems().add(oim);
        }
    }

    public void removeItem(OrderItem item) {
        orderModel.getOrderItems().remove(item);
    }

    public void createOrder() {
        List<String> items = new ArrayList<>();

        for (OrderItem orderItem : orderModel.getOrderItems()) {
            items.add(orderItem.getItem());
        }
        String orderId = orderService.placeOrder(items, orderModel.getUserName());

        orderModel.setUserName(null);
        orderModel.setSelectedItem(null);
        orderModel.setOrderItems(new ArrayList<OrderItem>());

        FacesContext.getCurrentInstance().addMessage("success",
                new FacesMessage("Created sucessfully an order with id " + orderId));

    }

}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderItem.java
================================================
package biz.paluch.clean.architecture.frontend.jsf;

import java.io.Serializable;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:40
 */
public class OrderItem implements Serializable
{
    private String item;

    public String getItem()
    {
        return item;
    }

    public void setItem(String item)
    {
        this.item = item;
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderModel.java
================================================
package biz.paluch.clean.architecture.frontend.jsf;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Model;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:39
 */
@Model
@SessionScoped
public class OrderModel implements Serializable
{
    private String userName;
    private List<OrderItem> orderItems = new ArrayList<>();
    private String selectedItem;

    public String getSelectedItem()
    {
        return selectedItem;
    }

    public void setSelectedItem(String selectedItem)
    {
        this.selectedItem = selectedItem;
    }

    public String getUserName()
    {
        return userName;
    }

    public void setUserName(String userName)
    {
        this.userName = userName;
    }

    public List<OrderItem> getOrderItems()
    {
        return orderItems;
    }

    public void setOrderItems(List<OrderItem> orderItems)
    {
        this.orderItems = orderItems;
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemResource.java
================================================
package biz.paluch.clean.architecture.frontend.rest;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.facade.ItemService;

@Path("/items")
@RequestScoped
public class ItemResource {

    @EJB
    private ItemService itemService;

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public ItemsRepresentation list() {
        ItemsRepresentation result = new ItemsRepresentation();
        result.setItems(itemService.listItems());
        return result;
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    @Path("{itemId}")
    public JAXBElement<Item> get(@PathParam("itemId") String itemId) {
        Item item = itemService.find(itemId);
        if (item == null) {
            throw new WebApplicationException(Response.Status.NOT_FOUND);
        }

        return new JAXBElement<>(new QName("item"), Item.class, item);
    }

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public void createOrUpdate(JAXBElement<Item> item) {
        itemService.createOrUpdateItem(item.getValue().getItem());
    }

}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemsRepresentation.java
================================================
package biz.paluch.clean.architecture.frontend.rest;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import biz.paluch.clean.architecture.applicationmodel.Item;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:53
 */
@XmlRootElement
public class ItemsRepresentation {
    private List<Item> items = new ArrayList<>();

    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/JaxRsActivator.java
================================================
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
 * contributors by the @authors tag. See the copyright.txt in the
 * distribution for a full listing of individual contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package biz.paluch.clean.architecture.frontend.rest;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

/**
 * A class extending {@link Application} and annotated with @ApplicationPath is the Java EE 6 "no XML" approach to activating
 * JAX-RS.
 * 
 * <p>
 * Resources are served relative to the servlet path specified in the {@link ApplicationPath} annotation.
 * </p>
 */
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
    /* class body intentionally left blank */
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrderResource.java
================================================
package biz.paluch.clean.architecture.frontend.rest;

import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import biz.paluch.clean.architecture.facade.OrderService;

@Path("/orders")
@RequestScoped
public class OrderResource {

    @EJB
    private OrderService orderService;

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public OrdersRepresentation list() {
        OrdersRepresentation result = new OrdersRepresentation();
        result.setOrders(orderService.listOrders());
        return result;
    }

}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrdersRepresentation.java
================================================
package biz.paluch.clean.architecture.frontend.rest;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

import biz.paluch.clean.architecture.applicationmodel.Order;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:56
 */
@XmlRootElement
public class OrdersRepresentation {
    private List<Order> orders = new ArrayList<>();

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}


================================================
FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/util/Resources.java
================================================
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
 * contributors by the @authors tag. See the copyright.txt in the
 * distribution for a full listing of individual contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package biz.paluch.clean.architecture.util;

import java.util.logging.Logger;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * This class uses CDI to alias Java EE resources, such as the persistence context, to CDI beans
 * 
 * <p>
 * Example injection on a managed bean field:
 * </p>
 * 
 * <pre>
 * &#064;Inject
 * private EntityManager em;
 * </pre>
 */
public class Resources {
    // use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly
    @SuppressWarnings("unused")
    @Produces
    @PersistenceContext
    private EntityManager em;

    @Produces
    public Logger produceLog(InjectionPoint injectionPoint) {
        return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
    }

    @Produces
    @RequestScoped
    public FacesContext produceFacesContext() {
        return FacesContext.getCurrentInstance();
    }

}


================================================
FILE: delivery/web/src/main/resources/META-INF/persistence.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="primary" transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/clean-architectureDS</jta-data-source>

        <class>biz.paluch.clean.architecture.external.jpa.entity.ItemEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.UserEntity</class>

        <exclude-unlisted-classes>false</exclude-unlisted-classes>

        <shared-cache-mode>NONE</shared-cache-mode>
        <validation-mode>AUTO</validation-mode>

        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="false" />
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>


================================================
FILE: delivery/web/src/main/webapp/WEB-INF/beans.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure 
    this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>


================================================
FILE: delivery/web/src/main/webapp/WEB-INF/clean-architecture-ds.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- This is an unmanaged datasource. It should be used for proofs of concept 
    or testing only. It uses H2, an in memory database that ships with JBoss 
    AS. -->
<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
    <!-- The datasource is bound into JNDI at this location. We reference 
        this in META-INF/persistence.xml -->
    <datasource jndi-name="java:jboss/datasources/clean-architectureDS"
        pool-name="clean-architecture" enabled="true"
        use-java-context="true">
        <connection-url>jdbc:h2:mem:clean-architecture;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1</connection-url>
        <driver>h2</driver>
        <security>
            <user-name>sa</user-name>
            <password>sa</password>
        </security>
    </datasource>
</datasources>
 


================================================
FILE: delivery/web/src/main/webapp/WEB-INF/faces-config.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file is not required if you don't need any extra configuration. -->
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

    <!-- This descriptor activates the JSF 2.0 Servlet -->

    <!-- Write your navigation rules here. You are encouraged to use CDI 
        for creating @Named managed beans. -->
    
</faces-config>


================================================
FILE: delivery/web/src/main/webapp/WEB-INF/web.xml
================================================
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <display-name>Servlet 3.0 Web Application</display-name>


    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

</web-app>

================================================
FILE: delivery/web/src/main/webapp/index.xhtml
================================================
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Orders</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <h:outputStylesheet name="css/screen.css"/>
</h:head>
<h:body>
    <div id="container">
        <h1>Clean Architecture Demo</h1>

        <div id="content">
            <p>
                You can manage items and create an order with this frontend.
            </p>

            <p><strong>Guide</strong></p>
            <ol>
                <li>Go to <a href="items.xhtml">Manage Items</a> and create a few items</li>
                <li>Come back to <a href="index.xhtml">the Index</a> and add some items into the order</li>
                <li>Enter a name into the name field</li>
                <li>Submit the order using "Create Order" and notice that an order record has been written to
                    <code>java:jboss/datasources/clean-architectureDS</code></li>
            </ol>
            <p>

            </p>

            <h2>Order</h2>
            <h:form>

                <h:messages/>
                Your Name: <h:inputText value="#{orderModel.userName}"/><br/>

                Items in Order:
                <h:dataTable value="#{orderModel.orderItems}" var="var" style="width: 50%">
                    <h:column>
                        <f:facet name="header">
                            Item
                        </f:facet>
                        <h:outputText value="#{var.item}"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            Remove
                        </f:facet>
                        <h:commandLink id="remove"
                                       action="${orderController.removeItem(var)}">Remove item</h:commandLink>
                    </h:column>
                </h:dataTable>

                <h2>Add new Item</h2>

                <h:selectOneListbox size="1" value="#{orderModel.selectedItem}">
                    <f:selectItems value="#{itemController.items}"/>
                </h:selectOneListbox>
                <h:commandButton action="#{orderController.addItem()}" value="Add item"/>

                <br/>

                <h:commandButton action="#{orderController.createOrder()}" value="Create the Order"/>
            </h:form>

            <a href="items.xhtml">Manage Items</a>
        </div>

        <div id="footer">
            <p>
                This project was generated from a Maven archetype from
                JBoss.<br/> Sources: <a
                    href="https://github.com/mp911de/CleanArchitecture">https://github.com/mp911de/CleanArchitecture</a>
            </p>
        </div>
    </div>
</h:body>
</html>

================================================
FILE: delivery/web/src/main/webapp/items.xhtml
================================================
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Items</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <h:outputStylesheet name="css/screen.css"/>
</h:head>
<h:body>
    <div id="container">
        <div id="content">
            <h2>Items</h2>
            <h:form>
                <h:dataTable value="#{itemController.items}" var="var">
                    <h:column>
                        <f:facet name="header">
                            Item
                        </f:facet>
                        <h:outputText value="#{var.label}"/>
                    </h:column>
                </h:dataTable>

                <h2>Create new Item</h2>
                <h:inputText value="#{itemModel.item}"/>
                <h:commandButton action="#{itemController.createOrUpdateItem}" value="Create or Update"/>
            </h:form>

            <a href="index.xhtml">Back to Index</a>
        </div>

        <div id="footer">
            <p>
                This project was generated from a Maven archetype from
                JBoss.<br/>
            </p>
        </div>
    </div>
</h:body>
</html>

================================================
FILE: delivery/web/src/main/webapp/resources/css/screen.css
================================================
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
 * contributors by the @authors tag. See the copyright.txt in the
 * distribution for a full listing of individual contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* Core styles for the page */
body {
  margin: 0;
  padding: 0;
  background-color: #F1F1F1;
  font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
  font-size: 0.8em;
  color:#363636;
}

#container {
  margin: 0 auto;
  padding: 0 20px 10px 20px;
  border-top: 5px solid #000000;
  border-left: 5px solid #8c8f91;
  border-right: 5px solid #8c8f91;
  border-bottom: 25px solid #8c8f91;
  width: 865px; /* subtract 40px from banner width for padding */
  background: #FFFFFF;
  background-image: url(#{request.contextPath}/resources/gfx/headerbkg.png);
  background-repeat: repeat-x;
  padding-top: 30px;
  box-shadow: 3px 3px 15px #d5d5d5;
}
#content {
  float: left;
  width: 500px;
  margin: 20px;
}
#aside {
  font-size: 0.9em;
  width: 275px;
  float: left;
  margin: 20px 0px;
  border: 1px solid #D5D5D5;
  background: #F1F1F1;
  background-image: url(#{request.contextPath}/resources/gfx/asidebkg.png);
  background-repeat: repeat-x;
  padding: 20px;
}

#aside ul {
  padding-left: 30px;
}
.dualbrand {
  float: right;
  padding-right: 10px;
}
#footer {
  clear: both;
  text-align: center;
  color: #666666;
  font-size: 0.85em;
}
code {
  font-size: 1.1em;
}
a {
  color: #4a5d75;
  text-decoration: none;
}
a:hover {
  color: #369;
  text-decoration: underline;
}
h1 {
  color:#243446;
  font-size: 2.25em;
}
h2 {
  font-size: 1em;
}
h3 {
  color:#243446;
}
h4 {
}
h5 {
}
h6 {
}
/* Member registration styles */
span.invalid {
  padding-left: 3px;
  color: red;
}
form {
  padding: 1em;
  font: 80%/1 sans-serif;
  width: 375px;
  border: 1px solid #D5D5D5;
}
label {
  float: left;
  width: 15%;
  margin-left: 20px;
  margin-right: 0.5em;
  padding-top: 0.2em;
  text-align: right;
  font-weight: bold;
  color:#363636;
}
input {
  margin-bottom: 8px;
}
.register {
  float: left;
  margin-left: 85px;
}

/*  -----  table style  -------  */


/*  = Simple Table style (black header, grey/white stripes  */

.simpletablestyle {
  background-color:#E6E7E8;
  clear:both;
  width: 550px;
}

.simpletablestyle img {
  border:0px;
}

.simpletablestyle td {
  height:2em;
  padding-left: 6px;
  font-size:11px;
  padding:5px 5px;
}

.simpletablestyle th {
	background: url(#{request.contextPath}/resources/gfx/bkg-blkheader.png) black repeat-x top left;
  font-size:12px;
  font-weight:normal;
  padding:0 10px 0 5px;
  border-bottom:#999999 dotted 1px;
}

.simpletablestyle thead {
  background: url(#{request.contextPath}/resources/gfx/bkg-blkheader.png) black repeat-x top left;
  height:31px;
  font-size:10px;
  font-weight:bold;
  color:#FFFFFF;
  text-align:left;
}

.simpletablestyle .header a {
  color:#94aebd;
}

.simpletablestype tfoot {
	height: 20px;
  font-size: 10px;
  font-weight: bold;
  background-color: #EAECEE;
  text-align: center;
}

.simpletablestyle tr.header td {
  padding: 0px 10px 0px 5px;
}


.simpletablestyle .subheader {
  background-color: #e6e7e8;
  font-size:10px;
  font-weight:bold;
  color:#000000;
  text-align:left;
}

/* Using new CSS3 selectors for styling*/
.simpletablestyle tr:nth-child(odd) {
  background: #f4f3f3;
}
.simpletablestyle tr:nth-child(even) {
  background: #ffffff;
}

.simpletablestyle td a:hover {
  color:#3883ce;
  text-decoration:none; 
}


================================================
FILE: external/jpa-repository/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../..</relativePath>
    </parent>

    <artifactId>jpa-repository</artifactId>

    <dependencies>

        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>contracts</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>application-model</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>commons</artifactId>
        </dependency>

        <!-- First declare the APIs we depend on and need for compilation. All
            of them are provided by JBoss AS 7 -->

        <!-- Import the CDI API, we use provided scope as the API is included in
            JBoss AS 7 -->
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- Import the Common Annotations API (JSR-250), we use provided scope
            as the API is included in JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.annotation</groupId>
            <artifactId>jboss-annotations-api_1.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the JPA API, we use provided scope as the API is included in
            JBoss AS 7 -->
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Import the EJB API, we use provided scope as the API is included in
            JBoss AS 7 -->
        <dependency>
            <groupId>org.jboss.spec.javax.ejb</groupId>
            <artifactId>jboss-ejb-api_3.1_spec</artifactId>
            <scope>provided</scope>
        </dependency>


        <!-- Annotation processor to generate the JPA 2.0 metamodel classes for
            typesafe criteria queries -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- Needed for running tests (you may also use TestNG) -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/ItemEntity.java
================================================
package biz.paluch.clean.architecture.external.jpa.entity;

import javax.persistence.*;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:18
 */
@Entity
@Table(name = "Items")
@NamedQueries({
        @NamedQuery(name = ItemEntity.QUERY_FIND_BY_ITEM_NAME, query = "SELECT i from ItemEntity i where i.item = :item"),
        @NamedQuery(name = ItemEntity.QUERY_FIND_ALL, query = "SELECT i from ItemEntity i ") })
public class ItemEntity {
    public static final String QUERY_FIND_BY_ITEM_NAME = "ItemEntity.findByItem";
    public static final String QUERY_FIND_ALL = "ItemEntity.findAll";

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Basic
    private String item;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderEntity.java
================================================
package biz.paluch.clean.architecture.external.jpa.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.*;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:18
 */
@Entity
@Table(name = "Orders")
@NamedQueries({ @NamedQuery(name = OrderEntity.QUERY_COUNT, query = "SELECT count(orderId) from OrderEntity"),
        @NamedQuery(name = OrderEntity.QUERY_FIND_BY_ORDERID, query = "SELECT o from OrderEntity o where o.orderId= :orderId"),
        @NamedQuery(name = OrderEntity.QUERY_FIND_ALL, query = "SELECT o from  OrderEntity o ") })
public class OrderEntity {
    public static final String QUERY_COUNT = "OrderEntity.count";
    public static final String QUERY_FIND_BY_ORDERID = "OrderEntity.findByOrderId";
    public static final String QUERY_FIND_ALL = "OrderEntity.findAll";
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Basic
    private String orderId;

    @Basic
    private Date orderDate;

    @ManyToOne()
    private UserEntity createdBy;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
    private List<OrderItemEntity> items = new ArrayList<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public UserEntity getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(UserEntity createdBy) {
        this.createdBy = createdBy;
    }

    public List<OrderItemEntity> getItems() {
        return items;
    }

    public void setItems(List<OrderItemEntity> items) {
        this.items = items;
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderItemEntity.java
================================================
package biz.paluch.clean.architecture.external.jpa.entity;

import javax.persistence.*;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:18
 */
@Entity
@Table(name = "OrderItem")
public class OrderItemEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "orderId")
    private OrderEntity order;

    @Basic
    private String orderItem;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public OrderEntity getOrder() {
        return order;
    }

    public void setOrder(OrderEntity order) {
        this.order = order;
    }

    public String getOrderItem() {
        return orderItem;
    }

    public void setOrderItem(String orderItem) {
        this.orderItem = orderItem;
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/UserEntity.java
================================================
package biz.paluch.clean.architecture.external.jpa.entity;

import javax.persistence.*;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:24
 */
@Entity
@Table(name = "Users")
@NamedQueries({ @NamedQuery(name = UserEntity.QUERY_FIND_BY_USERNAME, query = "SELECT u from UserEntity u where u.userName = :userName") })
public class UserEntity {
    public static final String QUERY_FIND_BY_USERNAME = "UserEntity.finyByUserName";
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Basic
    private String userName;

    public UserEntity() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [id=").append(id);
        sb.append(", userName='").append(userName).append('\'');
        sb.append(']');
        return sb.toString();
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaItemRepository.java
================================================
package biz.paluch.clean.architecture.external.jpa.repository;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.external.jpa.entity.ItemEntity;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 12:55
 */
public class JpaItemRepository implements ItemRepository {
    @Inject
    private EntityManager entityManager;

    @Override
    public Item find(String item) {

        List<ItemEntity> list = entityManager.createNamedQuery(ItemEntity.QUERY_FIND_BY_ITEM_NAME, ItemEntity.class)
                .setParameter("item", item).getResultList();
        if (list.isEmpty()) {
            return null;
        }

        ItemEntity itemEntity = list.get(0);

        return toItem(itemEntity);
    }

    private Item toItem(ItemEntity itemEntity) {
        Item result = new Item();
        result.setItem(itemEntity.getItem());

        return result;
    }

    @Override
    public void persist(Item item) {

        ItemEntity itemEntity = new ItemEntity();
        itemEntity.setItem(item.getItem());
        entityManager.persist(itemEntity);
    }

    @Override
    public List<Item> findAll() {
        List<ItemEntity> list = entityManager.createNamedQuery(ItemEntity.QUERY_FIND_ALL, ItemEntity.class).getResultList();
        List<Item> result = new ArrayList<>();
        for (ItemEntity itemEntity : list) {
            result.add(toItem(itemEntity));
        }

        return result;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaOrderRepository.java
================================================
package biz.paluch.clean.architecture.external.jpa.repository;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.applicationmodel.OrderItem;
import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;
import biz.paluch.clean.architecture.external.jpa.entity.OrderEntity;
import biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity;
import biz.paluch.clean.architecture.external.jpa.entity.UserEntity;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:22
 */
@ApplicationScoped
public class JpaOrderRepository implements OrderRepository {
    @Inject
    private EntityManager entityManager;

    @Override
    public int getNextOrderId() {
        List<Number> maxOrderId = entityManager.createNamedQuery(OrderEntity.QUERY_COUNT).getResultList();
        if (maxOrderId.isEmpty()) {
            return 1;
        }
        return maxOrderId.get(0).intValue() + 1;
    }

    @Override
    public void persist(Order order) {

        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setOrderDate(order.getOrderDate());
        orderEntity.setOrderId(order.getOrderId());

        UserEntity user = getUser(order.getCreatedBy().getUserName());
        orderEntity.setCreatedBy(user);

        for (OrderItem orderItem : order.getItems()) {
            OrderItemEntity orderItemEntity = new OrderItemEntity();
            orderItemEntity.setOrder(orderEntity);
            orderItemEntity.setOrderItem(orderItem.getOrderItem());
            orderEntity.getItems().add(orderItemEntity);
        }

        entityManager.persist(orderEntity);
    }

    private UserEntity getUser(String userName) {
        return (UserEntity) entityManager.createNamedQuery(UserEntity.QUERY_FIND_BY_USERNAME)
                .setParameter("userName", userName).getSingleResult();
    }

    public void deleteAll() {
        entityManager.createQuery("DELETE from  " + OrderEntity.class.getSimpleName()).executeUpdate();
    }

    public Order find(String orderId) {
        List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_BY_ORDERID, OrderEntity.class)
                .setParameter("orderId", orderId).getResultList();
        if (list.isEmpty()) {
            return null;
        }

        OrderEntity orderEntity = list.get(0);

        return toOrder(orderEntity);
    }

    private Order toOrder(OrderEntity orderEntity) {
        Order order = new Order();

        order.setCreatedBy(new User(orderEntity.getCreatedBy().getUserName()));
        order.setOrderDate(orderEntity.getOrderDate());
        order.setOrderId(orderEntity.getOrderId());

        for (OrderItemEntity orderItemEntity : orderEntity.getItems()) {
            order.getItems().add(new OrderItem(orderItemEntity.getOrderItem()));
        }
        return order;
    }

    @Override
    public List<Order> findOrders() {

        List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_ALL, OrderEntity.class).getResultList();

        List<Order> result = new ArrayList<>();
        for (OrderEntity orderEntity : list) {
            result.add(toOrder(orderEntity));
        }
        return result;
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}


================================================
FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaUserRepository.java
================================================
package biz.paluch.clean.architecture.external.jpa.repository;

import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;

import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;
import biz.paluch.clean.architecture.external.jpa.entity.UserEntity;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 09:21
 */
public class JpaUserRepository implements UserRepository {
    @Inject
    private EntityManager entityManager;

    @Override
    public User find(String userName) {
        List<UserEntity> list = entityManager.createNamedQuery(UserEntity.QUERY_FIND_BY_USERNAME, UserEntity.class)
                .setParameter("userName", userName).getResultList();

        if (!list.isEmpty()) {
            UserEntity userEntity = list.get(0);
            User user = new User();
            user.setUserName(userEntity.getUserName());
            return user;
        }

        return null;
    }

    @Override
    public void store(User user) {
        UserEntity userEntity = new UserEntity();
        userEntity.setUserName(user.getUserName());
        entityManager.persist(userEntity);
    }

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }
}


================================================
FILE: external/jpa-repository/src/main/resources/META-INF/beans.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure 
    this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>


================================================
FILE: external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/AbstractJpaTest.java
================================================
package biz.paluch.clean.architecture.external.jpa;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.h2.Driver;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.dialect.H2Dialect;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 13.06.13 21:28
 */
public abstract class AbstractJpaTest {

    private static EntityManagerFactory entityManagerFactory;
    protected EntityManager entityManager;

    @BeforeClass
    public static void beforeClass() throws Exception {
        Map<String, String> properties = getH2Properties();
        entityManagerFactory = Persistence.createEntityManagerFactory("primary", properties);

    }

    @AfterClass
    public static void afterClass() throws Exception {
        entityManagerFactory.close();

    }

    @Before
    public void before() throws Exception {
        entityManager = entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();

    }

    @After
    public void after() throws Exception {
        entityManager.getTransaction().rollback();
        entityManager.close();

    }

    public static Map<String, String> getH2Properties() {
        Map<String, String> properties = new HashMap<>();
        properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());
        properties.put(AvailableSettings.URL, "jdbc:h2:mem:primary");
        properties.put(AvailableSettings.USER, "SA");
        properties.put(AvailableSettings.DRIVER, Driver.class.getName());
        properties.put(AvailableSettings.HBM2DDL_AUTO, "create-drop");
        return properties;
    }
}


================================================
FILE: external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/JpaOrderRepositoryTest.java
================================================
package biz.paluch.clean.architecture.external.jpa;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.junit.Test;

import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.applicationmodel.OrderItem;
import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.external.jpa.repository.JpaOrderRepository;
import biz.paluch.clean.architecture.external.jpa.repository.JpaUserRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 08:50
 */
public class JpaOrderRepositoryTest extends AbstractJpaTest {
    private JpaUserRepository jpaUserRepository = new JpaUserRepository();
    private JpaOrderRepository jpaOrderRepository = new JpaOrderRepository();

    @Override
    public void before() throws Exception {
        super.before();
        jpaOrderRepository.setEntityManager(entityManager);
        jpaUserRepository.setEntityManager(entityManager);
    }

    @Test
    public void testGetNextOrderId() throws Exception {
        int result = jpaOrderRepository.getNextOrderId();
        assertEquals(1, result);
    }

    @Test
    public void testPersistAndFind() throws Exception {
        jpaUserRepository.store(new User("mark"));
        entityManager.flush();

        Order order = mockOrder();

        jpaOrderRepository.persist(order);

    }

    private Order mockOrder() {
        Order order = new Order();
        order.setCreatedBy(new User("mark"));
        order.setOrderDate(new Date());
        order.setOrderId("mark-42");

        order.getItems().add(new OrderItem("A"));
        order.getItems().add(new OrderItem("B"));
        order.getItems().add(new OrderItem("C"));
        return order;
    }

    @Test
    public void testFind() throws Exception {

        Order order = mockOrder();
        createOrder(order);

        Order result = jpaOrderRepository.find(order.getOrderId());

        assertEquals(order.getCreatedBy().getUserName(), result.getCreatedBy().getUserName());
        assertEquals(order.getOrderId(), result.getOrderId());
        assertEquals(order.getItems().size(), result.getItems().size());
    }

    @Test
    public void testFindOrders() throws Exception {
        Order order = mockOrder();
        createOrder(order);

        List<Order> result = jpaOrderRepository.findOrders();
        assertEquals(1, result.size());

    }

    private void createOrder(Order order) {

        jpaUserRepository.store(new User("mark"));
        jpaOrderRepository.persist(order);
        entityManager.flush();
    }
}


================================================
FILE: external/jpa-repository/src/test/resources/META-INF/persistence.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="primary" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>biz.paluch.clean.architecture.external.jpa.entity.ItemEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.OrderItemEntity</class>
        <class>biz.paluch.clean.architecture.external.jpa.entity.UserEntity</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <shared-cache-mode>NONE</shared-cache-mode>
        <validation-mode>AUTO</validation-mode>

        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />

            <property name="hibernate.cache.use_second_level_cache" value="false" />
            <property name="hibernate.cache.use_query_cache" value="false" />

            <property name="hibernate.transaction.jta.platform"
                      value="org.hibernate.service.jta.platform.internal.NoJtaPlatform" />
        </properties>
    </persistence-unit>
</persistence>


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>biz.paluch.clean.architecture</groupId>
    <artifactId>clean-architecture</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>
    <name>clean-architecture</name>
    <description>A Multi-Module example for a maven clean architecture project.</description>

    <url>http://www.paluch.biz/</url>
    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <distribution>repo</distribution>
            <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
        </license>
    </licenses>

    <modules>
        <module>application-model</module>
        <module>contracts</module>
        <module>commons</module>
        <module>use-cases</module>
        <module>external/jpa-repository</module>
        <module>delivery/web</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.wildfly.maven.plugin>1.1.0.Alpha8</version.wildfly.maven.plugin>
        <version.jboss.bom>1.0.6.Final</version.jboss.bom>
        <version.compiler.plugin>2.3.1</version.compiler.plugin>
        <version.surefire.plugin>2.10</version.surefire.plugin>
        <version.war.plugin>2.6</version.war.plugin>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>

    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>biz.paluch.clean.architecture</groupId>
                <artifactId>application-model</artifactId>
                <version>${project.version}</version>
            </dependency>

            <dependency>
                <groupId>biz.paluch.clean.architecture</groupId>
                <artifactId>use-cases</artifactId>
                <version>${project.version}</version>
            </dependency>

            <dependency>
                <groupId>biz.paluch.clean.architecture</groupId>
                <artifactId>jpa-repository</artifactId>
                <version>${project.version}</version>
            </dependency>

            <dependency>
                <groupId>biz.paluch.clean.architecture</groupId>
                <artifactId>commons</artifactId>
                <version>${project.version}</version>
            </dependency>

            <dependency>
                <groupId>biz.paluch.clean.architecture</groupId>
                <artifactId>contracts</artifactId>
                <version>${project.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.3.2</version>
            </dependency>

            <dependency>
                <groupId>javax.inject</groupId>
                <artifactId>javax.inject</artifactId>
                <version>1</version>
                <scope>provided</scope>
            </dependency>

            <!-- JBoss distributes a complete set of Java EE 6 APIs including a Bill
                of Materials (BOM). A BOM specifies the versions of a "stack" (or a collection) 
                of artifacts. We use this here so that we always get the correct versions 
                of artifacts. Here we use the jboss-javaee-6.0-with-tools stack (you can 
                read this as the JBoss stack of the Java EE 6 APIs, with some extras tools 
                for your project, such as Arquillian for testing) and the jboss-javaee-6.0-with-hibernate 
                stack you can read this as the JBoss stack of the Java EE 6 APIs, with extras 
                from the Hibernate family of projects) -->
            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-javaee-6.0-with-tools</artifactId>
                <version>${version.jboss.bom}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.jboss.bom</groupId>
                <artifactId>jboss-javaee-6.0-with-hibernate</artifactId>
                <version>${version.jboss.bom}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.191</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.2</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.2</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>2.6.8</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jaxrs</artifactId>
                <version>2.3.6.Final</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>org.jboss.resteasy</groupId>
                <artifactId>resteasy-jaxb-provider</artifactId>
                <version>2.3.6.Final</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>


    <build>
        <defaultGoal>clean package jboss-as:run</defaultGoal>
        <plugins>

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
            </plugin>

            <plugin>
                <groupId>org.wildfly.plugins</groupId>
                <artifactId>wildfly-maven-plugin</artifactId>
                <version>${version.wildfly.maven.plugin}</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>

    </build>

</project>


================================================
FILE: use-cases/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>biz.paluch.clean.architecture</groupId>
        <artifactId>clean-architecture</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>use-cases</artifactId>

    <dependencies>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>application-model</artifactId>
        </dependency>
        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>contracts</artifactId>
        </dependency>

        <dependency>
            <groupId>biz.paluch.clean.architecture</groupId>
            <artifactId>commons</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/CreateOrUpdateItemImpl.java
================================================
package biz.paluch.clean.architecture.usecases.advanced;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.usecases.CreateOrUpdateItem;

/**
 *
 * This Use-Case class implements the input boundary {@link CreateOrUpdateItem} and requires a dependency to
 * {@link ItemRepository}. Everything within this class is POJO-style. There is no response boundary since the completion of the
 * use case does not create any result data structure.
 *
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:02
 */
public class CreateOrUpdateItemImpl implements CreateOrUpdateItem {

    private ItemRepository itemRepository;

    public void createOrUpdateItem(String item) {

        Item theItem = itemRepository.find(item);
        if (theItem == null) {
            theItem = new Item();
            theItem.setItem(item);
            itemRepository.persist(theItem);
        }
    }

    public void setItemRepository(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }
}


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/ListItemsImpl.java
================================================
package biz.paluch.clean.architecture.usecases.advanced;

import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.usecases.ListItems;
import biz.paluch.clean.architecture.contracts.usecases.ListItemsOutput;

/**
 *
 * This Use-Case class implements the input boundary {@link ListItems} and requires a dependency to {@link ItemRepository}.
 * Everything within this class is POJO-style. There is no response boundary since the completion of the use case does not
 * create any result data structure.
 *
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 13:02
 */
public class ListItemsImpl implements ListItems {
    private ItemRepository itemRepository;

    @Override
    public void listItems(ListItemsOutput listItemsOutput) {
        listItemsOutput.onResponse(itemRepository.findAll());
    }

    @Override
    public void setItemRepository(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }

}


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/PlaceOrderImpl.java
================================================
package biz.paluch.clean.architecture.usecases.advanced;

import java.util.List;

import biz.paluch.clean.architecture.applicationmodel.NotFoundException;
import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.applicationmodel.OrderItem;
import biz.paluch.clean.architecture.commons.DateProvider;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrder;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;
import biz.paluch.clean.architecture.usecases.simple.ValidateOrder;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:15
 */
public class PlaceOrderImpl implements PlaceOrder {
    private OrderRepository orderRepository;
    private ItemRepository itemRepository;
    private UserRepository userRepository;

    /**
     * Place order and return the OrderId.
     * 
     * @param request
     * @param output
     */
    @Override
    public void placeOrder(PlaceOrderRequest request, PlaceOrderOutput output) throws NotFoundException {

        ValidateOrder.newInstance(itemRepository, userRepository).validate(request.items, request.userName);

        String orderId = createOrderId(request.userName);

        Order order = constructOrder(orderId, request.items, request.userName);

        storeOrder(order);

        output.onResponse(order.getOrderId());
    }

    private String createOrderId(String userName) {
        int nextOrderId = orderRepository.getNextOrderId();
        return userName + "-" + nextOrderId;
    }

    private Order constructOrder(String orderId, List<String> items, String userName) {
        Order order = new Order();
        order.setOrderDate(DateProvider.get());
        order.setOrderId(orderId);
        order.setCreatedBy(userRepository.find(userName));

        for (String item : items) {
            OrderItem orderItem = new OrderItem();
            orderItem.setOrderItem(item);
            order.getItems().add(orderItem);
        }

        return order;
    }

    private void storeOrder(Order order) {
        orderRepository.persist(order);
    }

    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public void setItemRepository(ItemRepository itemRepository) {
        this.itemRepository = itemRepository;
    }

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/CreateOrUpdateUser.java
================================================
package biz.paluch.clean.architecture.usecases.simple;

import javax.inject.Inject;

import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 07:34
 */
public class CreateOrUpdateUser {
    private UserRepository userRepository;

    public void createOrUpdateUser(String userName) {

        User user = userRepository.find(userName);
        if (user == null) {
            user = new User(userName);
            userRepository.store(user);
        }
    }

    @Inject
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ListOrders.java
================================================
package biz.paluch.clean.architecture.usecases.simple;

import java.util.List;

import javax.inject.Inject;

import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:22
 */
public class ListOrders {
    private OrderRepository orderRepository;

    public List<Order> listOrders() {
        return orderRepository.findOrders();
    }

    @Inject
    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }
}


================================================
FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ValidateOrder.java
================================================
package biz.paluch.clean.architecture.usecases.simple;

import java.util.List;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.applicationmodel.NotFoundException;
import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:49
 */
public class ValidateOrder {
    private ItemRepository itemRepository;
    private UserRepository userRepository;

    private ValidateOrder(ItemRepository itemRepository, UserRepository userRepository) {
        this.itemRepository = itemRepository;
        this.userRepository = userRepository;
    }

    public static ValidateOrder newInstance(ItemRepository itemRepository, UserRepository userRepository) {
        return new ValidateOrder(itemRepository, userRepository);
    }

    public void validate(List<String> items, String userName) {
        validateItems(items);
        validateUser(userName);
    }

    private void validateUser(String userName) {
        User user = userRepository.find(userName);
        if (user == null) {
            throw new NotFoundException("User " + userName + " not found");
        }
    }

    private void validateItems(List<String> items) {
        for (String item : items) {
            validateItem(item);

        }
    }

    private void validateItem(String item) {
        Item itemInCatalog = itemRepository.find(item);
        if (itemInCatalog == null) {
            throw new NotFoundException("Item " + item + " not found");
        }
    }
}


================================================
FILE: use-cases/src/main/resources/META-INF/beans.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- This file can be an empty text file (0 bytes) -->
<!-- We're declaring the schema to save you time if you do have to configure 
    this in the future -->
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>


================================================
FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/CreateOrUpdateUserTest.java
================================================
package biz.paluch.clean.architecture.usecases;

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;

import biz.paluch.clean.architecture.usecases.simple.CreateOrUpdateUser;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 07:36
 */
@RunWith(MockitoJUnitRunner.class)
public class CreateOrUpdateUserTest {

    public static final String USER_NAME = "mark";
    private CreateOrUpdateUser sut = new CreateOrUpdateUser();

    @Mock
    private UserRepository userRepository;

    @Before
    public void before() throws Exception {
        sut.setUserRepository(userRepository);
    }

    @Test
    public void testCreateOrUpdateUser() throws Exception {
        sut.createOrUpdateUser(USER_NAME);

        verify(userRepository).store(any(User.class));
    }
}


================================================
FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/ListOrdersTest.java
================================================
package biz.paluch.clean.architecture.usecases;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import java.util.Arrays;
import java.util.List;

import biz.paluch.clean.architecture.usecases.simple.ListOrders;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 02.08.13 11:13
 */
@RunWith(MockitoJUnitRunner.class)
public class ListOrdersTest {

    private ListOrders sut = new ListOrders();

    @Mock
    private OrderRepository orderRepository;

    @Before
    public void before() throws Exception {
        sut.setOrderRepository(orderRepository);

    }

    @Test
    public void testListOrders() throws Exception {
        when(orderRepository.findOrders()).thenReturn(Arrays.asList(new Order()));

        List<Order> result = sut.listOrders();
        assertEquals(1, result.size());

    }
}


================================================
FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/PlaceOrderImplTest.java
================================================
package biz.paluch.clean.architecture.usecases;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import biz.paluch.clean.architecture.applicationmodel.Item;
import biz.paluch.clean.architecture.applicationmodel.NotFoundException;
import biz.paluch.clean.architecture.applicationmodel.Order;
import biz.paluch.clean.architecture.applicationmodel.User;
import biz.paluch.clean.architecture.commons.StaticDateProvider;
import biz.paluch.clean.architecture.contracts.repositories.ItemRepository;
import biz.paluch.clean.architecture.contracts.repositories.OrderRepository;
import biz.paluch.clean.architecture.contracts.repositories.UserRepository;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderOutput;
import biz.paluch.clean.architecture.contracts.usecases.PlaceOrderRequest;
import biz.paluch.clean.architecture.usecases.advanced.PlaceOrderImpl;

/**
 * @author <a href="mailto:mpaluch@paluch.biz">Mark Paluch</a>
 * @since 01.08.13 07:31
 */
@RunWith(MockitoJUnitRunner.class)
public class PlaceOrderImplTest {
    public static final String ITEM_NAME_SCISSORS = "Scissors";
    public static final String ITEM_NAME_PAPER = "Paper";
    public static final String ITEM_NAME_GLUE = "Glue";
    public static final String USER_NAME_MARK = "mark";

    private PlaceOrderImpl sut = new PlaceOrderImpl();

    @Mock
    private OrderRepository orderRepository;

    @Mock
    private ItemRepository itemRepository;

    @Mock
    private UserRepository userRepository;

    @Mock
    private PlaceOrderOutput orderOutput;

    private PlaceOrderRequest request = new PlaceOrderRequest();

    @Before
    public void setUp() throws Exception {
        sut.setItemRepository(itemRepository);
        sut.setOrderRepository(orderRepository);
        sut.setUserRepository(userRepository);
    }

    @Test
    public void testPlaceOrder() throws Exception {
        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);

        mockItemRepository();
        mockUserRepository();
        mockOrderRepository();

        request.items = items;
        request.userName = USER_NAME_MARK;

        sut.placeOrder(request, orderOutput);

        verify(orderOutput).onResponse("mark-42");
    }

    @Test
    public void testPlaceOrderAndVerify() throws Exception {
        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);

        mockItemRepository();
        mockUserRepository();
        mockOrderRepository();

        Date orderDate = new Date(42424242L);
        StaticDateProvider.initialize(orderDate);

        request.items = items;
        request.userName = USER_NAME_MARK;

        sut.placeOrder(request, orderOutput);

        ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class);
        verify(orderRepository).persist(captor.capture());

        Order theOrder = captor.getValue();

        assertEquals(orderDate, theOrder.getOrderDate());
        assertEquals(USER_NAME_MARK, theOrder.getCreatedBy().getUserName());
        assertEquals(items.size(), theOrder.getItems().size());

        verify(orderOutput).onResponse("mark-42");

    }

    private void mockOrderRepository() {
        when(orderRepository.getNextOrderId()).thenReturn(42);
    }

    private void mockUserRepository() {
        when(userRepository.find(USER_NAME_MARK)).thenReturn(new User(USER_NAME_MARK));
    }

    private void mockItemRepository() {
        when(itemRepository.find(ITEM_NAME_SCISSORS)).thenReturn(new Item());
        when(itemRepository.find(ITEM_NAME_PAPER)).thenReturn(new Item());
        when(itemRepository.find(ITEM_NAME_GLUE)).thenReturn(new Item());
    }

    @Test(expected = NotFoundException.class)
    public void testPlaceOrderItemNotFound() throws Exception {
        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);

        request.items = items;
        request.userName = USER_NAME_MARK;
        sut.placeOrder(request, orderOutput);

    }

    @Test(expected = NotFoundException.class)
    public void testPlaceOrderUserNotFound() throws Exception {
        List<String> items = Arrays.asList(ITEM_NAME_SCISSORS, ITEM_NAME_PAPER, ITEM_NAME_GLUE);
        mockItemRepository();

        request.items = items;
        request.userName = USER_NAME_MARK;

        sut.placeOrder(request, orderOutput);

    }
}
Download .txt
gitextract_5gr77y1v/

├── .gitignore
├── README.md
├── application-model/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── applicationmodel/
│                                   ├── AbstractModel.java
│                                   ├── Item.java
│                                   ├── NotFoundException.java
│                                   ├── Order.java
│                                   ├── OrderItem.java
│                                   └── User.java
├── commons/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── commons/
│                                   ├── DateProvider.java
│                                   └── StaticDateProvider.java
├── contracts/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── biz/
│                   └── paluch/
│                       └── clean/
│                           └── architecture/
│                               └── contracts/
│                                   ├── repositories/
│                                   │   ├── ItemRepository.java
│                                   │   ├── OrderRepository.java
│                                   │   └── UserRepository.java
│                                   └── usecases/
│                                       ├── CreateOrUpdateItem.java
│                                       ├── ListItems.java
│                                       ├── ListItemsOutput.java
│                                       ├── PlaceOrder.java
│                                       ├── PlaceOrderOutput.java
│                                       └── PlaceOrderRequest.java
├── delivery/
│   └── web/
│       ├── pom.xml
│       └── src/
│           └── main/
│               ├── java/
│               │   └── biz/
│               │       └── paluch/
│               │           └── clean/
│               │               └── architecture/
│               │                   ├── di_example/
│               │                   │   └── PlaceOrderWithDependencies.java
│               │                   ├── facade/
│               │                   │   ├── ItemService.java
│               │                   │   └── OrderService.java
│               │                   ├── frontend/
│               │                   │   ├── jsf/
│               │                   │   │   ├── ItemController.java
│               │                   │   │   ├── ItemModel.java
│               │                   │   │   ├── OrderController.java
│               │                   │   │   ├── OrderItem.java
│               │                   │   │   └── OrderModel.java
│               │                   │   └── rest/
│               │                   │       ├── ItemResource.java
│               │                   │       ├── ItemsRepresentation.java
│               │                   │       ├── JaxRsActivator.java
│               │                   │       ├── OrderResource.java
│               │                   │       └── OrdersRepresentation.java
│               │                   └── util/
│               │                       └── Resources.java
│               ├── resources/
│               │   └── META-INF/
│               │       └── persistence.xml
│               └── webapp/
│                   ├── WEB-INF/
│                   │   ├── beans.xml
│                   │   ├── clean-architecture-ds.xml
│                   │   ├── faces-config.xml
│                   │   └── web.xml
│                   ├── index.xhtml
│                   ├── items.xhtml
│                   └── resources/
│                       └── css/
│                           └── screen.css
├── external/
│   └── jpa-repository/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   └── biz/
│           │   │       └── paluch/
│           │   │           └── clean/
│           │   │               └── architecture/
│           │   │                   └── external/
│           │   │                       └── jpa/
│           │   │                           ├── entity/
│           │   │                           │   ├── ItemEntity.java
│           │   │                           │   ├── OrderEntity.java
│           │   │                           │   ├── OrderItemEntity.java
│           │   │                           │   └── UserEntity.java
│           │   │                           └── repository/
│           │   │                               ├── JpaItemRepository.java
│           │   │                               ├── JpaOrderRepository.java
│           │   │                               └── JpaUserRepository.java
│           │   └── resources/
│           │       └── META-INF/
│           │           └── beans.xml
│           └── test/
│               ├── java/
│               │   └── biz/
│               │       └── paluch/
│               │           └── clean/
│               │               └── architecture/
│               │                   └── external/
│               │                       └── jpa/
│               │                           ├── AbstractJpaTest.java
│               │                           └── JpaOrderRepositoryTest.java
│               └── resources/
│                   └── META-INF/
│                       └── persistence.xml
├── pom.xml
└── use-cases/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── biz/
        │   │       └── paluch/
        │   │           └── clean/
        │   │               └── architecture/
        │   │                   └── usecases/
        │   │                       ├── advanced/
        │   │                       │   ├── CreateOrUpdateItemImpl.java
        │   │                       │   ├── ListItemsImpl.java
        │   │                       │   └── PlaceOrderImpl.java
        │   │                       └── simple/
        │   │                           ├── CreateOrUpdateUser.java
        │   │                           ├── ListOrders.java
        │   │                           └── ValidateOrder.java
        │   └── resources/
        │       └── META-INF/
        │           └── beans.xml
        └── test/
            └── java/
                └── biz/
                    └── paluch/
                        └── clean/
                            └── architecture/
                                └── usecases/
                                    ├── CreateOrUpdateUserTest.java
                                    ├── ListOrdersTest.java
                                    └── PlaceOrderImplTest.java
Download .txt
SYMBOL INDEX (214 symbols across 49 files)

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/AbstractModel.java
  class AbstractModel (line 14) | public abstract class AbstractModel implements Serializable {
    method hashCode (line 16) | @Override
    method equals (line 21) | @Override
    method toString (line 26) | @Override

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Item.java
  class Item (line 7) | public class Item extends AbstractModel {
    method getItem (line 10) | public String getItem() {
    method setItem (line 14) | public void setItem(String item) {

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/NotFoundException.java
  class NotFoundException (line 7) | public class NotFoundException extends RuntimeException
    method NotFoundException (line 9) | public NotFoundException(String message)

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Order.java
  class Order (line 11) | public class Order extends AbstractModel {
    method getOrderId (line 18) | public String getOrderId() {
    method setOrderId (line 22) | public void setOrderId(String orderId) {
    method getOrderDate (line 26) | public Date getOrderDate() {
    method setOrderDate (line 30) | public void setOrderDate(Date orderDate) {
    method getItems (line 34) | public List<OrderItem> getItems() {
    method getCreatedBy (line 38) | public User getCreatedBy() {
    method setCreatedBy (line 42) | public void setCreatedBy(User createdBy) {

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/OrderItem.java
  class OrderItem (line 7) | public class OrderItem extends AbstractModel {
    method OrderItem (line 10) | public OrderItem() {
    method OrderItem (line 13) | public OrderItem(String orderItem) {
    method getOrderItem (line 17) | public String getOrderItem() {
    method setOrderItem (line 21) | public void setOrderItem(String orderItem) {

FILE: application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/User.java
  class User (line 7) | public class User extends AbstractModel {
    method User (line 10) | public User() {
    method User (line 13) | public User(String userName) {
    method getUserName (line 17) | public String getUserName() {
    method setUserName (line 21) | public void setUserName(String userName) {

FILE: commons/src/main/java/biz/paluch/clean/architecture/commons/DateProvider.java
  class DateProvider (line 9) | public class DateProvider {
    method get (line 12) | public static Date get() {
    method getCurrentDate (line 16) | public Date getCurrentDate() {
    method setDateProvider (line 20) | public static void setDateProvider(DateProvider dateProvider) {

FILE: commons/src/main/java/biz/paluch/clean/architecture/commons/StaticDateProvider.java
  class StaticDateProvider (line 9) | public class StaticDateProvider extends DateProvider {
    method initialize (line 13) | public static void initialize(Date currentDate) {
    method getCurrentDate (line 19) | @Override
    method setCurrentDate (line 24) | public void setCurrentDate(Date currentDate) {

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/ItemRepository.java
  type ItemRepository (line 11) | public interface ItemRepository {
    method find (line 13) | Item find(String item);
    method findAll (line 15) | List<Item> findAll();
    method persist (line 17) | void persist(Item item);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/OrderRepository.java
  type OrderRepository (line 11) | public interface OrderRepository {
    method getNextOrderId (line 12) | int getNextOrderId();
    method persist (line 14) | void persist(Order order);
    method findOrders (line 16) | List<Order> findOrders();

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/UserRepository.java
  type UserRepository (line 9) | public interface UserRepository {
    method find (line 10) | User find(String userName);
    method store (line 12) | void store(User user);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/CreateOrUpdateItem.java
  type CreateOrUpdateItem (line 10) | public interface CreateOrUpdateItem {
    method createOrUpdateItem (line 17) | void createOrUpdateItem(String item);
    method setItemRepository (line 24) | void setItemRepository(ItemRepository itemRepository);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItems.java
  type ListItems (line 10) | public interface ListItems {
    method listItems (line 17) | void listItems(ListItemsOutput listItemsOutput);
    method setItemRepository (line 24) | void setItemRepository(ItemRepository itemRepository);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItemsOutput.java
  type ListItemsOutput (line 10) | public interface ListItemsOutput {
    method onResponse (line 12) | void onResponse(List<Item> items);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrder.java
  type PlaceOrder (line 11) | public interface PlaceOrder {
    method placeOrder (line 19) | void placeOrder(PlaceOrderRequest request, PlaceOrderOutput output) th...

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderOutput.java
  type PlaceOrderOutput (line 6) | public interface PlaceOrderOutput {
    method onResponse (line 7) | void onResponse(String orderId);

FILE: contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderRequest.java
  class PlaceOrderRequest (line 8) | public class PlaceOrderRequest {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/di_example/PlaceOrderWithDependencies.java
  class PlaceOrderWithDependencies (line 15) | public class PlaceOrderWithDependencies extends PlaceOrderImpl {
    method setOrderRepository (line 17) | @Inject
    method setItemRepository (line 23) | @Inject
    method setUserRepository (line 29) | @Inject

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/facade/ItemService.java
  class ItemService (line 20) | @Stateless
    method postConstruct (line 35) | @PostConstruct
    method listItems (line 48) | public List<Item> listItems() {
    method createOrUpdateItem (line 67) | public void createOrUpdateItem(String item) {
    method find (line 71) | public Item find(String itemId) {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/facade/OrderService.java
  class OrderService (line 23) | @Stateless
    method listOrders (line 44) | public List<Order> listOrders() {
    method placeOrder (line 48) | public String placeOrder(List<String> items, String userName) throws N...
    class PlaceOrderResponse (line 62) | private static class PlaceOrderResponse implements PlaceOrderOutput {
      method onResponse (line 65) | @Override

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemController.java
  class ItemController (line 19) | @RequestScoped
    method getItems (line 28) | public List<SelectItem> getItems() {
    method createOrUpdateItem (line 40) | public void createOrUpdateItem() {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemModel.java
  class ItemModel (line 11) | @Model
    method getItem (line 16) | public String getItem()
    method setItem (line 21) | public void setItem(String item)

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderController.java
  class OrderController (line 19) | @RequestScoped
    method addItem (line 28) | public void addItem() {
    method removeItem (line 37) | public void removeItem(OrderItem item) {
    method createOrder (line 41) | public void createOrder() {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderItem.java
  class OrderItem (line 9) | public class OrderItem implements Serializable
    method getItem (line 13) | public String getItem()
    method setItem (line 18) | public void setItem(String item)

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderModel.java
  class OrderModel (line 14) | @Model
    method getSelectedItem (line 22) | public String getSelectedItem()
    method setSelectedItem (line 27) | public void setSelectedItem(String selectedItem)
    method getUserName (line 32) | public String getUserName()
    method setUserName (line 37) | public void setUserName(String userName)
    method getOrderItems (line 42) | public List<OrderItem> getOrderItems()
    method setOrderItems (line 47) | public void setOrderItems(List<OrderItem> orderItems)

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemResource.java
  class ItemResource (line 14) | @Path("/items")
    method list (line 21) | @GET
    method get (line 29) | @GET
    method createOrUpdate (line 41) | @PUT

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemsRepresentation.java
  class ItemsRepresentation (line 14) | @XmlRootElement
    method getItems (line 18) | public List<Item> getItems() {
    method setItems (line 22) | public void setItems(List<Item> items) {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/JaxRsActivator.java
  class JaxRsActivator (line 30) | @ApplicationPath("/rest")

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrderResource.java
  class OrderResource (line 12) | @Path("/orders")
    method list (line 19) | @GET

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrdersRepresentation.java
  class OrdersRepresentation (line 14) | @XmlRootElement
    method getOrders (line 18) | public List<Order> getOrders() {
    method setOrders (line 22) | public void setOrders(List<Order> orders) {

FILE: delivery/web/src/main/java/biz/paluch/clean/architecture/util/Resources.java
  class Resources (line 40) | public class Resources {
    method produceLog (line 47) | @Produces
    method produceFacesContext (line 52) | @Produces

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/ItemEntity.java
  class ItemEntity (line 9) | @Entity
    method getId (line 25) | public Long getId() {
    method setId (line 29) | public void setId(Long id) {
    method getItem (line 33) | public String getItem() {
    method setItem (line 37) | public void setItem(String item) {

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderEntity.java
  class OrderEntity (line 13) | @Entity
    method getId (line 38) | public Long getId() {
    method setId (line 42) | public void setId(Long id) {
    method getOrderId (line 46) | public String getOrderId() {
    method setOrderId (line 50) | public void setOrderId(String orderId) {
    method getOrderDate (line 54) | public Date getOrderDate() {
    method setOrderDate (line 58) | public void setOrderDate(Date orderDate) {
    method getCreatedBy (line 62) | public UserEntity getCreatedBy() {
    method setCreatedBy (line 66) | public void setCreatedBy(UserEntity createdBy) {
    method getItems (line 70) | public List<OrderItemEntity> getItems() {
    method setItems (line 74) | public void setItems(List<OrderItemEntity> items) {

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderItemEntity.java
  class OrderItemEntity (line 9) | @Entity
    method getId (line 23) | public Long getId() {
    method setId (line 27) | public void setId(Long id) {
    method getOrder (line 31) | public OrderEntity getOrder() {
    method setOrder (line 35) | public void setOrder(OrderEntity order) {
    method getOrderItem (line 39) | public String getOrderItem() {
    method setOrderItem (line 43) | public void setOrderItem(String orderItem) {

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/UserEntity.java
  class UserEntity (line 9) | @Entity
    method UserEntity (line 21) | public UserEntity() {
    method getId (line 24) | public Long getId() {
    method setId (line 28) | public void setId(Long id) {
    method getUserName (line 32) | public String getUserName() {
    method setUserName (line 36) | public void setUserName(String userName) {
    method toString (line 40) | @Override

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaItemRepository.java
  class JpaItemRepository (line 17) | public class JpaItemRepository implements ItemRepository {
    method find (line 21) | @Override
    method toItem (line 35) | private Item toItem(ItemEntity itemEntity) {
    method persist (line 42) | @Override
    method findAll (line 50) | @Override
    method setEntityManager (line 61) | public void setEntityManager(EntityManager entityManager) {

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaOrderRepository.java
  class JpaOrderRepository (line 22) | @ApplicationScoped
    method getNextOrderId (line 27) | @Override
    method persist (line 36) | @Override
    method getUser (line 56) | private UserEntity getUser(String userName) {
    method deleteAll (line 61) | public void deleteAll() {
    method find (line 65) | public Order find(String orderId) {
    method toOrder (line 77) | private Order toOrder(OrderEntity orderEntity) {
    method findOrders (line 90) | @Override
    method setEntityManager (line 102) | public void setEntityManager(EntityManager entityManager) {

FILE: external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaUserRepository.java
  class JpaUserRepository (line 16) | public class JpaUserRepository implements UserRepository {
    method find (line 20) | @Override
    method store (line 35) | @Override
    method setEntityManager (line 42) | public void setEntityManager(EntityManager entityManager) {

FILE: external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/AbstractJpaTest.java
  class AbstractJpaTest (line 22) | public abstract class AbstractJpaTest {
    method beforeClass (line 27) | @BeforeClass
    method afterClass (line 34) | @AfterClass
    method before (line 40) | @Before
    method after (line 47) | @After
    method getH2Properties (line 54) | public static Map<String, String> getH2Properties() {

FILE: external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/JpaOrderRepositoryTest.java
  class JpaOrderRepositoryTest (line 20) | public class JpaOrderRepositoryTest extends AbstractJpaTest {
    method before (line 24) | @Override
    method testGetNextOrderId (line 31) | @Test
    method testPersistAndFind (line 37) | @Test
    method mockOrder (line 48) | private Order mockOrder() {
    method testFind (line 60) | @Test
    method testFindOrders (line 73) | @Test
    method createOrder (line 83) | private void createOrder(Order order) {

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/CreateOrUpdateItemImpl.java
  class CreateOrUpdateItemImpl (line 16) | public class CreateOrUpdateItemImpl implements CreateOrUpdateItem {
    method createOrUpdateItem (line 20) | public void createOrUpdateItem(String item) {
    method setItemRepository (line 30) | public void setItemRepository(ItemRepository itemRepository) {

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/ListItemsImpl.java
  class ListItemsImpl (line 16) | public class ListItemsImpl implements ListItems {
    method listItems (line 19) | @Override
    method setItemRepository (line 24) | @Override

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/PlaceOrderImpl.java
  class PlaceOrderImpl (line 21) | public class PlaceOrderImpl implements PlaceOrder {
    method placeOrder (line 32) | @Override
    method createOrderId (line 46) | private String createOrderId(String userName) {
    method constructOrder (line 51) | private Order constructOrder(String orderId, List<String> items, Strin...
    method storeOrder (line 66) | private void storeOrder(Order order) {
    method setOrderRepository (line 70) | public void setOrderRepository(OrderRepository orderRepository) {
    method setItemRepository (line 74) | public void setItemRepository(ItemRepository itemRepository) {
    method setUserRepository (line 78) | public void setUserRepository(UserRepository userRepository) {

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/CreateOrUpdateUser.java
  class CreateOrUpdateUser (line 12) | public class CreateOrUpdateUser {
    method createOrUpdateUser (line 15) | public void createOrUpdateUser(String userName) {
    method setUserRepository (line 24) | @Inject

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ListOrders.java
  class ListOrders (line 14) | public class ListOrders {
    method listOrders (line 17) | public List<Order> listOrders() {
    method setOrderRepository (line 21) | @Inject

FILE: use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ValidateOrder.java
  class ValidateOrder (line 15) | public class ValidateOrder {
    method ValidateOrder (line 19) | private ValidateOrder(ItemRepository itemRepository, UserRepository us...
    method newInstance (line 24) | public static ValidateOrder newInstance(ItemRepository itemRepository,...
    method validate (line 28) | public void validate(List<String> items, String userName) {
    method validateUser (line 33) | private void validateUser(String userName) {
    method validateItems (line 40) | private void validateItems(List<String> items) {
    method validateItem (line 47) | private void validateItem(String item) {

FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/CreateOrUpdateUserTest.java
  class CreateOrUpdateUserTest (line 20) | @RunWith(MockitoJUnitRunner.class)
    method before (line 29) | @Before
    method testCreateOrUpdateUser (line 34) | @Test

FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/ListOrdersTest.java
  class ListOrdersTest (line 23) | @RunWith(MockitoJUnitRunner.class)
    method before (line 31) | @Before
    method testListOrders (line 37) | @Test

FILE: use-cases/src/test/java/biz/paluch/clean/architecture/usecases/PlaceOrderImplTest.java
  class PlaceOrderImplTest (line 33) | @RunWith(MockitoJUnitRunner.class)
    method setUp (line 56) | @Before
    method testPlaceOrder (line 63) | @Test
    method testPlaceOrderAndVerify (line 79) | @Test
    method mockOrderRepository (line 108) | private void mockOrderRepository() {
    method mockUserRepository (line 112) | private void mockUserRepository() {
    method mockItemRepository (line 116) | private void mockItemRepository() {
    method testPlaceOrderItemNotFound (line 122) | @Test(expected = NotFoundException.class)
    method testPlaceOrderUserNotFound (line 132) | @Test(expected = NotFoundException.class)
Condensed preview — 69 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (107K chars).
[
  {
    "path": ".gitignore",
    "chars": 45,
    "preview": ".idea/\ntarget\n*.iml\natlassian-ide-plugin.xml\n"
  },
  {
    "path": "README.md",
    "chars": 4376,
    "preview": "Sampler for Clean Architecture/Onion-Architecture [![Build Status](https://snap-ci.com/mp911de/CleanArchitecture/branch/"
  },
  {
    "path": "application-model/pom.xml",
    "chars": 710,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/AbstractModel.java",
    "chars": 864,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\nimport java.io.Serializable;\n\nimport org.apache.commons.lang3.b"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Item.java",
    "chars": 352,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch<"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/NotFoundException.java",
    "chars": 294,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch<"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/Order.java",
    "chars": 942,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java."
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/OrderItem.java",
    "chars": 508,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch<"
  },
  {
    "path": "application-model/src/main/java/biz/paluch/clean/architecture/applicationmodel/User.java",
    "chars": 483,
    "preview": "package biz.paluch.clean.architecture.applicationmodel;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluch<"
  },
  {
    "path": "commons/pom.xml",
    "chars": 516,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "commons/src/main/java/biz/paluch/clean/architecture/commons/DateProvider.java",
    "chars": 543,
    "preview": "package biz.paluch.clean.architecture.commons;\n\nimport java.util.Date;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.bi"
  },
  {
    "path": "commons/src/main/java/biz/paluch/clean/architecture/commons/StaticDateProvider.java",
    "chars": 657,
    "preview": "package biz.paluch.clean.architecture.commons;\n\nimport java.util.Date;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.bi"
  },
  {
    "path": "contracts/pom.xml",
    "chars": 717,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/ItemRepository.java",
    "chars": 366,
    "preview": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architect"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/OrderRepository.java",
    "chars": 371,
    "preview": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architect"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/repositories/UserRepository.java",
    "chars": 316,
    "preview": "package biz.paluch.clean.architecture.contracts.repositories;\n\nimport biz.paluch.clean.architecture.applicationmodel.Use"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/CreateOrUpdateItem.java",
    "chars": 587,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.contracts.repositories.I"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItems.java",
    "chars": 615,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.contracts.repositories.I"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/ListItemsOutput.java",
    "chars": 292,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture."
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrder.java",
    "chars": 665,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport biz.paluch.clean.architecture.applicationmodel.NotFoun"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderOutput.java",
    "chars": 205,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\n/**\n * @author <a href=\"mailto:mpaluch@paluch.biz\">Mark Paluc"
  },
  {
    "path": "contracts/src/main/java/biz/paluch/clean/architecture/contracts/usecases/PlaceOrderRequest.java",
    "chars": 250,
    "preview": "package biz.paluch.clean.architecture.contracts.usecases;\n\nimport java.util.List;\n\n/**\n * @author <a href=\"mailto:mpaluc"
  },
  {
    "path": "delivery/web/pom.xml",
    "chars": 6353,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/di_example/PlaceOrderWithDependencies.java",
    "chars": 1100,
    "preview": "package biz.paluch.clean.architecture.di_example;\n\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architecture.con"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/facade/ItemService.java",
    "chars": 2096,
    "preview": "package biz.paluch.clean.architecture.facade;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.annotati"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/facade/OrderService.java",
    "chars": 2086,
    "preview": "package biz.paluch.clean.architecture.facade;\n\nimport java.util.List;\n\nimport javax.ejb.Stateless;\nimport javax.inject.I"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemController.java",
    "chars": 1125,
    "preview": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.ej"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/ItemModel.java",
    "chars": 439,
    "preview": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\n\nimport javax.enterprise.inject.Model;"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderController.java",
    "chars": 1622,
    "preview": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.ej"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderItem.java",
    "chars": 393,
    "preview": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\n\n/**\n * @author <a href=\"mailto:mpaluc"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/jsf/OrderModel.java",
    "chars": 1052,
    "preview": "package biz.paluch.clean.architecture.frontend.jsf;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport jav"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemResource.java",
    "chars": 1347,
    "preview": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScope"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/ItemsRepresentation.java",
    "chars": 560,
    "preview": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.x"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/JaxRsActivator.java",
    "chars": 1320,
    "preview": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * "
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrderResource.java",
    "chars": 649,
    "preview": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport javax.ejb.EJB;\nimport javax.enterprise.context.RequestScope"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/frontend/rest/OrdersRepresentation.java",
    "chars": 572,
    "preview": "package biz.paluch.clean.architecture.frontend.rest;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.x"
  },
  {
    "path": "delivery/web/src/main/java/biz/paluch/clean/architecture/util/Resources.java",
    "chars": 1923,
    "preview": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * "
  },
  {
    "path": "delivery/web/src/main/resources/META-INF/persistence.xml",
    "chars": 1275,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<persistence version=\"2.0\"\n             xmlns=\"http://java.sun.com/xml/ns/persist"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/beans.xml",
    "chars": 437,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the s"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/clean-architecture-ds.xml",
    "chars": 1022,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This is an unmanaged datasource. It should be used for proofs of concept \n  "
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/faces-config.xml",
    "chars": 583,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file is not required if you don't need any extra configuration. -->\n<fa"
  },
  {
    "path": "delivery/web/src/main/webapp/WEB-INF/web.xml",
    "chars": 769,
    "preview": "<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\"\n         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n      "
  },
  {
    "path": "delivery/web/src/main/webapp/index.xhtml",
    "chars": 2856,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:h=\"http://java.sun.com/jsf/html\"\n      xmlns:f=\"h"
  },
  {
    "path": "delivery/web/src/main/webapp/items.xhtml",
    "chars": 1264,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\n      xmlns:h=\"http://java.sun.com/jsf/html\"\n      xmlns:f=\"h"
  },
  {
    "path": "delivery/web/src/main/webapp/resources/css/screen.css",
    "chars": 4025,
    "preview": "/*\n * JBoss, Home of Professional Open Source\n * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual\n * "
  },
  {
    "path": "external/jpa-repository/pom.xml",
    "chars": 3993,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/ItemEntity.java",
    "chars": 994,
    "preview": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderEntity.java",
    "chars": 1969,
    "preview": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport java.util.ArrayList;\nimport java.util.Date;\nimport ja"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/OrderItemEntity.java",
    "chars": 901,
    "preview": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/entity/UserEntity.java",
    "chars": 1207,
    "preview": "package biz.paluch.clean.architecture.external.jpa.entity;\n\nimport javax.persistence.*;\n\n/**\n * @author <a href=\"mailto:"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaItemRepository.java",
    "chars": 1805,
    "preview": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimpo"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaOrderRepository.java",
    "chars": 3608,
    "preview": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimpo"
  },
  {
    "path": "external/jpa-repository/src/main/java/biz/paluch/clean/architecture/external/jpa/repository/JpaUserRepository.java",
    "chars": 1365,
    "preview": "package biz.paluch.clean.architecture.external.jpa.repository;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\nimpo"
  },
  {
    "path": "external/jpa-repository/src/main/resources/META-INF/beans.xml",
    "chars": 440,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the s"
  },
  {
    "path": "external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/AbstractJpaTest.java",
    "chars": 1860,
    "preview": "package biz.paluch.clean.architecture.external.jpa;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.persi"
  },
  {
    "path": "external/jpa-repository/src/test/java/biz/paluch/clean/architecture/external/jpa/JpaOrderRepositoryTest.java",
    "chars": 2639,
    "preview": "package biz.paluch.clean.architecture.external.jpa;\n\nimport static org.junit.Assert.*;\n\nimport java.util.Date;\nimport ja"
  },
  {
    "path": "external/jpa-repository/src/test/resources/META-INF/persistence.xml",
    "chars": 1515,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<persistence version=\"2.0\"\n             xmlns=\"http://java.sun.com/xml/ns/persist"
  },
  {
    "path": "pom.xml",
    "chars": 6685,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "use-cases/pom.xml",
    "chars": 1550,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/CreateOrUpdateItemImpl.java",
    "chars": 1163,
    "preview": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport biz.paluch.clean.architecture.applicationmodel.Item;\nim"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/ListItemsImpl.java",
    "chars": 1035,
    "preview": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport biz.paluch.clean.architecture.contracts.repositories.It"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/advanced/PlaceOrderImpl.java",
    "chars": 2798,
    "preview": "package biz.paluch.clean.architecture.usecases.advanced;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.a"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/CreateOrUpdateUser.java",
    "chars": 759,
    "preview": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport javax.inject.Inject;\n\nimport biz.paluch.clean.architectur"
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ListOrders.java",
    "chars": 644,
    "preview": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport java.util.List;\n\nimport javax.inject.Inject;\n\nimport biz."
  },
  {
    "path": "use-cases/src/main/java/biz/paluch/clean/architecture/usecases/simple/ValidateOrder.java",
    "chars": 1729,
    "preview": "package biz.paluch.clean.architecture.usecases.simple;\n\nimport java.util.List;\n\nimport biz.paluch.clean.architecture.app"
  },
  {
    "path": "use-cases/src/main/resources/META-INF/beans.xml",
    "chars": 440,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- This file can be an empty text file (0 bytes) -->\n<!-- We're declaring the s"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/CreateOrUpdateUserTest.java",
    "chars": 1115,
    "preview": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.mockito.Matchers.any;\nimport static org.mockito.Mocki"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/ListOrdersTest.java",
    "chars": 1147,
    "preview": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.junit.Assert.*;\nimport static org.mockito.Mockito.*;\n"
  },
  {
    "path": "use-cases/src/test/java/biz/paluch/clean/architecture/usecases/PlaceOrderImplTest.java",
    "chars": 4670,
    "preview": "package biz.paluch.clean.architecture.usecases;\n\nimport static org.junit.Assert.*;\nimport static org.mockito.Mockito.*;\n"
  }
]

About this extraction

This page contains the full source code of the mp911de/CleanArchitecture GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 69 files (93.3 KB), approximately 25.5k tokens, and a symbol index with 214 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!