-
Notifications
You must be signed in to change notification settings - Fork 2
/
Product.java
96 lines (76 loc) · 3.32 KB
/
Product.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package dddes.example.domain.product;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;
import dddes.core.AggregateRoot;
import dddes.example.domain.backlogitem.BacklogItem;
import dddes.example.domain.product.events.ProductBacklogItemPlanned;
import dddes.example.domain.product.events.ProductBacklogItemPositionChanged;
import dddes.example.domain.product.events.ProductCreated;
import dddes.example.domain.product.events.ProductRenamed;
import dddes.example.infrastructure.Strings;
public final class Product extends AggregateRoot<String> {
private String name;
Product() {}
public Product(String id, String name) {
Strings.requireNonNullOrWhitespace(id, "id");
Strings.requireNonNullOrWhitespace(name, "name");
applyChange(new ProductCreated(id, name.trim()));
}
public String getName() {
return name;
}
public void rename(String newName) {
Strings.requireNonNullOrWhitespace(newName, "newName");
if (!this.name.equals(newName))
applyChange(new ProductRenamed(newName));
}
public void planBacklogItem(BacklogItem backlogItem) {
Objects.requireNonNull(backlogItem, "backlogItem can't be null");
if (entityExists(backlogItem.getId()))
throw new IllegalArgumentException("BacklogItem \"" + backlogItem.getTitle() + "\" is already planned");
applyChange(new ProductBacklogItemPlanned(backlogItem.getId(), (int) getPlannedBacklogItems().count()));
}
public void reorderBacklogItems(String... backlogItemIds) {
Objects.requireNonNull(backlogItemIds);
reorderBacklogItems(Arrays.asList(backlogItemIds));
}
public void reorderBacklogItems(List<String> backlogItemIds) {
Objects.requireNonNull(backlogItemIds, "backlogItemIds must be not null");
getPlannedBacklogItems().forEach(backlogItem -> {
int newPosition = backlogItemIds.indexOf(backlogItem.getId());
if (newPosition == -1) throw new IllegalArgumentException("Backlog item not found: " + backlogItem.getId());
if (newPosition != backlogItem.getPosition())
applyChange(new ProductBacklogItemPositionChanged(backlogItem.getId(), newPosition));
});
}
public Stream<ProductBacklogItem> getPlannedBacklogItems() {
return getEntities()
.filter(x -> x instanceof ProductBacklogItem)
.map(x -> (ProductBacklogItem)x)
.sorted(productBacklogItemPositionComparator);
}
// Protected methods called via reflection by infrastructure
protected void on(ProductCreated e) {
setId(e.getAggregateRootId());
name = e.getName();
}
protected void on(ProductRenamed e) {
name = e.getName();
}
protected void on(ProductBacklogItemPlanned e) {
addEntity(new ProductBacklogItem(e.getEntityId(), e.getPosition()), true);
}
protected void on(ProductBacklogItemPositionChanged e) {
ProductBacklogItem item = findEntityById(e.getEntityId());
item.setPosition(e.getPosition());
}
private final Comparator<ProductBacklogItem> productBacklogItemPositionComparator = new Comparator<ProductBacklogItem>() {
@Override
public int compare(ProductBacklogItem a, ProductBacklogItem b) {
return Integer.compare(a.getPosition(), b.getPosition());
}
};
}