Skip to content

Commit 0e15e13

Browse files
committed
BAEL-2274 DDD Bounded Contexts and Java Modules
1 parent d345e19 commit 0e15e13

31 files changed

Lines changed: 956 additions & 0 deletions

File tree

ddd-modules/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
## Relevant Articles

ddd-modules/infrastructure/pom.xml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.baeldung.dddmodules.infrastructure</groupId>
6+
<artifactId>infrastructure</artifactId>
7+
<version>1.0</version>
8+
9+
<packaging>jar</packaging>
10+
11+
<parent>
12+
<groupId>com.baeldung.dddmodules</groupId>
13+
<artifactId>dddmodules</artifactId>
14+
<version>1.0</version>
15+
</parent>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>com.baeldung.dddmodules.shippingcontext</groupId>
20+
<artifactId>shippingcontext</artifactId>
21+
<version>${appmodules.version}</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>com.baeldung.dddmodules.ordercontext</groupId>
25+
<artifactId>ordercontext</artifactId>
26+
<version>${appmodules.version}</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>com.baeldung.dddmodules.sharedkernel</groupId>
30+
<artifactId>sharedkernel</artifactId>
31+
<version>${appmodules.version}</version>
32+
</dependency>
33+
</dependencies>
34+
35+
<build>
36+
<plugins>
37+
<plugin>
38+
<groupId>org.apache.maven.plugins</groupId>
39+
<artifactId>maven-compiler-plugin</artifactId>
40+
<configuration>
41+
<source>${source.version}</source>
42+
<target>${target.version}</target>
43+
</configuration>
44+
</plugin>
45+
</plugins>
46+
</build>
47+
48+
<properties>
49+
<source.version>9</source.version>
50+
<target.version>9</target.version>
51+
</properties>
52+
53+
</project>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.baeldung.dddmodules.infrastructure.db;
2+
3+
import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
4+
import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
5+
import com.baeldung.dddmodules.shippingcontext.model.PackageItem;
6+
import com.baeldung.dddmodules.shippingcontext.model.ShippableOrder;
7+
import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
8+
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Optional;
13+
import java.util.stream.Collectors;
14+
15+
public class InMemoryOrderStore implements CustomerOrderRepository, ShippingOrderRepository {
16+
private Map<Integer, PersistenceOrder> ordersDb = new HashMap<>();
17+
private volatile static InMemoryOrderStore instance = new InMemoryOrderStore();
18+
19+
@Override
20+
public void saveCustomerOrder(CustomerOrder order) {
21+
this.ordersDb.put(order.getOrderId(), new PersistenceOrder(order.getOrderId(),
22+
order.getPaymentMethod(),
23+
order.getAddress(),
24+
order
25+
.getOrderItems()
26+
.stream()
27+
.map(orderItem ->
28+
new PersistenceOrder.OrderItem(orderItem.getProductId(),
29+
orderItem.getQuantity(),
30+
orderItem.getUnitWeight(),
31+
orderItem.getUnitPrice()))
32+
.collect(Collectors.toList())
33+
));
34+
}
35+
36+
@Override
37+
public Optional<ShippableOrder> findShippableOrder(int orderId) {
38+
if (!this.ordersDb.containsKey(orderId)) return Optional.empty();
39+
PersistenceOrder orderRecord = this.ordersDb.get(orderId);
40+
return Optional.of(
41+
new ShippableOrder(orderRecord.orderId, orderRecord.orderItems
42+
.stream().map(orderItem -> new PackageItem(orderItem.productId,
43+
orderItem.itemWeight,
44+
orderItem.quantity * orderItem.unitPrice)
45+
).collect(Collectors.toList())));
46+
}
47+
48+
public static InMemoryOrderStore provider() {
49+
return instance;
50+
}
51+
52+
public static class PersistenceOrder {
53+
public int orderId;
54+
public String paymentMethod;
55+
public String address;
56+
public List<OrderItem> orderItems;
57+
58+
public PersistenceOrder(int orderId, String paymentMethod, String address, List<OrderItem> orderItems) {
59+
this.orderId = orderId;
60+
this.paymentMethod = paymentMethod;
61+
this.address = address;
62+
this.orderItems = orderItems;
63+
}
64+
65+
public static class OrderItem {
66+
public int productId;
67+
public float unitPrice;
68+
public float itemWeight;
69+
public int quantity;
70+
71+
public OrderItem(int productId, int quantity, float unitWeight, float unitPrice) {
72+
this.itemWeight = unitWeight;
73+
this.quantity = quantity;
74+
this.unitPrice = unitPrice;
75+
this.productId = productId;
76+
}
77+
}
78+
}
79+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.baeldung.dddmodules.infrastructure.events;
2+
3+
import com.baeldung.dddmodules.sharedkernel.events.ApplicationEvent;
4+
import com.baeldung.dddmodules.sharedkernel.events.EventBus;
5+
import com.baeldung.dddmodules.sharedkernel.events.EventSubscriber;
6+
7+
import java.util.Map;
8+
import java.util.Set;
9+
import java.util.concurrent.ConcurrentHashMap;
10+
import java.util.concurrent.CopyOnWriteArraySet;
11+
12+
public class SimpleEventBus implements EventBus {
13+
private final Map<String, Set<EventSubscriber>> subscribers = new ConcurrentHashMap<>();
14+
15+
@Override
16+
public <E extends ApplicationEvent> void publish(E event) {
17+
if (subscribers.containsKey(event.getType())) {
18+
subscribers.get(event.getType())
19+
.forEach(subscriber -> subscriber.onEvent(event));
20+
}
21+
}
22+
23+
@Override
24+
public <E extends ApplicationEvent> void subscribe(String eventType, EventSubscriber subscriber) {
25+
Set<EventSubscriber> eventSubscribers = subscribers.get(eventType);
26+
if (eventSubscribers == null) {
27+
eventSubscribers = new CopyOnWriteArraySet<>();
28+
subscribers.put(eventType, eventSubscribers);
29+
}
30+
eventSubscribers.add(subscriber);
31+
}
32+
33+
@Override
34+
public <E extends ApplicationEvent> void unsubscribe(String eventType, EventSubscriber subscriber) {
35+
if (subscribers.containsKey(eventType)) {
36+
subscribers.get(eventType).remove(subscriber);
37+
}
38+
}
39+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module com.baeldung.dddmodules.infrastructure {
2+
requires transitive com.baeldung.dddmodules.sharedkernel;
3+
requires transitive com.baeldung.dddmodules.ordercontext;
4+
requires transitive com.baeldung.dddmodules.shippingcontext;
5+
provides com.baeldung.dddmodules.sharedkernel.events.EventBus
6+
with com.baeldung.dddmodules.infrastructure.events.SimpleEventBus;
7+
provides com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository
8+
with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore;
9+
provides com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository
10+
with com.baeldung.dddmodules.infrastructure.db.InMemoryOrderStore;
11+
}

ddd-modules/mainapp/pom.xml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.baeldung.dddmodules.mainapp</groupId>
6+
<artifactId>mainapp</artifactId>
7+
<version>1.0</version>
8+
<packaging>jar</packaging>
9+
10+
<parent>
11+
<groupId>com.baeldung.dddmodules</groupId>
12+
<artifactId>dddmodules</artifactId>
13+
<version>1.0</version>
14+
</parent>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>com.baeldung.dddmodules.infrastructure</groupId>
19+
<artifactId>infrastructure</artifactId>
20+
<version>${appmodules.version}</version>
21+
</dependency>
22+
</dependencies>
23+
24+
<build>
25+
<plugins>
26+
<plugin>
27+
<groupId>org.apache.maven.plugins</groupId>
28+
<artifactId>maven-surefire-plugin</artifactId>
29+
<version>2.16</version>
30+
<configuration>
31+
<enableAssertions>true</enableAssertions>
32+
</configuration>
33+
</plugin>
34+
<plugin>
35+
<groupId>org.apache.maven.plugins</groupId>
36+
<artifactId>maven-compiler-plugin</artifactId>
37+
<version>${compiler.plugin.version}</version>
38+
<configuration>
39+
<source>${source.version}</source>
40+
<target>${target.version}</target>
41+
</configuration>
42+
</plugin>
43+
</plugins>
44+
</build>
45+
46+
<properties>
47+
<source.version>9</source.version>
48+
<target.version>9</target.version>
49+
</properties>
50+
51+
</project>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.baeldung.dddmodules.mainapp;
2+
3+
import com.baeldung.dddmodules.ordercontext.model.CustomerOrder;
4+
import com.baeldung.dddmodules.ordercontext.model.OrderItem;
5+
import com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
6+
import com.baeldung.dddmodules.ordercontext.service.OrderService;
7+
import com.baeldung.dddmodules.sharedkernel.events.EventBus;
8+
import com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
9+
import com.baeldung.dddmodules.shippingcontext.service.ShippingService;
10+
11+
import java.util.*;
12+
13+
public class Application {
14+
15+
public static void main(String args[]) {
16+
Map<Class<?>, Object> container = createContainer();
17+
OrderService orderService = (OrderService) container.get(OrderService.class);
18+
ShippingService shippingService = (ShippingService) container.get(ShippingService.class);
19+
shippingService.listenToOrderEvents();
20+
21+
CustomerOrder customerOrder = new CustomerOrder();
22+
int orderId = 1;
23+
customerOrder.setOrderId(orderId);
24+
List<OrderItem> orderItems = new ArrayList<OrderItem>();
25+
orderItems.add(new OrderItem(1, 2, 3, 1));
26+
orderItems.add(new OrderItem(2, 1, 1, 1));
27+
orderItems.add(new OrderItem(3, 4, 11, 21));
28+
customerOrder.setOrderItems(orderItems);
29+
customerOrder.setPaymentMethod("PayPal");
30+
customerOrder.setAddress("Full address here");
31+
orderService.placeOrder(customerOrder);
32+
33+
if (orderId == shippingService.getParcelByOrderId(orderId).get().getOrderId()) {
34+
System.out.println("Order has been processed and shipped successfully");
35+
}
36+
}
37+
38+
public static Map<Class<?>, Object> createContainer() {
39+
EventBus eventBus = ServiceLoader.load(EventBus.class).findFirst().get();
40+
CustomerOrderRepository customerOrderRepository = ServiceLoader.load(CustomerOrderRepository.class).findFirst().get();
41+
ShippingOrderRepository shippingOrderRepository = ServiceLoader.load(ShippingOrderRepository.class).findFirst().get();
42+
ShippingService shippingService = ServiceLoader.load(ShippingService.class).findFirst().get();
43+
shippingService.setEventBus(eventBus);
44+
shippingService.setOrderRepository(shippingOrderRepository);
45+
OrderService orderService = ServiceLoader.load(OrderService.class).findFirst().get();
46+
orderService.setEventBus(eventBus);
47+
orderService.setOrderRepository(customerOrderRepository);
48+
HashMap<Class<?>, Object> container = new HashMap<>();
49+
container.put(OrderService.class, orderService);
50+
container.put(ShippingService.class, shippingService);
51+
return container;
52+
}
53+
54+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module com.baeldung.dddmodules.mainapp {
2+
uses com.baeldung.dddmodules.sharedkernel.events.EventBus;
3+
uses com.baeldung.dddmodules.ordercontext.service.OrderService;
4+
uses com.baeldung.dddmodules.ordercontext.repository.CustomerOrderRepository;
5+
uses com.baeldung.dddmodules.shippingcontext.repository.ShippingOrderRepository;
6+
uses com.baeldung.dddmodules.shippingcontext.service.ShippingService;
7+
requires transitive com.baeldung.dddmodules.infrastructure;
8+
}

ddd-modules/ordercontext/pom.xml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<groupId>com.baeldung.dddmodules.ordercontext</groupId>
6+
<artifactId>ordercontext</artifactId>
7+
<version>1.0</version>
8+
<packaging>jar</packaging>
9+
10+
<parent>
11+
<groupId>com.baeldung.dddmodules</groupId>
12+
<artifactId>dddmodules</artifactId>
13+
<version>1.0</version>
14+
</parent>
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>com.baeldung.dddmodules.sharedkernel</groupId>
19+
<artifactId>sharedkernel</artifactId>
20+
<version>${appmodules.version}</version>
21+
</dependency>
22+
</dependencies>
23+
24+
<build>
25+
<plugins>
26+
<plugin>
27+
<groupId>org.apache.maven.plugins</groupId>
28+
<artifactId>maven-compiler-plugin</artifactId>
29+
<configuration>
30+
<source>${source.version}</source>
31+
<target>${target.version}</target>
32+
</configuration>
33+
</plugin>
34+
</plugins>
35+
</build>
36+
37+
<properties>
38+
<source.version>9</source.version>
39+
<target.version>9</target.version>
40+
<entitymodule.version>1.0</entitymodule.version>
41+
<daomodule.version>1.0</daomodule.version>
42+
</properties>
43+
44+
</project>

0 commit comments

Comments
 (0)