12 Commits

Author SHA1 Message Date
Tom Hombergs
7e8ea87312 Merge pull request #27 from pat-karakun/master
replace hardcoded package names with (unused) parameters
2022-10-13 16:28:42 +11:00
Tom Hombergs
919ae2de13 Merge pull request #34 from benjaminknauer/patch-1
Instanciate ValidatorFactory only once
2022-10-13 16:28:07 +11:00
Benjamin Knauer
13e604d083 Instanciate ValidatorFactory only once
fixes #33
2022-09-23 12:47:46 +02:00
CHE0LIP
83ecaa202b replace hardcoded package names with (unused) parameters; reduce redundancy 2021-04-09 10:50:46 +02:00
Tom Hombergs
f5a9be5077 remove period 2021-02-20 15:15:09 +11:00
Tom Hombergs
4806b68230 add book cover to README 2021-02-20 15:14:21 +11:00
Tom Hombergs
844ee6b55b change status badge to GitHub actions 2021-02-20 14:01:09 +11:00
Tom Hombergs
e8fce429e6 fix error in arch unit test 2021-02-20 13:50:55 +11:00
Tom Hombergs
31d89ab436 change zip command in hope to fix reports upload 2021-02-20 13:44:22 +11:00
Tom Hombergs
e6e9e848d8 refactor code to be easier to match with the code snippets in the book 2021-02-20 13:40:34 +11:00
Tom Hombergs
02256fa543 update Java version in README 2021-02-20 13:02:49 +11:00
Tom Hombergs
612a40bced create single-module version of the BuckPal codebase 2021-02-20 13:01:44 +11:00
66 changed files with 252 additions and 358 deletions

36
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: "Checkout sources"
uses: actions/checkout@v1
- name: "Setup Java"
uses: actions/setup-java@v1
with:
java-version: 14
- name: "Initialize Gradle dependencies cache"
uses: actions/cache@v2
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-caches-${{ hashFiles('**/build.gradle') }}
- name: "Run Gradle build"
run: chmod 755 gradlew && ./gradlew build
- name: "Zip build reports"
if: failure()
run: zip -r reports.zip build/reports
- uses: actions/upload-artifact@v1
name: "Upload build reports"
if: failure()
with:
name: reports
path: reports.zip

View File

@@ -1,17 +0,0 @@
before_install:
- chmod +x gradlew
- |
if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(.md)|^(LICENSE)'
then
echo "Not running CI since only docs were changed."
exit
fi
install: ./gradlew assemble
script: ./gradlew clean build --info
language: java
jdk:
- oraclejdk11

View File

@@ -1,6 +1,8 @@
# Example Implementation of a Hexagonal Architecture
[![Build Status](https://travis-ci.org/thombergs/buckpal.svg?branch=master)](https://travis-ci.org/thombergs/buckpal)
[![CI](https://github.com/thombergs/buckpal/actions/workflows/ci.yml/badge.svg)](https://github.com/thombergs/buckpal/actions/workflows/ci.yml)
[![Get Your Hands Dirty On Clean Architecture](https://reflectoring.io/assets/img/get-your-hands-dirty-260x336.png)](https://reflectoring.io/book)
This is the companion code to my eBook [Get Your Hands Dirty on Clean Architecture](https://leanpub.com/get-your-hands-dirty-on-clean-architecture).
@@ -13,5 +15,5 @@ It implements a domain-centric "Hexagonal" approach of a common web application
## Prerequisites
* JDK 8
* JDK 11
* this project uses Lombok, so enable annotation processing in your IDE

View File

@@ -1,26 +0,0 @@
dependencies {
implementation project(':common')
implementation project(':buckpal-application')
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit' // excluding junit 4
}
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
testImplementation 'de.adesso:junit-insights:1.1.0'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
testImplementation 'com.h2database:h2'
testImplementation project(':buckpal-testdata')
}
test {
useJUnitPlatform()
systemProperty 'de.adesso.junitinsights.enabled', 'true'
}

View File

@@ -1,6 +0,0 @@
package io.reflectoring.buckpal.adapter.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
interface AccountRepository extends JpaRepository<AccountJpaEntity, Long> {
}

View File

@@ -1,12 +0,0 @@
package io.reflectoring.buckpal.adapter.persistence;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}

View File

@@ -1,23 +0,0 @@
dependencies {
implementation project(':common')
implementation project(':buckpal-application')
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit' // excluding junit 4
}
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
testImplementation 'de.adesso:junit-insights:1.1.0'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
}
test {
useJUnitPlatform()
systemProperty 'de.adesso.junitinsights.enabled', 'true'
}

View File

@@ -1,2 +0,0 @@
Manifest-Version: 1.0

View File

@@ -1,7 +0,0 @@
package io.reflectoring.buckpal.adapter.web;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TestApplication {
}

View File

@@ -1,26 +0,0 @@
dependencies {
implementation project(':common')
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'javax.transaction:javax.transaction-api'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit' // excluding junit 4
}
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
testImplementation 'de.adesso:junit-insights:1.1.0'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
testImplementation project(':buckpal-testdata')
}
test {
useJUnitPlatform()
systemProperty 'de.adesso.junitinsights.enabled', 'true'
}

View File

@@ -1,10 +0,0 @@
package io.reflectoring.buckpal.application.port.in;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -1,39 +0,0 @@
package io.reflectoring.buckpal.application.port.in;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
import javax.validation.constraints.NotNull;
public interface SendMoneyUseCase {
boolean sendMoney(SendMoneyCommand command);
@Value
@EqualsAndHashCode(callSuper = false)
class SendMoneyCommand extends SelfValidating<SendMoneyCommand> {
@NotNull
private final AccountId sourceAccountId;
@NotNull
private final AccountId targetAccountId;
@NotNull
private final Money money;
public SendMoneyCommand(
AccountId sourceAccountId,
AccountId targetAccountId,
Money money) {
this.sourceAccountId = sourceAccountId;
this.targetAccountId = targetAccountId;
this.money = money;
this.validateSelf();
}
}
}

View File

@@ -1,11 +0,0 @@
package io.reflectoring.buckpal.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -1,9 +0,0 @@
package io.reflectoring.buckpal.application.port.out;
import io.reflectoring.buckpal.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -1,34 +0,0 @@
plugins {
id "org.springframework.boot" version "2.1.9.RELEASE"
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation project(':common')
implementation project(':buckpal-application')
implementation project(':adapters:buckpal-persistence')
implementation project(':adapters:buckpal-web')
implementation ('org.springframework.boot:spring-boot-starter-web')
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit' // excluding junit 4
}
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
testImplementation 'com.tngtech.archunit:archunit:0.9.3'
testImplementation 'de.adesso:junit-insights:1.1.0'
testImplementation 'com.h2database:h2'
}
test {
useJUnitPlatform()
systemProperty 'de.adesso.junitinsights.enabled', 'true'
}

View File

@@ -1,3 +0,0 @@
dependencies {
implementation project(':buckpal-application')
}

View File

@@ -1,29 +1,47 @@
plugins {
id "io.spring.dependency-management" version "1.0.8.RELEASE"
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
subprojects {
group = 'io.reflectoring.reviewapp'
version = '0.0.1-SNAPSHOT'
group = 'io.reflectoring.buckpal'
version = '0.0.1-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java-library'
apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java-library'
repositories {
jcenter()
repositories {
mavenCentral()
}
compileJava {
sourceCompatibility = 11
targetCompatibility = 11
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation ('org.springframework.boot:spring-boot-starter-web')
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit' // excluding junit 4
}
testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.0.1'
testImplementation 'org.mockito:mockito-junit-jupiter:2.23.0'
testImplementation 'com.tngtech.archunit:archunit:0.16.0'
testImplementation 'org.junit.platform:junit-platform-launcher:1.4.2'
testImplementation 'com.h2database:h2'
dependencyManagement {
imports {
mavenBom("org.springframework.boot:spring-boot-dependencies:2.1.9.RELEASE")
}
}
compileJava {
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
runtimeOnly 'com.h2database:h2'
}
test {
useJUnitPlatform()
}

View File

@@ -1,5 +0,0 @@
dependencies {
implementation 'org.springframework:spring-context'
implementation 'javax.validation:validation-api'
}

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -1,7 +0,0 @@
include 'common'
include 'buckpal-configuration'
include 'adapters:buckpal-web'
include 'adapters:buckpal-persistence'
include 'buckpal-application'
include 'buckpal-testdata'

View File

@@ -1,7 +1,7 @@
package io.reflectoring.buckpal;
import io.reflectoring.buckpal.application.service.MoneyTransferProperties;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.application.service.MoneyTransferProperties;
import io.reflectoring.buckpal.account.domain.Money;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

View File

@@ -1,10 +1,10 @@
package io.reflectoring.buckpal.adapter.web;
package io.reflectoring.buckpal.account.adapter.in.web;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.common.WebAdapter;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;

View File

@@ -1,14 +1,14 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.util.ArrayList;
import java.util.List;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.account.domain.Activity.ActivityId;
import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.account.domain.Money;
import org.springframework.stereotype.Component;
@Component

View File

@@ -1,18 +1,17 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.EntityNotFoundException;
import java.time.LocalDateTime;
import java.util.List;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.common.PersistenceAdapter;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@RequiredArgsConstructor
@PersistenceAdapter
@@ -20,7 +19,7 @@ class AccountPersistenceAdapter implements
LoadAccountPort,
UpdateAccountStatePort {
private final AccountRepository accountRepository;
private final SpringDataAccountRepository accountRepository;
private final ActivityRepository activityRepository;
private final AccountMapper accountMapper;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import javax.persistence.Column;
import javax.persistence.Entity;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.time.LocalDateTime;
import java.util.List;

View File

@@ -0,0 +1,6 @@
package io.reflectoring.buckpal.account.adapter.out.persistence;
import org.springframework.data.jpa.repository.JpaRepository;
interface SpringDataAccountRepository extends JpaRepository<AccountJpaEntity, Long> {
}

View File

@@ -0,0 +1,10 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
public interface GetAccountBalanceQuery {
Money getAccountBalance(AccountId accountId);
}

View File

@@ -0,0 +1,34 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
import lombok.EqualsAndHashCode;
import lombok.Value;
import javax.validation.constraints.NotNull;
@Value
@EqualsAndHashCode(callSuper = false)
public
class SendMoneyCommand extends SelfValidating<SendMoneyCommand> {
@NotNull
private final AccountId sourceAccountId;
@NotNull
private final AccountId targetAccountId;
@NotNull
private final Money money;
public SendMoneyCommand(
AccountId sourceAccountId,
AccountId targetAccountId,
Money money) {
this.sourceAccountId = sourceAccountId;
this.targetAccountId = targetAccountId;
this.money = money;
this.validateSelf();
}
}

View File

@@ -0,0 +1,11 @@
package io.reflectoring.buckpal.account.application.port.in;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import io.reflectoring.buckpal.common.SelfValidating;
public interface SendMoneyUseCase {
boolean sendMoney(SendMoneyCommand command);
}

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.port.out;
package io.reflectoring.buckpal.account.application.port.out;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.account.domain.Account;
public interface AccountLock {

View File

@@ -0,0 +1,11 @@
package io.reflectoring.buckpal.account.application.port.out;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
public interface LoadAccountPort {
Account loadAccount(AccountId accountId, LocalDateTime baselineDate);
}

View File

@@ -0,0 +1,9 @@
package io.reflectoring.buckpal.account.application.port.out;
import io.reflectoring.buckpal.account.domain.Account;
public interface UpdateAccountStatePort {
void updateActivities(Account account);
}

View File

@@ -1,11 +1,11 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.application.port.in.GetAccountBalanceQuery;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.application.port.in.GetAccountBalanceQuery;
import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Money;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -1,7 +1,7 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.springframework.stereotype.Component;
@Component

View File

@@ -1,12 +1,13 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.common.UseCase;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import lombok.RequiredArgsConstructor;
import javax.transaction.Transactional;

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Money;
public class ThresholdExceededException extends RuntimeException {

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime;
import java.util.Optional;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -7,7 +7,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import lombok.NonNull;
/**

View File

@@ -1,4 +1,4 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import java.math.BigInteger;

View File

@@ -10,9 +10,9 @@ import java.util.Set;
public abstract class SelfValidating<T> {
private Validator validator;
private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
public SelfValidating() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}

View File

@@ -9,13 +9,13 @@ class DependencyRuleTests {
@Test
void validateRegistrationContextArchitecture() {
HexagonalArchitecture.boundedContext("io.reflectoring.buckpal")
HexagonalArchitecture.boundedContext("io.reflectoring.buckpal.account")
.withDomainLayer("domain")
.withAdaptersLayer("adapter")
.incoming("web")
.outgoing("persistence")
.incoming("in.web")
.outgoing("out.persistence")
.and()
.withApplicationLayer("application")

View File

@@ -2,10 +2,10 @@ package io.reflectoring.buckpal;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

View File

@@ -1,9 +1,9 @@
package io.reflectoring.buckpal.adapter.web;
package io.reflectoring.buckpal.account.adapter.in.web;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyUseCase;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;

View File

@@ -1,11 +1,11 @@
package io.reflectoring.buckpal.adapter.persistence;
package io.reflectoring.buckpal.account.adapter.out.persistence;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql;
import static io.reflectoring.buckpal.common.AccountTestData.*;
import static io.reflectoring.buckpal.common.ActivityTestData.*;
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
@Import({AccountPersistenceAdapter.class, AccountMapper.class})

View File

@@ -1,6 +1,6 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.junit.jupiter.api.Test;
import static io.reflectoring.buckpal.common.AccountTestData.*;
import static io.reflectoring.buckpal.common.ActivityTestData.*;

View File

@@ -1,8 +1,8 @@
package io.reflectoring.buckpal.domain;
package io.reflectoring.buckpal.account.domain;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import static io.reflectoring.buckpal.common.ActivityTestData.*;

View File

@@ -1,12 +1,12 @@
package io.reflectoring.buckpal.application.service;
package io.reflectoring.buckpal.account.application.service;
import io.reflectoring.buckpal.application.port.in.SendMoneyUseCase.SendMoneyCommand;
import io.reflectoring.buckpal.application.port.out.AccountLock;
import io.reflectoring.buckpal.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.application.port.in.SendMoneyCommand;
import io.reflectoring.buckpal.account.application.port.out.AccountLock;
import io.reflectoring.buckpal.account.application.port.out.LoadAccountPort;
import io.reflectoring.buckpal.account.application.port.out.UpdateAccountStatePort;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Money;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;

View File

@@ -23,10 +23,10 @@ abstract class ArchitectureElement {
static void denyDependency(String fromPackageName, String toPackageName, JavaClasses classes) {
noClasses()
.that()
.resideInAPackage("io.reflectoring.reviewapp.domain..")
.resideInAPackage(matchAllClassesInPackage(fromPackageName))
.should()
.dependOnClassesThat()
.resideInAnyPackage("io.reflectoring.reviewapp.application..")
.resideInAnyPackage(matchAllClassesInPackage(toPackageName))
.check(classes);
}
@@ -34,13 +34,7 @@ abstract class ArchitectureElement {
List<String> fromPackages, List<String> toPackages, JavaClasses classes) {
for (String fromPackage : fromPackages) {
for (String toPackage : toPackages) {
noClasses()
.that()
.resideInAPackage(matchAllClassesInPackage(fromPackage))
.should()
.dependOnClassesThat()
.resideInAnyPackage(matchAllClassesInPackage(toPackage))
.check(classes);
denyDependency(fromPackage, toPackage, classes);
}
}
}

View File

@@ -1,9 +1,9 @@
package io.reflectoring.buckpal.common;
import io.reflectoring.buckpal.domain.Account;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.ActivityWindow;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Account;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.ActivityWindow;
import io.reflectoring.buckpal.account.domain.Money;
public class AccountTestData {

View File

@@ -2,10 +2,10 @@ package io.reflectoring.buckpal.common;
import java.time.LocalDateTime;
import io.reflectoring.buckpal.domain.Account.AccountId;
import io.reflectoring.buckpal.domain.Activity;
import io.reflectoring.buckpal.domain.Activity.ActivityId;
import io.reflectoring.buckpal.domain.Money;
import io.reflectoring.buckpal.account.domain.Account.AccountId;
import io.reflectoring.buckpal.account.domain.Activity;
import io.reflectoring.buckpal.account.domain.Activity.ActivityId;
import io.reflectoring.buckpal.account.domain.Money;
public class ActivityTestData {